最常用且稳妥的docker容器更新方式有三种:手动替换、compose批量更新、编排平台滚动升级,分别适用于单机部署、yaml管理及swarm/k8s集群场景。

直接更新 Docker 容器不是“重启一下就行”,而是要换镜像、保数据、控流量——核心是避免服务中断和数据丢失。最常用且稳妥的方式有三种:手动替换、Compose 批量更新、编排平台滚动升级。选哪种,取决于你用的是单机部署、YAML 管理,还是 Swarm/K8s 集群。
手动更新:适合单容器、简单服务
适用于没用 Compose、只跑一个关键容器(比如 Halo 博客、qBittorrent)的场景。重点是停旧、拉新、重跑,但必须保留挂载卷和配置。
- 先查容器名:
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" - 停止并备份(尤其数据库或配置目录):
docker stop halo && cp -r /root/.halo /root/.halo.backup - 拉取新版镜像:
docker pull halohub/halo:2.21(别用:latest,指定明确版本) - 用原参数重新运行(注意镜像名、卷映射、端口、环境变量完全一致):
docker run -d --name=halo -p 8090:8090 -v /root/.halo:/root/.halo -e TZ=Asia/Shanghai --restart=unless-stopped halohub/halo:2.21
Docker Compose 更新:适合多服务、YAML 管理的场景
如果你用 docker-compose.yml 部署了 Dashy、Portainer、Traefik 等组合服务,这是最省心的方式——一次拉取、一次重建、自动清理残留。
- 进入 compose 文件所在目录:
cd /share/Container/my-app - 拉取所有服务的新镜像:
docker compose pull(Docker 23.0+ 推荐用docker compose,旧版用docker-compose) - 重建并启动(自动停旧容器、启新容器、移除废弃容器):
docker compose up -d --remove-orphans - 清理无用镜像节省空间:
docker image prune -f
滚动升级(Swarm/K8s):适合生产环境、不能停服
当你的服务必须 7×24 小时在线(比如 API 网关、用户中心),靠手动或 Compose 就不够了。滚动升级让新旧容器交替运行,用户请求始终被处理。
- 在 Swarm 中部署服务时指定策略:
docker service create --update-delay 15s --update-parallelism 1 --update-order start-first nginx:1.25-alpine - 更新时只需推送新镜像并更新服务:
docker service update --image nginx:1.26-alpine my-web - 系统会按策略逐个替换任务:启动新容器 → 健康检查通过 → 停止对应旧容器 → 继续下一批
- 若新版本启动失败,可立即回滚:
docker service rollback my-web
更新前必做的三件事
无论用哪种方式,跳过这些步骤容易翻车:
- 确认兼容性:查看新版本 Release Notes,特别关注配置项变更、数据库迁移脚本、不兼容的环境变量
-
验证挂载路径:
docker inspect 容器名 | grep -A 10 Mounts,确保-v映射没写错,尤其是 config、data、db 目录 -
测试新镜像本地运行:
docker run --rm -it halohub/halo:2.21 /bin/sh -c "echo 'OK' && exit 0",快速验证镜像能正常启动











