我应该在(Docker)容器中使用 forever/pm2 吗?
Posted
技术标签:
【中文标题】我应该在(Docker)容器中使用 forever/pm2 吗?【英文标题】:Should I use forever/pm2 within a (Docker) container? 【发布时间】:2015-05-10 15:28:59 【问题描述】:我正在重构几个 node.js 服务。所有这些都过去在虚拟服务器上以forever
开头,如果进程崩溃,它们只是重新启动。
现在,转向容器化和无状态应用程序结构,我认为进程应该退出并且容器应该在失败时重新启动。
正确吗?有好处还是坏处?
【问题讨论】:
【参考方案1】:如果您在具有多个 CPU 的服务器上运行,则节点需要集群设置。
使用 PM2,您无需编写任何额外代码即可实现这一目标。 http://pm2.keymetrics.io/docs/usage/cluster-mode/
除非您使用一堆具有单 CPU 实例的服务器,否则我会说在生产中使用 PM2。
pm2 也会比 docker 更快重启
【讨论】:
【参考方案2】:虽然使用--restart=always
作为故障保护是个好主意,但容器重启相对较慢(使用here 描述的简单Hello World Node 服务器需要5 秒以上),因此您可以使用@987654325 之类的方法最大限度地减少应用程序停机时间@。
在容器中重新启动进程的一个缺点是崩溃恢复现在可以两种方式发生,这可能会对您的监控等产生影响。
【讨论】:
同时使用(永远和重新启动)会导致其他问题或冲突吗?我在这里 (docs.docker.com/engine/admin/host_integration/#/…) 读到,使用带有重启策略的进程管理器可能不是一个好主意。你都试过了吗? PM2 有一个特定的二进制文件来处理 docker,所以应该没问题。见pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/… Docker 启动/重启不需要 5 多秒,至少现在不需要了。我的容器在我的 MCB 笔记本电脑上启动时间小于 1 秒。虽然仍然是 +1【参考方案3】:我的看法是不要使用容器内进程管理器(永远,pm2),而是通过--restart=always
(或该选项的其他风格之一)使用 docker restart 策略。这更符合 docker 的整体理念,并且应该与容器内进程监督非常相似,因为 docker 容器开始运行非常快。
如果您想探索关于此主题的其他立场,我见过的运行容器内进程监督的最强有力的倡导者是phusion baseimage-docker README。
【讨论】:
不过,使用 docker 会丢失零停机时间的部署。使用裸机 PM2,您无需负载均衡器即可进行滚动部署。 呃,只有当您部署到正在运行的容器中而不是使用新的应用程序代码重建新容器时,这会破坏 docker 旨在提供的大部分好处。在负载均衡器级别实现零停机时间。运行多个应用实例。 另一个有趣的点:如果您使用 PM2 启动多个实例作为 Web 服务器,您将需要暴露 N 个主机端口并在 LB 上处理这些端口,而不是 PM2 是伪磅。很多抽象。 叹息以上是关于我应该在(Docker)容器中使用 forever/pm2 吗?的主要内容,如果未能解决你的问题,请参考以下文章