我们已经非常成功地使用 pm2在服务器上运行应用程序。我们目前正在移动到码头,我们看到 http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/
但是实际上两者一起使用有什么意义呢? 难道 Docker 不提供 pm2所做的一切吗?
更新:
你可能不赞成在 Docker 中使用 pm2,但有时应用程序的要求不同,你可能需要在一个 Docker 容器中运行 两个 nodejs 应用程序,所以如果你想在同一个容器中运行前端和后端应用程序,那么在这种情况下 pm2工作得很好,然后其他的解决方案。
现在我们有了在 前景中运行 docker 进程的 一个 href = “ http://pm2.keymetics.io/docs/using/docker-pm2-nodejs/”rel = “ noReferrer”> pm2-running ,您的应用程序将使用 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之上的监控服务,它允许 方便地监视和管理应用程序(记录、重新启动、异常) 一旦你在键盘指标上创建了一个桶,你会得到一个 公开的和秘密的钥匙。
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 服务器崩溃,这里会发生什么?在这种情况下,你的集装箱会被杀死。哪一个应该避免这样做。
node start server.js
只要 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可能是控制工人调度的唯一选择。