15.7.5 镜像版本管理与标签规范

镜像版本管理与标签规范的目标是可追溯、可回滚、可复现。生产环境禁止使用 latest 部署,必须明确版本号与构建元信息,并记录镜像摘要(digest),保证发布链路可审计。

原理草图(标签与摘要的关系)

文章图片

环境准备与基础检查(命令说明)

# 1) 检查 Docker 版本(确保客户端/服务端可用)
docker version

# 2) 登录镜像仓库(推送前必须完成)
docker login registry.example.com

# 3) 查看本地镜像与标签
docker images
  • docker version:确认 Docker 客户端/服务端版本与可用性
  • docker login:保存认证信息,用于 push
  • docker images:列出本地镜像与标签

标签规范建议(SemVer + 元信息)
- 语义化版本:MAJOR.MINOR.PATCH,如 2.3.1
- 预发布与构建元信息:2.3.1-rc.22.3.1+build.20240115
- 环境/渠道后缀:2.3.1-prod2.3.1-staging
- 兼容别名:2.32
- 高安全场景用摘要锁定: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-prod1.25stable,并推送到私有仓库。
2. 通过 docker inspect 获取摘要,模拟“标签被覆盖”后仍能精准回滚。
3. 设计一份团队标签规范:包含 SemVer、预发布、环境后缀、稳定别名,写出示例。