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

49

我正在重构几个Node.js服务。它们所有以前都是在虚拟服务器上使用forever启动,如果进程崩溃,就会重新启动。

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

这样做是否正确?有什么好处或缺点吗?

3个回答

54

我的建议是不要使用容器内的进程监视器(如forever、pm2),而是使用Docker重启策略,通过--restart=always命令选项(或其他变体)实现。这更符合整体的Docker理念,并且应该与容器内进程监视非常相似,因为Docker容器启动速度非常快。

对于在容器内运行进程监视的最强支持者,我见过的是phusion baseimage-docker README,如果你想探索此主题的其他立场,请查看该文档。


3
使用Docker可以实现零停机部署,但是使用裸机的PM2,您也可以进行滚动式部署而无需负载均衡器。 - Nepoxx
28
只有在你将新的应用代码部署到正在运行的容器中而不是重新构建一个新的容器时,才能获得Docker旨在提供的大部分益处。在负载均衡器级别进行零停机。同时运行多个应用实例。 - Peter Lyons
1
另一个有趣的观点是:如果您使用PM2启动多个实例作为Web服务器,您将需要暴露N个主机端口并在负载平衡器上处理它,而不是PM2作为伪负载平衡器。太多的抽象。叹气 - John Culviner

22

尽管使用--restart=always作为安全机制是个好主意,但重启容器相对较慢(如在此处描述的简单Hello World Node服务器中需要5秒或更长时间),因此您可以使用forever之类的工具来最小化应用程序停机时间。

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


使用forever和restart两者会导致其他问题或冲突吗?我在这里阅读到(https://docs.docker.com/engine/admin/host_integration/#/using-a-process-manager),使用具有重启策略的进程管理器可能不是一个好主意。你试过两者同时使用吗? - Victor Ferreira
PM2有一个特定的二进制文件来处理Docker,所以应该没问题。请参阅http://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/#pm2-docker-helper。 - Haoliang Yu
Docker 不需要 5 秒以上来启动/重启,至少现在不需要了。我的容器在我的 MCB 笔记本电脑上启动时间小于 1 秒。但还是点个赞。 - The Onin

1

如果您在多个CPU的服务器上运行,则需要对Node进行群集设置。

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

除非您正在使用多个单CPU实例的服务器,否则我建议在生产中使用PM2。

与Docker相比,PM2的重新启动速度也更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接