Docker 中如何修改镜像名(仓库名)或容器名?
镜像改名用 docker tag 旧名 新名(加别名,再 docker rmi 旧名删除别名);容器改名用 docker rename。本文说明名称与 ID 的关系及常见操作。
做法:镜像没有真正的"重命名",用 docker tag 旧名:标签 新名:标签 给同一镜像加一个新名字(别名),再用 docker rmi 旧名 删掉旧别名——镜像数据(ID)不变;容器改名直接 docker rename 旧名 新名,即时生效、不影响运行。
镜像改名:tag + rmi
镜像名只是指向镜像 ID(如 d583c3ac45fd)的别名,一个镜像可以有任意多个名字:
# 加新名
docker tag myapp:1.0 registry.example.com/team/myapp:1.0
# 确认两个名字指向同一 ID
docker images | grep myapp
# 删掉旧名(只是删别名,镜像还在)
docker rmi myapp:1.0
按名称删除可能仅移除标签;删除最后引用时也可能移除镜像及不再共享的层,具体受容器、其他标签和缓存引用约束。
典型用途
- 推送私有仓库前:
docker tag myapp:1.0 registry.example.com/team/myapp:1.0 && docker push ... - 规范命名:把随手起的
test123改成规范的team/service:版本 - latest 指针调整:
docker tag myapp:1.2 myapp:latest直接更新 latest 指向,不要随后删除这个刚更新的标签
容器改名:rename
docker rename old_name new_name
运行中也能改,进程无感知。compose 管理的容器不建议手改(手工改名不会更新 Compose 配置或其他依赖,后续 up 的行为还取决于项目标签和配置变化)。
常见问题(FAQ)
Q:docker tag 会复制一份镜像占双倍磁盘吗?
A:不会。tag 只是别名,分层数据共享,几乎不占额外空间。
Q:rmi 报 "image is being used by running container"?
A:有容器在用该镜像,先停删容器;或确认你只是想删标签——删标签在有容器引用时也会受限,可 -f 强制(谨慎)。
Q:仓库地址改变(迁 registry)怎么批量改名?
A:docker images --format '{{.Repository}}:{{.Tag}}' | grep old-registry | while read i; do docker tag $i ${i/old-registry/new-registry}; done