单纯靠 docker run 无法实现平滑热更新,必须依赖编排工具与设计:开发用挂载+nodemon快速反馈,生产需镜像更新+docker-compose滚动替换+健康检查+优雅关闭,Watchtower仅适用于非核心场景。
单纯靠 docker run 命令无法实现平滑热更新与重启——它只负责单次启动一个容器,没有版本管理、健康检查、滚动替换或服务编排能力。真正的“平滑更新”必须依赖更高层的工具和设计,核心是避免停机、保障流量不中断、新旧实例有序交替。
开发环境:用挂载 + nodemon 实现代码修改即重启
这不是生产级热更新,而是本地快速反馈的开发模式:
- 用
-v $(pwd):/app把当前代码目录挂载进容器,文件变更实时可见 - Dockerfile 中不 COPY node_modules,避免覆盖挂载内容
- 安装
nodemon为 devDependency,package.json加脚本:"dev": "nodemon app.js" - 启动命令示例:
docker run -it -p 3000:3000 -v $(pwd):/app node:18-alpine npm run dev -
注意:nodemon 默认不监听
node_modules和隐藏文件,需配nodemon.json扩展监听范围
生产环境:必须走镜像更新 + 编排工具滚动替换
生产中禁止挂载源码、禁用 nodemon。所谓“热更新”,实为零停机部署:
- 每次代码变更后,CI 流水线构建新镜像(如
myapp:v1.2.4或带 commit hash 的标签) - 在
docker-compose.yml中配置deploy策略,启用滚动更新能力 - 关键配置项:
parallelism: 1(每次只换一个副本)、delay: 10s(等新容器就绪再换下一个)、order: start-first(先启新、再停旧) - 必须配
healthcheck,确保新容器真正可用才切流量,例如:test: ["CMD", "curl", "-f", "http://localhost:3000/health"] - 执行更新:
docker-compose up -d --no-deps web(仅更新 web 服务,不重建依赖)
Node.js 应用自身要支持优雅关闭
容器收到 SIGTERM 信号时,应用不能立刻退出,否则正在处理的请求会中断:
- 监听
process.on('SIGTERM', ...)和'SIGINT' - 调用
server.close()停止接收新连接 - 等待已有连接完成(可设超时,如 30 秒),再
process.exit(0) - 若使用 Express,可结合
http.Server的close事件和连接计数器
小项目可选 Watchtower 自动拉取更新
适合测试环境或边缘设备,不推荐用于核心生产服务:
- 运行 Watchtower 容器:
docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --interval 300 - 它每 5 分钟检查一次镜像仓库,发现新标签自动拉取并重启对应容器
- 风险提示:无健康检查、无回滚、无灰度控制,更新失败可能导致服务不可用
- 务必配合
restart: unless-stopped和资源限制(--memory=512m --cpus=1.0)防止失控


















