一、安装
二、Node.js 应用 Docker 化
详细过程可参考: 把一个 Node.js web 应用程序给 Docker 化
即将一个 Node.js 的应用装入到 Docker 容器中,从而可以通过容器来运行这个应用。
准备 Dockerfile
在应用的根目录下创建一个 Dockerfile 文件,内容如下(假设你的 Node.js 代码不需要转换和打包,如使用了 typescript ):
# 指定基础镜像。从这个镜像开始构建,本地没有则拉取远程
FROM node:12
# 指定工作目录,没有则创建
WORKDIR /app
# 将源代码拷贝到容器的工作目录下
COPY . .
# 运行命令
RUN npm install --production # 安装运行依赖
# 指定应用使用端口
EXPOSE 8080
# 指定容器的启动命令
CMD [ "node", "server.js" ]
Docker 默认与镜像仓库使用 HTTPS 协议通信,如果需要拉取一些使用 HTTP 的内网私有仓库,则需要在 insecure-registries 中加入这个仓库地址。在 docker desktop 页面中配置如下:
构建镜像
在应用的根目录下运行以下命令,它将根据上面的 Dockerfile 进行构建。
docker build . -t my-app # -t 指定构建镜像的名称
即以
node:12这个镜像为基础,将应用代码拷贝到镜像中,安装依赖,并指定启动容器的默认命令,这样我们就构建出了一个可以启动这个 Node.js 应用的新镜像!镜像里包含了我们的应用以及应用运行的环境。在 Docker Hub 上有非常多的高质量的官方镜像,我们可以将它们作为基础镜像来构建我们需要的新镜像。
启动容器
使用下面的命令来启动一个应用容器:
docker run -p 49160:8080 -d my-app
# -p 可以将本机的端口映射到容器的端口。如容器中应用运行的端口是8080,而我们想要开放的端口是49160,就可以通过 -p 49160:8080 来映射
# -d 指定容器在后台运行
# my-app 是镜像名称,也可以使用 IMAGE ID
如果需要传入环境变量,则可以运行下面的命令:
docker run --env-file env.file -p 49160:8080 -d my-app
# --env-file 读取环境变量文件
进入镜像调试
如果容器启动失败,那么我们可能需要进入到镜像中看它是否正确。运行如下命令:
docker run -it --entrypoint="/bin/bash" my-app
# -it:获取交互式终端,通俗的说就是把容器内部的终端与当前的终端连接,与 -it 相反的是 -d 后台运行,不占用当前终端
# --entrypoint="/bin/bash": 指定启动入口
# my-app 是镜像名称
打印应用日志
# 查看运行的容器
docker ps
# 打印容器应用日志
docker logs <container-name>
如果需要进入到容器中,那么可以运行以下命令:
docker exec -it <container-name> /bin/bash
多级构建(Typescript 应用)
以一个 Typescript 应用为例,与前面不同的是,它需要先进行代码转换和打包,将 TS 语法转换为 JS,然后才能正常运行。
这里使用了多级构建,即先使用一个镜像来专门做打包,之后再用另一个镜像来运行应用。这样做的好处时可以让最后构建的 Docker 镜像体积小一点。Dockerfile 如下:
# 指定用于打包的基础镜像
FROM somerepo/node:17 as builder
# 指定工作目录,没有则创建
WORKDIR /app
# 将源代码拷贝到容器的工作目录下
COPY . .
# 运行命令
RUN yarn # 安装依赖(包括 dependencies 和 devDependencies 中的依赖)
RUN yarn build # 打包
# 指定用于运行应用的基础镜像
FROM somerepo/node:17
COPY --from=builder /app/dist /app/ # 将前面镜像打包后的文件拷贝到当前镜像中
COPY --from=builder /app/package.json /app/ # 拷贝前面镜像中的 package.json 文件
COPY --from=builder /app/yarn.lock /app/ # 拷贝前面镜像中的 yarn.lock 文件
# 指定工作目录
WORKDIR /app
# 安装运行时依赖 (只包括 dependencies 中的依赖)
RUN yarn --production
EXPOSE 8080
CMD ["node", "dist/main.js"]
三、Web 前端应用 Docker 化
即将 Web 前端应用进行打包构建,并将构建后的静态文件放入安装了 Web 服务器(如 Nginx)的 Docker 容器中。这样启动容器后就可以访问我们的静态文件了。
准备 Dockerfile
# 指定用于打包的基础镜像
FROM somerepo/node12 as builder
# 指定工作目录,没有则创建
WORKDIR /app
# 将源代码拷贝到容器的工作目录下
COPY . .
# 运行命令
RUN yarn
RUN yarn build
# 指定用于运行应用的基础镜像,以 Nginx 为例
FROM somerepo/nginx:latest
# 将前面镜像打包后的文件拷贝到当前镜像中
COPY --from=builder /app/build/ /usr/share/nginx/html
其他流程就与前面的差不多了~