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

Joh*_*ohn 21 docker pm2

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

但是,将两者一起使用的意义何在?码头工人不提供pm2所做的一切吗?

evg*_*hev 41

通常在docker内部使用pm2是没有意义的。

PM2和Docker都是流程管理器,它们都可以执行日志转发,重新启动崩溃的工作程序以及许多其他事情。如果在docker内部运行pm2,则至少会隐藏服务的潜在问题:

1)如果您使用pm2在每个容器上运行单个进程,则除了增加内存消耗之外,您不会获得太多收益。可以使用具有重新启动策略的纯docker 重新启动。其他基于docker的环境(例如ECS或Kubernetes)也可以做到这一点。

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

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

4)pm2隐藏了工伤事故,您几乎不会从监视系统(如CloudWatch)中了解工伤事故

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

在docker容器内运行多个进程也与docker的理念相反,即每个容器仅保留一个进程。

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

  • 我唯一可以补充的是,“Top 4 Tactics To Keep Node.js Rockin' in Docker” https://www.docker.com/blog/keep-nodejs-rockin-in-docker/ 也建议不要使用 pm2码头工人里面。 (6认同)

Adi*_*iii 11

更新:

您可能不赞成在Docker中使用pm2,但有时应用程序要求有所不同,您可能需要在一个Docker容器中运行两个nodejs应用程序,因此,如果要在同一个容器中运行前端和后端应用程序, pm2的情况要比其他解决方法好。

所以现在我们有了pm2-runtime,它在前台运行docker进程,您的应用程序将在pm2上运行前台,并且您可以期望得到与不使用pm2相同的结果。

所以有了pm2的运行时间

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

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

FROM node:alpine
RUN npm install pm2 -g
CMD ["pm2-runtime", "process.yml"]
Run Code Online (Sandbox Code Playgroud)

process.yml文件 您还可以创建YAML格式的Ecosystem文件。例:

这将允许容器运行多个已处理的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
Run Code Online (Sandbox Code Playgroud)

如果要与Keymetrics一起运行。

Keymetrics.io是建立在PM2之上的一项监视服务,可轻松监视和管理应用程序(日志,重新启动,异常监视……)。在Keymetrics上创建存储桶后,您将获得一个公共密钥和一个秘密密钥。

在此处输入图片说明

FROM node:alpine
RUN npm install pm2 -g
CMD ["pm2-runtime", "--public", "XXX", "--secret", "YYY", "process.yml"]
Run Code Online (Sandbox Code Playgroud)

禁用自动重启:

如果该nodejs进程因错误或异常而被杀死或停止,则使用此标志可以杀死该容器。有时我们不会自动重新启动该过程,但希望重新启动容器。

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

Run Code Online (Sandbox Code Playgroud)

没有pm2运行时

根据经验,每个容器只有一个进程。因此请牢记这一点,您可以node start server.js像在没有docker的情况下那样在容器内启动进程。如果nodejs服务器崩溃,在这里会发生什么?在这种情况下,您的容器将被杀死。哪个应该避免这样做。

每当nodejs服务器发生故障时,您的容器都会被杀死,因为主进程将发生故障,并且该进程应作为容器的主进程处于前台。

所以最终会有pm2。这是您可以使用pm2和supervisor一起实现的方法。

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

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
Run Code Online (Sandbox Code Playgroud)

主管

[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
Run Code Online (Sandbox Code Playgroud)

pm2.conf

    [supervisord]
    nodaemon=true

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

Run Code Online (Sandbox Code Playgroud)

  • “哪一个应该避免这样做。” Docker Swarm可以解决这个问题 (7认同)
  • 是的,你可以忽略它,它与“pm2 start server.Js”相同。您可以在此处阅读有关 yml 配置的信息 http://pm2.keymetrics.io/docs/usage/application-declaration/ (2认同)