我们已经成功地使用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可能是控制工人调度的唯一选择。
Adi*_*iii 11
更新:
您可能不赞成在Docker中使用pm2,但有时应用程序要求有所不同,您可能需要在一个Docker容器中运行两个nodejs应用程序,因此,如果要在同一个容器中运行前端和后端应用程序, pm2的情况要比其他解决方法好。
所以现在我们有了pm2-runtime,它在前台运行docker进程,您的应用程序将在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)
| 归档时间: |
|
| 查看次数: |
8902 次 |
| 最近记录: |