Docker 集成 Docker Integration

Docker 中的无缝 PM2 集成

Docker PM2 Node.js

Docker 集成

使用容器? 我们支持你。 从今天开始使用 pm2-runtime,它是在生产环境中充分利用 Node.js 的完美伴侣。

pm2-runtime 的目标是将您的应用程序包装到适当的 Node.js 生产环境中。 它解决了在容器内运行 Node.js 应用程序时遇到的主要问题,例如:

  • 高应用程序可靠性的第二个过程回退
  • 流程控制
  • 自动应用程序监控,使其始终保持理智和高性能
  • 自动 Source Map 发现和解析支持

更进一步,使用 PM2 作为容器和应用程序之间的层,带来了 PM2 强大的功能,如应用程序声明文件可定制的日志系统 和其他强大的功能来管理生产环境中的 Node.js 应用程序。

在容器中使用 PM2

在您的 Dockerfile 中添加此行以安装 PM2:

docker
bash
RUN npm install pm2 -g

Then replace the node binary with pm2-runtime

docker
bash
CMD ["node", "app.js"]

to:

docker
bash
CMD ["pm2-runtime", "app.js"]

现在一切就绪!
您的 Node.js 应用程序现已包装到适当的 Node.js 生产环境中。

启动配置文件

您可以将其声明到配置文件(或进程文件)中并设置一些配置变量,例如启用集群模式,而不是使用 PM2 运行原始 Node.js 应用程序。

让我们创建一个包含以下内容的 ecosystem.config.js 文件:

js
module.exports = [{
  script: 'app.js',
  name: 'app',
  exec_mode: 'cluster',
  instances: 2
}, {
  script: 'worker.js',
  name: 'worker'
}]

所有可用的选项都在此处列出

然后,您可以将 CMD 指令替换为:

bash
CMD ["pm2-runtime", "process.yml"]

要在其自己的 Docker 中拆分每个进程,您可以使用 --only [app-name] 选项:

bash
CMD ["pm2-runtime", "process.yml", "--only", "APP"]

将 exec_mode 集群与 nuxtjs 一起使用

在集群模式下运行 pm2 时,由于 nuxtjs 如何解析其 rootDir,ecosystem.config.js 将附加到您的 cwd 路径,以解决您必须在 args 部分指定配置路径的问题:

js
module.exports = {
  apps: [
    {
      name: 'my-nuxtjs-app',
      exec_mode: 'cluster',
      instances: 2,
      cwd: '/var/www',
      script: './node_modules/nuxt-start/bin/nuxt-start.js',
      args: '-c /var/www/nuxt.config.js'
    }
  ]
}

日志记录格式选项

如果您想更改日志输出格式,您可以选择以下选项之一:

  • --json: 将以 JSON 格式输出日志 (logstash)
  • --format: 将以=样式格式输出日志
  • --raw:将按原样输出日志

要使用其中一个标志,您只需将它们传递给 pm2-runtime:

bash
CMD ["pm2-runtime", "--json", "process.yml"]

启用优雅关机

当 Container 收到关闭信号时,PM2 将此信号转发给您的应用程序,允许关闭所有数据库连接,等待所有查询都已处理或任何其他最终处理已完成,然后才能成功正常关闭。

捕获关闭信号很简单。 您需要在 Node.js 应用程序中添加一个侦听器并在停止应用程序之前执行任何需要的操作:

js
process.on('SIGINT', () => {
  db.stop((err) => {
    process.exit(err ? 1 : 0)
  })
})

默认情况下,PM2 将等待 1600 毫秒,然后发送最终的 SIGKILL 信号。 您可以通过在应用程序配置文件中设置“kill_timeout”选项来修改此延迟。

此处 阅读有关应用程序状态管理的更多信息

开发环境

您可能希望告诉开发人员在容器内进行编程,以在开发、测试和生产之间保持一致的环境。

pm2-runtime 替换为 pm2-dev 将启用监视和重启功能。 当主机文件作为 VOLUME 暴露给容器时,这在开发容器中非常有趣。

使用 PM2.io

Keymetrics.io 是一个建立在 PM2 之上的监控服务,可以轻松监控和管理应用程序(日志、重启、异常监控......)。 在 Keymetrics 上创建 Bucket 后,您将获得一个公钥和一个私钥。

要使用 pm2-runtime 启用Keymetrics监控,您可以使用 CLI 选项--public XXX--secret YYY或传递环境变量KEYMETRICS_PUBLICKEYMETRICS_SECRET

通过 Dockerfile 使用 CLI 选项的示例:

bash
CMD ["pm2-runtime", "--public", "XXX", "--secret", "YYY", "process.yml"]

或者通过环境变量:

ENV PM2_PUBLIC_KEY=XXX
ENV PM2_SECRET_KEY=YYY

或者通过 Docker 运行命令:

docker run --net host -e "PM2_PUBLIC_KEY=XXX" -e "PM2_SECRET_KEY=XXX" <...>

pm2-运行时助手

这是 pm2-runtime 助手:

bash
>>> pm2-runtime -h

  Usage: pm2-runtime app.js

  pm2-runtime is a drop-in replacement node.js binary with some interesting production features

  Options:

    -V, --version              # 输出版本号
    -i --instances <number>    # 启动 [number] 个自动负载平衡的进程。 提高整体性能和性能稳定性。
    --secret [key]             # [监控] keymetrics 密钥
    --public [key]             # [监控] keymetrics 公钥
    --machine-name [name]      # [MONITORING] keymetrics 机器名称
    --raw                      # 原始日志输出
    --json                     # 以json格式输出日志
    --format                   # 输出日志格式如 key=val
    --delay <seconds>          # 将配置文件的启动延迟 <seconds>
    --web [port]               # 在 [端口] 上启动进程 web api(默认为 9615)
    --only <application-name>  # 仅作用于配置的一个应用程序
    --no-auto-exit             # 如果所有进程都出错/停止或启动了 0 个应用程序,请不要退出
    --env [name]               # 在进程配置文件中注入 env_[name] 环境变量
    --watch                    # 在文件更改时观察并重新启动应用程序
    --error <path>             # 错误日志文件目标(默认禁用)
    --output <path>            # 输出日志文件目的地(默认禁用)
    -h, --help                 # 输出使用信息

  Commands:

    *
    start <app.js|json_file>  start an application or json ecosystem file