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 rmi 删的是标签;只有当镜像没有任何标签且无容器引用时,镜像数据才真正被删除。
典型用途
- 推送私有仓库前:
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 管理的容器不建议手改(下次 up 会按 yml 里的名字重建)。
观测云对照
改名不停观测。 DataKit 按容器标签/镜像等元数据打标采集,容器或镜像改名后指标与日志链路自动跟随新名称,检索历史数据也不中断。
常见问题(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