docker 无自动回滚功能,快速回滚本质是停新容器、启旧镜像;需做好镜像版本管理(禁用 latest、打语义化标签、预拉取)、用 docker compose 实现服务级一键切换、单容器四步标准化操作、脚本化加预检保障可靠性。

确保旧版镜像始终可用
回滚的前提是目标镜像(如 myapp:v2.3.0)已在本地存在,或能从私有/公共仓库稳定拉取。
- 不要依赖
latest标签——它不指向任何确定版本,无法用于精准回滚 - 每次发布必须打语义化标签(如
v2.3.0、v2.2.1),并推送到仓库 - 生产环境建议提前
docker pull myapp:v2.2.1,避免回滚时网络或仓库故障导致拉取失败
用 docker compose 实现服务级一键切换
单容器可手动操作,但真实服务往往含 web、db、cache 等多个组件。此时靠 docker run 逐个启停极易出错,docker compose 是更可靠的选择:
- 编辑
docker-compose.yml,只改对应服务的image:字段(例如从myapp:v2.3.0改为myapp:v2.2.1) - 执行:
docker compose down && docker compose up -d - Compose 自动处理依赖顺序、网络重建、卷挂载继承,且配置即文档,便于审计与复现
对单容器场景:四步标准化操作
若未使用 Compose,回滚需严格按顺序执行,缺一不可:
-
停容器:
docker stop myapp-web -
删容器(非必须,但推荐):
docker rm myapp-web(保留数据卷可加-v,否则卷会自动保留) -
启旧镜像:
docker run -d --name myapp-web -p 80:80 --restart unless-stopped myapp:v2.2.1 -
验状态:
docker logs -n 20 myapp-web+curl -f http://localhost/health(建议集成健康检查端点)
让回滚真正“快”:脚本化 + 预检
人工敲命令易错、耗时、难追溯。封装为脚本可大幅提升速度与可靠性:
- 写一个
rollback.sh,接受服务名和目标 tag(如./rollback.sh myapp-web v2.2.1) - 脚本内自动检查:
docker images | grep "myapp:v2.2.1"是否存在、端口是否被占、健康接口是否返回 200 - 执行前备份当前容器配置:
docker inspect myapp-web > rollback-backup-$(date +%s).json - 记录日志到统一路径,方便事后复盘











