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

问题描述 投票:6回答:2

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

但是实际使用它们有什么意义呢? docker不提供pm2的所有功能吗?

docker pm2
2个回答
14
投票

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

PM2和Docker都是流程管理员,他们都可以进行日志转发,重启崩溃的工作人员和许多其他事情。如果你在docker中运行pm2,你将隐藏服务的潜在问题,至少如下:

1)如果你使用pm2为每个容器运行单个进程,除了内存消耗增加之外你不会获得太多收益。重新启动可以使用带有restart policy的纯船坞。其他基于docker的环境(如ECS或Kubernetes)也可以这样做。

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

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

4)工作人员崩溃被pm2隐藏,你很难从你的监控系统(如CloudWatch)了解它们

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

在docker容器内运行多个进程也与docker的理念相矛盾,即每个容器保持一个进程。

我能想到的一个场景是你对docker环境的控制非常有限。在这种情况下,运行pm2可能是控制工作程序调度的唯一选项。


6
投票

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

每当nodejs服务器关闭时,您的容器都将被终止,因为主进程将关闭,并且该进程应该在前台作为容器的主进程。

所以最终有pm2。这就是你如何使用pm2和supervisord来实现这一目标的方法。

如果您还在寻找示例,请参阅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
© www.soinside.com 2019 - 2024. All rights reserved.