docker tag 命令详解

docker tag 命令详解

什么是 docker tag

docker tag 用于为本地镜像创建新的标签名。它不会复制镜像数据(镜像层是共享的),只是创建一个新的引用别名。

基本用法

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

示例

# 最简单的使用
docker tag nginx:latest mynginx:v1

# 使用不同的 tag
docker tag nginx:latest mynginx:v2

# 本地镜像看起来有两个,但实际共享同一份数据
docker images | grep nginx
# nginx       latest    abc123    100MB
# mynginx     v1        abc123    100MB  ← 相同 ID,共享层
# mynginx     v2        abc123    100MB  ← 相同 ID,共享层

常见用法

1. 准备推送到仓库

# 给镜像打上仓库地址
docker tag myapp:1.0.0 registry.example.com/myapp:1.0.0
docker push registry.example.com/myapp:1.0.0

# 打上用户名前缀(Docker Hub)
docker tag myapp:latest myusername/myapp:latest
docker push myusername/myapp:latest

2. 打多个标签

# 一个镜像多个标签
docker tag myapp:1.2.3 myapp:latest
docker tag myapp:1.2.3 myapp:1
docker tag myapp:1.2.3 myapp:1.2

# 全部推送
docker push myapp:latest
docker push myapp:1
docker push myapp:1.2
docker push myapp:1.2.3

3. 添加环境和分支信息

# CI/CD 中的标签
docker tag myapp:${CI_COMMIT_SHA} myapp:${CI_COMMIT_TAG:-latest}
docker tag myapp:${CI_COMMIT_SHA} registry.example.com/myapp:${CI_COMMIT_SHA}

# 分支信息
docker tag myapp:abc123 myapp:feature-user-auth

4. 跨仓库重命名

# Docker Hub → 私有仓库
docker tag myusername/myapp:latest internal-registry:5000/team-a/myapp:1.0

# 私有仓库 → 另一个私有仓库
docker tag old-registry:5000/myapp:1.0 new-registry:5000/myapp:1.0

使用场景示例

开发工作流

# 1. 构建镜像
docker build -t myapp:abc1234 .

# 2. 打上环境标签
docker tag myapp:abc1234 myapp:dev

# 3. 打上版本标签
docker tag myapp:abc1234 myapp:feature-1.0.0

# 4. 推送到仓库
docker tag myapp:abc1234 registry.example.com/myapp:abc1234
docker tag myapp:abc1234 registry.example.com/myapp:dev
docker push registry.example.com/myapp:abc1234
docker push registry.example.com/myapp:dev

发布工作流

# 1. 确认版本后打标签
docker tag myapp:abc1234 myapp:1.0.0

# 2. 更新可变标签
docker tag myapp:1.0.0 myapp:latest
docker tag myapp:1.0.0 myapp:stable

# 3. 推送到生产仓库
docker tag myapp:1.0.0 prod-registry:5000/myapp:1.0.0
docker tag myapp:1.0.0 prod-registry:5000/myapp:latest
docker push prod-registry:5000/myapp:1.0.0
docker push prod-registry:5000/myapp:latest

标签管理策略

版本标签

# 语义化版本
myapp:1.0.0        # 精确版本
myapp:1.0          # 主版本.次版本
myapp:1            # 主版本
myapp:latest       # 最新

# 预发布版本
myapp:1.0.0-alpha
myapp:1.0.0-beta.1
myapp:2.0.0-rc.3

构建标签

# Git 相关
myapp:gabcdefa     # 短 SHA
myapp:1.0.0-gabcdefa  # 版本+commit

# CI 构建号
myapp:build-1234

环境标签

myapp:dev
myapp:staging
myapp:prod
myapp:testing

删除标签

# 删除本地标签(如果其他标签引用相同镜像,数据不变)
docker rmi myapp:old-tag

# 删除远程标签
# 方式一:删除清单
DIGEST=$(curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
  https://registry.example.com/v2/myapp/manifests/old-tag | \
  jq -r '.config.digest')
curl -X DELETE https://registry.example.com/v2/myapp/manifests/$DIGEST

# 方式二:使用工具(skopeo)
skopeo delete docker://registry.example.com/myapp:old-tag

标签 vs 镜像摘要

# 标签是可变的
docker tag myapp:1.0.0 dev:latest  # 可以指向不同内容

# 摘要是不可变的
# myapp@sha256:abc... 始终指向相同内容

# 推荐:部署时用摘要
docker run -d myapp@sha256:abc123def...

批量标签操作

# 批量打标签脚本
#!/bin/bash
IMAGE=$1
VERSION=$2

docker tag $IMAGE:$VERSION $IMAGE:latest
docker tag $IMAGE:$VERSION $IMAGE:$(echo $VERSION | cut -d. -f1)
docker tag $IMAGE:$VERSION $IMAGE:$(echo $VERSION | cut -d. -f1,2)

# 使用
./tag-image.sh myapp 1.2.3

常见错误

# 错误:镜像不存在
Error response from daemon: No such image: myapp:version

# 错误:标签格式错误
Error parsing reference: "myapp:/v1" is not a valid repository/tag
# 标签不能以 / 开头

# 错误:标签过长
Error: Tag name must be at most 128 characters

最佳实践

  1. 不要覆盖已有标签的不同镜像:标签应该指向相同的内容
  2. 生产部署使用不可变引用:@sha256: 优先
  3. 建立标签规范:团队统一的版本号体系
  4. 清理无用标签:定期删除过期标签
  5. 推送前先打标签:保持本地和远程标签一致

docker tag 看似简单,但合理的标签管理对镜像版本控制、CI/CD 流程和故障排查都至关重要。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容