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
最佳实践
- 不要覆盖已有标签的不同镜像:标签应该指向相同的内容
- 生产部署使用不可变引用:@sha256: 优先
- 建立标签规范:团队统一的版本号体系
- 清理无用标签:定期删除过期标签
- 推送前先打标签:保持本地和远程标签一致
docker tag 看似简单,但合理的标签管理对镜像版本控制、CI/CD 流程和故障排查都至关重要。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容