在生产环境中部署 Node 应用时,通常会通过 Docker 来进行统一管理。为了保证 Node 应用的可靠性,会使用 PM2 这样的工具来监控 Node 的应用进程。
node 服务在 Docker 部署示意图
下面简单介绍一下如何通过 Docker + PM2 + Jenkins 来部署一个 Node 应用。
一、配置 Dockerfile
编写 Node 应用的 Dockerfile
,示例内容如下:
# FROM 代表有个基础镜像
FROM node:10
# 用来标识谁在维护这个项目
LABEL maintainer=bgl_cumt_zju@163.com
# 创建一个工作目录
WORKDIR /app
# 将当前目录下的所有文件或资源复制到镜像中。
# 注:针对项目中的 node_modules 或 dist 目录等不需要拷贝到镜像的文件,可以借助.dockerignore
COPY . .
# 使用淘宝的镜像源进行加速
RUN yarn install --registry=https://registry.npm.taobao.org
# 产生 dist 目录,以及 server.bundle.js
RUN yarn build
# 全局安装PM2
RUN npm install pm2 -g
# EXPOSE 相当于暴露镜像的某个端口
# 这里暴露一些服务端口,以便在宿主机去运行这个镜像的时候可以将其映射到宿主机上的端口
EXPOSE 3000
# 将 app 目录下的 public 目录挂载出来
VOLUME [ "/app/public" ]
# PM2 默认情况下会在后台运行,当在我们在 Docker 中使用 PM2 的时候,就不能让 PM2 在
# 后台运行,否则容器会在 CMD 命令运行后立即退出
CMD ["pm2", "start", "ecosystem.config.js", "--no-daemon"]
这里要注意:PM2 默认情况下会在后台运行,当在我们在 Docker 中使用 PM2 的时候,就不能让 PM2 在后台运行,否则容器会在 CMD 命令运行后立即退出。
二、配置 ecosystem.config.js
创建 pm2 的配置文件 ecosystem.config.js
。如果配置文件包含了一些敏感的环境变量,通常不会将其托管至版本仓库,示例内容如下:
module.exports = {
apps: [
{
script: './dist/server.bundle.js',
name: 'log-server', // 应用名称
error_file: 'err.log',
out_file: 'out.log',
// 环境变量,可通过 process.env 来进行调用查看
env: {
NODE_ENV: 'production',
DB: 'mongodb://xxxxx@121.46.135.249:8000/log',
SERVER_PORT: 3000,
JWT_SECRET: 'ylhsbygeyld1269swwwettbjavfeaeoi93ilw3n',
},
},
],
};
三、配置 Jenkins
由于配置文件 ecosystem.config.js
没有托管至版本仓库,所以在 Jenkins 中需单独创建这样的一个文件,具体创建过程可参考 在Jenkins中配置 .env 环境变量。
至此,就完成了一个 Node 应用要部署时的所有配置。