关键在于保留带语义化标签的镜像而非容器;需用不可覆盖标签(如v1.2.0)构建推送、避免latest、防范dangling镜像误删、通过docker-compose变量与命名空间管理多版本、并实施远程仓库+本地导出双备份。

关键不是“保留多个容器”,而是保留多个带明确标签的镜像。Docker 本身不提供版本回退命令,但只要历史镜像存在、标签清晰、网络和数据卷配置得当,切换就是一条命令的事。
用语义化标签构建并存镜像
每个版本必须构建成独立镜像,并打上不可覆盖的语义化标签(如 v1.2.0、v1.3.1、rc2),避免只用 latest —— 它会被新构建覆盖,导致旧版丢失。
- 构建时指定标签:
docker build -t myapp:v1.2.0 .和docker build -t myapp:v1.3.1 . - 推送时同步上传所有标签:
docker push myapp:v1.2.0 && docker push myapp:v1.3.1 - 本地可通过
docker images myapp查看已保留的所有版本
避免镜像被自动清理
Docker 的 prune 命令默认不会删带标签的镜像,但需注意:未打标签的 dangling 镜像(<none>)会被误删,而它们可能关联着你没显式打标的旧层。
- 构建后立即打标,不依赖中间层 ID
- 定期检查:
docker images --filter "dangling=false" | grep myapp - 清理前加
--dry-run预览:docker image prune --dry-run
用 docker-compose 管理多版本组合
单个服务可快速切换版本,多个服务(如 app + db + cache)共存时,靠 compose 文件按需编排更可靠。
- 为不同测试场景准备多个 yml 文件:
docker-compose.v1.yml、docker-compose.v2.yml - 或在一个文件中用变量控制镜像标签:
image: myapp:${APP_VERSION:-v1.2.0},启动时传参:APP_VERSION=v1.3.1 docker-compose up -d - 配合命名空间(project name)隔离:
docker-compose -p test-v1 up -d和docker-compose -p test-v2 up -d互不干扰
本地+远程双备份保障可用性
仅靠本地镜像风险高——磁盘损坏或误删会导致版本丢失。生产级管理需确保关键版本在远程仓库始终可拉取。
- CI 流水线构建成功后,强制推送带校验的版本标签(如含 commit SHA 后缀:
v1.2.0-8a3f2e1) - 企业环境使用 Harbor/Nexus 等私有仓库,开启镜像保留策略与扫描告警
- 本地定期导出重要镜像:
docker save myapp:v1.2.0 | gzip > myapp-v1.2.0.tar.gz,离线存档


















