15.7.5 镜像版本管理与标签规范
镜像版本管理与标签规范的目标是可追溯、可回滚、可复现。生产环境禁止使用 latest 部署,必须明确版本号与构建元信息,并记录镜像摘要(digest),保证发布链路可审计。
原理草图(标签与摘要的关系)
环境准备与基础检查(命令说明)
# 1) 检查 Docker 版本(确保客户端/服务端可用)
docker version
# 2) 登录镜像仓库(推送前必须完成)
docker login registry.example.com
# 3) 查看本地镜像与标签
docker images
docker version:确认 Docker 客户端/服务端版本与可用性docker login:保存认证信息,用于 pushdocker images:列出本地镜像与标签
标签规范建议(SemVer + 元信息)
- 语义化版本:MAJOR.MINOR.PATCH,如 2.3.1
- 预发布与构建元信息:2.3.1-rc.2、2.3.1+build.20240115
- 环境/渠道后缀:2.3.1-prod、2.3.1-staging
- 兼容别名:2.3、2
- 高安全场景用摘要锁定:myapp@sha256:...
完整示例:从构建到多标签推送
# 假设镜像名称与版本
APP_NAME=myapp
VER=1.4.2
REG=registry.example.com/team
# 1) 构建镜像并打主版本标签
docker build -t ${REG}/${APP_NAME}:${VER} .
# 2) 为同一镜像追加兼容/环境/稳定标签
docker tag ${REG}/${APP_NAME}:${VER} ${REG}/${APP_NAME}:1.4
docker tag ${REG}/${APP_NAME}:${VER} ${REG}/${APP_NAME}:1
docker tag ${REG}/${APP_NAME}:${VER} ${REG}/${APP_NAME}:${VER}-prod
docker tag ${REG}/${APP_NAME}:${VER} ${REG}/${APP_NAME}:stable
# 3) 推送全部标签到仓库
docker push ${REG}/${APP_NAME}:${VER}
docker push ${REG}/${APP_NAME}:1.4
docker push ${REG}/${APP_NAME}:1
docker push ${REG}/${APP_NAME}:${VER}-prod
docker push ${REG}/${APP_NAME}:stable
# 4) 获取摘要(digest),用于精确回滚
docker inspect --format='{{index .RepoDigests 0}}' ${REG}/${APP_NAME}:${VER}
docker build -t:构建镜像并指定标签docker tag:给同一镜像追加新标签docker push:推送镜像到仓库docker inspect:获取镜像摘要(sha256)
生产发布与回滚(标签+摘要双保险)
# 记录发布镜像标签和摘要
IMAGE=${REG}/${APP_NAME}:${VER}
DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' $IMAGE)
echo "release=${IMAGE}" > release.info
echo "digest=${DIGEST}" >> release.info
# 回滚时使用摘要锁定镜像,避免标签漂移
docker pull ${REG}/${APP_NAME}@${DIGEST#*@}
镜像生命周期管理(示例策略)
# 仅保留最近 5 个版本(示意:需结合仓库API或管理工具实现)
# 可在 CI 中维护白名单/黑名单
echo "保留规则: 最近5个版本 + 所有 prod/stable 标签"
常见问题与排错
- push denied(无权限/未登录)
bash
docker login registry.example.com
docker push registry.example.com/team/myapp:1.4.2
- tag not found(标签写错或未打标签)
bash
docker images | grep myapp
docker tag localimage:latest registry.example.com/team/myapp:1.4.2
- 标签漂移导致回滚错误
解决:使用摘要
bash
docker pull registry.example.com/team/myapp@sha256:xxxx
练习
1. 为本地镜像 nginx:1.25 追加三个标签:1.25-prod、1.25、stable,并推送到私有仓库。
2. 通过 docker inspect 获取摘要,模拟“标签被覆盖”后仍能精准回滚。
3. 设计一份团队标签规范:包含 SemVer、预发布、环境后缀、稳定别名,写出示例。