Docker 与 PM2:Node.js 服务部署的自动重启策略比较

在容器化技术日益普及的今天,Docker 已成为部署 Node.js 服务的常用选择。

同时,PM2 作为一个进程管理工具,也常被用于管理 Node.js 进程。

两者都提供了进程崩溃时的自动重启功能。

docker 重启

写个 dockerfile:

dockerfile 复制代码
FROM node:18-alpine

WORKDIR /app

COPY ./index.js .

CMD ["node", "/app/index.js"]

写如下代码:

打包镜像:

dockerfile 复制代码
docker build -t restart-test:v1.0 .

运行镜像:

dockerfile 复制代码
docker run -d --name=restart-test-container restart-test:v1.0

1s 之后,容器就停掉了。

我们可以在 docker run 的时候通过 --restart 指定重启策略:

bash 复制代码
docker run -d --restart=always --name=restart-test-container2 restart-test:v1.0

always 总是尝试重启容器。

打印了很多次错误日志:

你可以点击停止,就不会再重启了。

--restart 还有一些参数:

  1. no:这是默认的重启策略。当容器退出时,不会尝试重启它。
  2. on-failure::仅在容器非正常退出时自动重启。可以指定重启次数,如 on-failure:3 表示最多重启三次。
  3. unless-stopped:除非手动停止,否则容器总是自动重启。与 always 类似,但区别在于当 Docker 守护进程重启时,unless-stopped 策略的容器不会自动重启。

pm2 重启

新建 pm2.Dockerfile:

dockerfile 复制代码
FROM node:18-alpine

WORKDIR /app

COPY ./index.js .

RUN npm install -g pm2

CMD ["pm2-runtime", "/app/index.js"]

然后 build 一下,生成镜像:

bash 复制代码
docker build -t restart-test:v2.0 -f pm2.Dockerfile .

然后跑一下:

bash 复制代码
docker run -d --name=restart-test-container3 restart-test:v2.0

这时候会发现容器一直是运行状态,但是内部的进程一直在重启:

也就是说,Docker 的自动重启功能和 PM2 的自动重启功能是重合的。

选择哪个重启

在大多数情况下,使用 Docker 的自动重启功能已经足够满足需求,无需再使用 PM2。特别是当使用容器编排工具(如Kubernetes)时,更倾向于让容器编排工具来管理容器的重启和调度。

如果只是 Docker 部署,可以考虑结合 pm2 来做进程的重启,可能会更快点。

docker compose 配置 restart

Docker Compose 是用于同时跑多个 Docker 容器的,它自然也支持 restart 的配置:

相关推荐
恋猫de小郭1 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
崔庆才丨静觅7 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60618 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了8 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅8 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅9 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅9 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment9 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
金刚猿9 小时前
01_虚拟机中间件部署_root 用户安装 docker 容器,配置非root用户权限
docker·中间件·容器
崔庆才丨静觅9 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端