我正在重构几个node.js服务。所有这些都曾经在虚拟服务器上以forever
开头,如果进程崩溃,他们只是重新启动。
现在,转向容器化和无状态应用程序结构,我认为该进程应该退出,并且容器应该在失败时重新启动。
这是对的吗?有利有弊吗?
答案 0 :(得分:46)
我的看法是不要使用容器内进程管理程序(永远,pm2),而是通过--restart=always
(或该选项的其他一种)使用docker restart策略。这更符合整体码头工作者的理念,并且应该与集装箱内过程监控非常相似,因为码头集装箱容易开始快速运行。
如果你想探讨关于这个话题的另一个立场,我已经看到了phusion baseimage-docker README中最强烈的支持容器内流程监督的倡导者。
答案 1 :(得分:18)
尽管使用--restart=always
作为故障保护是个好主意,但容器重启速度相对较慢(简单的Hello World节点服务器描述here为5秒以上),因此您可以尽量减少使用forever
等内容进行应用停机。
在容器内重新启动进程的缺点是崩溃恢复现在可以以两种方式发生,这可能会对您的监控等产生影响。
答案 2 :(得分:0)
如果您在具有多个CPU的服务器上运行,则节点需要集群设置。
有了PM2,您无需编写任何额外的代码就可以实现这一点。 http://pm2.keymetrics.io/docs/usage/cluster-mode/
除非您使用的是一堆具有单个CPU实例的服务器,否则我会说在生产环境中使用PM2。
pm2也将比docker更快重启