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

时间:2018-07-05 12:30:45

标签: docker pm2

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

但是同时使用两者又有什么意义呢?码头工人不提供pm2所做的一切吗?

2 个答案:

答案 0 :(得分:12)

通常,在docker内部使用pm2毫无意义。

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

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

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

3)对一个PM2流程进行健康检查的请求将分配给可能隐藏不健康目标的工作人员

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

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

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

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

答案 1 :(得分:6)

根据经验,每个容器只有一个进程。因此请牢记这一点,就像在没有docker的情况下一样,您使用node start server.js在容器内启动过程。如果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

supervisord.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