Pm2和 docker 一起使用有什么意义?

我们已经非常成功地使用 pm2在服务器上运行应用程序。我们目前正在移动到码头,我们看到 http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/

但是实际上两者一起使用有什么意义呢? 难道 Docker 不提供 pm2所做的一切吗?

66283 次浏览

更新:

你可能不赞成在 Docker 中使用 pm2,但有时应用程序的要求不同,你可能需要在一个 Docker 容器中运行 两个 nodejs 应用程序,所以如果你想在同一个容器中运行前端和后端应用程序,那么在这种情况下 pm2工作得很好,然后其他的解决方案。

现在我们有了在 前景中运行 docker 进程的 一个 href = “ http://pm2.keymetics.io/docs/using/docker-pm2-nodejs/”rel = “ noReferrer”> pm2-running ,您的应用程序将使用 pm2运行前台,并且您可以期待与不使用 pm2运行相同的结果。

使用 pm2运行时间

  • 可以在 Docker 容器中运行多个节点应用程序
  • 现在可以在前台运行应用程序
  • 可以与 关键指标集成
  • 您可以生成自定义度量
  • 与没有 pm2但有 pm2的容器相同的行为具有这些优点。
  • 现在可以控制重新启动行为(如果进程崩溃,pm2将自动重新启动,如果禁用,则容器将终止)
  • 在像挂载这样的开发环境中,您不需要重新启动容器,只需重新启动 pm2进程 pm2 restart all,这将节省开发时间。
FROM node:alpine
RUN npm install pm2 -g
CMD ["pm2-runtime", "app.js"]

或者,如果您想在一个容器中运行多个节点应用程序,那么您可以 process.yml

FROM node:alpine
RUN npm install pm2 -g
CMD ["pm2-runtime", "process.yml"]

Yml 文件 您还可以创建 YAML 格式的 Ecossystem 文件:

这将允许容器运行多个已处理的 nodejs。

apps:
- script   : ./api.js
name     : 'api-app'
instances: 4
exec_mode: cluster
- script : ./worker.js
name   : 'worker'
watch  : true
env    :
NODE_ENV: development
env_production:
NODE_ENV: production

如果要使用 Keymetrics 运行。

Io 是一个构建在 PM2之上的监控服务,它允许 方便地监视和管理应用程序(记录、重新启动、异常) 一旦你在键盘指标上创建了一个桶,你会得到一个 公开的和秘密的钥匙。

enter image description here

FROM node:alpine
RUN npm install pm2 -g
CMD ["pm2-runtime", "--public", "XXX", "--secret", "YYY", "process.yml"]

禁用自动重启:

使用此标志,如果由于错误或异常而导致 nodejs 进程终止或停止,则容器将被终止。有时我们不 自动重新启动过程,但我们要重新启动容器。

FROM node:alpine
RUN npm install pm2 -g
CMD ["pm2-runtime","app.js","--no-autorestart"]


没有 pm2运行时

根据经验,每个容器只有一个进程。记住这一点,在容器内使用 node start server.js启动流程,就像在没有 docker 的情况下一样。如果 nodejs 服务器崩溃,这里会发生什么?在这种情况下,你的集装箱会被杀死。哪一个应该避免这样做。

只要 nodejs 服务器停止运行,您的容器就会被关闭,因为主进程将停止运行,而该进程应该作为容器的主进程出现在前台。

所以最终是 pm2,这就是你如何使用 pm2和监督记录一起实现的。

如果您还在寻找示例,这里是 dockerfile 和必需的配置文件。使用高山最轻量级的图像2 MB。

FROM alpine:3.7
COPY supervisord.conf /etc/supervisord.conf
#installing nodejs and supervisord
RUN apk add  --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.7/main/ \
--repository http://dl-cdn.alpinelinux.org/alpine/v3.7/community/ \
sudo supervisor nodejs>=8
RUN npm i pm2  -g
COPY pm2.conf  /etc/supervisord.d/pm2.conf

会议主管

[unix_http_server]
file = /tmp/supervisor.sock
chmod = 0777
chown= nobody:nogroup


[supervisord]
logfile = /tmp/supervisord.log
logfile_maxbytes = 50MB
logfile_backups=10
loglevel = info
pidfile = /tmp/supervisord.pid
nodaemon = true
umask = 022
identifier = supervisor


[supervisorctl]
serverurl = unix:///tmp/supervisor.sock


[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface


[include]
files = /etc/supervisord.d/*.conf

Pm2.conf

    [supervisord]
nodaemon=true
    

[program:pm2]
command:pm2 start pm2_processes.yml --no-daemon
startretries:5


通常在 Docker 中使用 pm2是没有意义的。

PM2和 Docker 都是流程管理器,它们都可以执行日志转发、重新启动崩溃的工作人员和许多其他操作。如果您在一个 docker 容器中运行 pm2,那么您的服务将隐藏潜在的问题,至少可以这样做:

1)如果您使用 pm2对每个容器运行一个进程,除了增加内存消耗之外,您不会获得多少收益。重新启动可以完成与 重新启动政策纯码头。其他基于 Docker 的环境(如 ECS 或 Kubernetes)也可以这样做。

2)如果你运行多个进程,你会使监控更加困难。CPU/内存指标不再直接对您的封闭环境可用。

3)对单个 PM2过程的健康检查请求将在工人之间分发,这可能会隐藏不健康的目标

4)工作崩溃隐藏在 pm2中,你几乎不可能从你的监控系统(像 CloudWatch)中知道它们。

5)负载平衡变得更加复杂,因为你实际上将有多个级别的负载平衡。

在一个 docker 容器内运行多个进程也与 docker 的哲学相矛盾,即每个容器只保留一个进程。

我能想到的一个场景是,如果您对您的 Docker 环境的控制非常有限。在这种情况下,运行 pm2可能是控制工人调度的唯一选择。