在生产环境中部署 Node 应用时,通常会通过 Docker 来进行统一管理。为了保证 Node 应用的可靠性,会使用 PM2 这样的工具来监控 Node 的应用进程。
image.png
node 服务在 Docker 部署示意图

下面简单介绍一下如何通过 Docker + PM2 + Jenkins 来部署一个 Node 应用。

一、配置 Dockerfile

编写 Node 应用的 Dockerfile ,示例内容如下:

  1. # FROM 代表有个基础镜像
  2. FROM node:10
  3. # 用来标识谁在维护这个项目
  4. LABEL maintainer=bgl_cumt_zju@163.com
  5. # 创建一个工作目录
  6. WORKDIR /app
  7. # 将当前目录下的所有文件或资源复制到镜像中。
  8. # 注:针对项目中的 node_modules 或 dist 目录等不需要拷贝到镜像的文件,可以借助.dockerignore
  9. COPY . .
  10. # 使用淘宝的镜像源进行加速
  11. RUN yarn install --registry=https://registry.npm.taobao.org
  12. # 产生 dist 目录,以及 server.bundle.js
  13. RUN yarn build
  14. # 全局安装PM2
  15. RUN npm install pm2 -g
  16. # EXPOSE 相当于暴露镜像的某个端口
  17. # 这里暴露一些服务端口,以便在宿主机去运行这个镜像的时候可以将其映射到宿主机上的端口
  18. EXPOSE 3000
  19. # 将 app 目录下的 public 目录挂载出来
  20. VOLUME [ "/app/public" ]
  21. # PM2 默认情况下会在后台运行,当在我们在 Docker 中使用 PM2 的时候,就不能让 PM2 在
  22. # 后台运行,否则容器会在 CMD 命令运行后立即退出
  23. CMD ["pm2", "start", "ecosystem.config.js", "--no-daemon"]

这里要注意:PM2 默认情况下会在后台运行,当在我们在 Docker 中使用 PM2 的时候,就不能让 PM2 在后台运行,否则容器会在 CMD 命令运行后立即退出。

二、配置 ecosystem.config.js

创建 pm2 的配置文件 ecosystem.config.js 。如果配置文件包含了一些敏感的环境变量,通常不会将其托管至版本仓库,示例内容如下:

  1. module.exports = {
  2. apps: [
  3. {
  4. script: './dist/server.bundle.js',
  5. name: 'log-server', // 应用名称
  6. error_file: 'err.log',
  7. out_file: 'out.log',
  8. // 环境变量,可通过 process.env 来进行调用查看
  9. env: {
  10. NODE_ENV: 'production',
  11. DB: 'mongodb://xxxxx@121.46.135.249:8000/log',
  12. SERVER_PORT: 3000,
  13. JWT_SECRET: 'ylhsbygeyld1269swwwettbjavfeaeoi93ilw3n',
  14. },
  15. },
  16. ],
  17. };

三、配置 Jenkins

由于配置文件 ecosystem.config.js 没有托管至版本仓库,所以在 Jenkins 中需单独创建这样的一个文件,具体创建过程可参考 在Jenkins中配置 .env 环境变量
企业微信20200616095214.png
至此,就完成了一个 Node 应用要部署时的所有配置。