我应该在 (Docker) 容器中使用 forever/pm2 吗?

Should I use forever/pm2 within a (Docker) container?

我正在重构几个 node.js 服务。它们过去都在虚拟服务器上以 forever 开头,如果进程崩溃,它们只会重新启动。

现在,转向容器化和无状态应用程序结构,我认为进程应该退出,容器应该在失败时重新启动。

对吗?有好处还是坏处?

我的做法是不使用容器内进程主管(永远,pm2),而是通过 --restart=always(或该选项的其他风格之一)使用 docker 重启策略.这更符合整体 docker 理念,并且应该与容器内进程监督非常相似,因为 docker 容器启动 运行 非常快。

我见过的 运行 容器内进程监督的最强有力的倡导者是 phusion baseimage-docker README 如果你想探索关于这个主题的其他立场。

虽然使用 --restart=always 作为故障保护是个好主意,但容器重启相对较慢(使用 here 描述的简单 Hello World Node 服务器需要 5 秒以上),因此您可以最小化应用程序使用 forever.

之类的停机时间

在容器内重新启动进程的一个缺点是崩溃恢复现在可以两种方式发生,这可能会对您的监控等产生影响

如果您 运行 在具有多个 CPU 的服务器上,节点需要集群设置。

使用 PM2,您无需编写任何额外代码即可实现。 http://pm2.keymetrics.io/docs/usage/cluster-mode/

除非您使用的是一堆具有单个 CPU 实例的服务器,否则我会说在生产中使用 PM2。

pm2 也将比 docker

更快地重新启动