镜像更新后,如何升级正在运行的 Docker 容器?
镜像更新不会自动作用到已建容器:docker pull 拉新镜像 → docker stop + rm 旧容器 → 按原参数重建(数据在卷里不丢)。compose 用 docker compose pull && up -d。本文给完整流程。
核心认知:容器创建时绑定的是当时镜像的 ID,镜像更新不会自动更新已有容器。升级流程:①docker pull 镜像:标签 拉取新版;②docker stop + docker rm 旧容器;③用原参数重建容器。数据必须在卷里,重建才无损。
手动升级四步
# 1. 拉取新镜像
docker pull registry.example.com/team/myapp:1.3
# 2. 停并删旧容器(先记配置)
docker inspect myapp # 确认卷、端口、环境变量
docker stop myapp && docker rm myapp
# 3. 按原配置重建
docker run -d --name myapp \
--restart unless-stopped \
-p 8080:80 \
-v app-data:/data \
registry.example.com/team/myapp:1.3
# 4. 验证
docker logs -f myapp
compose 场景(省心版)
docker compose pull # 拉取 yml 里所有镜像的新版本
docker compose up -d # 镜像变了的服务自动重建
自建镜像(build 型)则是:
docker compose up -d --build
减少停机时间
- 先拉后换:pull 完成再停旧容器,停机窗口只有重建那几秒
- 蓝绿式:新容器用不同端口/名字先起来验证,切流后再下线旧的
- 健康检查兜底:compose/k8s 场景配 healthcheck,没起来就回滚
防丢数据清单
- 数据库、上传目录必须挂卷(
docker inspect看 Mounts 确认) - 可写层里有临时改动先
docker commit或拷出 - 数据库升级注意版本兼容(大版本跨升可能要迁移步骤)
观测云对照
升级效果用数据验证。 新版容器起来后,观测云按版本标签对比错误率、延迟;可用性拨测确认服务恢复;异常时按新旧版本分组查日志差异,回滚决策有据可依。
常见问题(FAQ)
Q:标签没变(都是 latest)怎么确认拉到新版?
A:docker pull 会显示各层状态,有更新会下载;镜像 ID 对比 docker images --digests 最准。
Q:有没有自动升级工具?
A:Watchtower 可监控镜像更新并自动重建容器,测试环境好用;生产慎用自动升级。
Q:K8s 里怎么升级?
A:kubectl set image deployment/myapp myapp=myapp:1.3 触发滚动更新,自带零停机与回滚。