镜像是只读模板,容器是其可写运行实例;开发用挂载+进程重载,生产用滚动更新替换镜像,配置需监听或对接配置中心,Watchtower仅适用于非核心环境的自动镜像更新。
镜像和容器是 docker 的两个基础概念:镜像是只读模板,包含运行应用所需的全部文件和依赖;容器是镜像的运行实例,具备独立的进程、网络和文件系统空间。热更新代码文件,本质上不是“让容器自动改镜像”,而是绕过镜像不可变性,在不同场景下用合适的方式让新代码生效。
开发环境:挂载源码 + 进程重载
不重建镜像,而是把本地代码目录通过 bind mount 挂载进容器,再用工具监听变化并重启进程:
- 在
docker-compose.yml中配置volumes: ["./src:/app/src"] - 容器内安装
nodemon(Node.js)、air(Go)或inotify-tools + bash 脚本(PHP/通用) - 启动命令设为
nodemon app.js或air,修改宿主机文件后自动触发编译与重启 - 注意避开挂载
node_modules或vendor等目录,避免权限或覆盖问题
部署环境:滚动更新 + 镜像替换
生产环境不允许挂载源码,必须靠新镜像替换旧容器,实现“零停机”而非“秒级刷新”:
- 每次代码变更后,CI 流水线构建带唯一标签的新镜像(如
myapp:v1.2.4) - 用
docker compose up -d --build或docker stack deploy推送新版本 - 在
deploy.update_config中设置parallelism: 1、delay: 10s、order: start-first - 应用需支持优雅关闭:监听
SIGTERM,处理完现有请求再退出
配置文件更新:不能靠 configs 热生效
Docker 的 configs 是只读挂载,容器运行中修改不会自动加载。可行路径有:
- 改用
volumes挂载配置目录,应用内用fs.watch或chokidar监听并主动重载 - 接入外部配置中心(如 Consul、Nacos),应用启动时拉取,变更时通过长轮询动态刷新
- Swarm 模式下可删旧 config、加新 config 并执行
docker service update,本质仍是滚动更新
小项目快速迭代:Watchtower 自动拉镜像
适合测试或边缘环境,不适用于生产核心服务:
- 运行 Watchtower 容器,挂载
/var/run/docker.sock - 给你的服务容器打标签:
--label=com.centurylinklabs.watchtower.enable=true - 确保新镜像推送时复用相同 tag(如
myapp:latest),Watchtower 会自动拉取并重启 - 注意:它不校验健康状态,也不做滚动控制,可能造成短暂中断


















