4、镜像查看与管理:docker images、docker rmi、docker tag、docker inspect

镜像管理,说白了就是跟本地仓库里的「原材料」打交道。你拉下来的镜像、自己构建的镜像,全堆在本地。怎么查?怎么删?怎么改名?怎么扒开看细节?这节我带你挨个过一遍。

核心命令一览

  • docker images —— 列出本地所有镜像
  • docker rmi —— 删除镜像
  • docker tag —— 给镜像打标签
  • docker inspect —— 查看镜像元数据
镜像查看与管理 核心命令 docker images 列出本地镜像 docker rmi 删除镜像 docker tag 打标签 docker inspect 查看元数据 日常使用场景 • 查镜像:docker images → 看仓库、标签、ID、大小 • 删镜像:docker rmi [镜像ID] → 清理无用镜像 • 打标签:docker tag 原镜像 新标签 → 版本管理 • 查元数据:docker inspect → 看层、环境变量、入口点

4.1 docker images —— 看看你手里有什么

刚接触 Docker 那会儿,我总爱隔三差五敲一下 docker images。为啥?因为看着那一排镜像,心里踏实。你想想看,镜像就是你的「弹药库」,得清楚自己手里有什么牌。

docker images

输出大概长这样:

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         latest    605c77e624dd   2 weeks ago    141MB
ubuntu        22.04     2dc39ba059dc   3 weeks ago    77.8MB
myapp         v1.0      a1b2c3d4e5f6   5 days ago     256MB
列名含义
REPOSITORY镜像所属仓库,相当于名字
TAG标签,通常表示版本号
IMAGE ID镜像唯一标识,前12位
CREATED镜像创建时间
SIZE镜像大小,注意是压缩后的逻辑大小

小技巧:加 -a 参数能看到所有镜像(包括中间层)。加 --digests 能显示摘要,这在验证镜像完整性时很有用。我个人习惯用 docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" 自定义输出,只看我关心的列。

4.2 docker rmi —— 清理不需要的镜像

镜像越堆越多,磁盘迟早报警。这时候就得用 docker rmi 来清理。说白了就是「删镜像」。

docker rmi nginx:latest
docker rmi a1b2c3d4e5f6   # 也可以用镜像ID

嗯,这里要注意:如果镜像正在被某个容器使用,你是删不掉的。Docker 会提示你:

Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container 3e4f5a6b7c8d is using its referenced image

我曾经在清理测试环境时,一口气删了十几个镜像,结果发现有个容器还在跑,直接报错。后来学乖了,先 docker ps -a 看一眼哪些容器在用,再动手。

警告:加 -f 参数可以强制删除,但慎用!强制删除可能会让正在运行的容器出问题。我建议先停掉相关容器,再删镜像。

批量删除「悬空镜像」(即 <none>:<none> 的镜像)可以用:

docker image prune

这个命令会清理所有没有被任何容器引用的镜像。我每周五下班前都会跑一次,省得周一回来磁盘满了。

4.3 docker tag —— 给镜像打标签

镜像打标签,说白了就是给同一个镜像起多个名字。你想想看,同一个 Ubuntu 22.04 镜像,你可以叫它 ubuntu:22.04,也可以叫它 ubuntu:jammy,甚至 mybase:latest。它们指向同一个 IMAGE ID。

docker tag ubuntu:22.04 myrepo/ubuntu:22.04
docker tag a1b2c3d4e5f6 myapp:release-1.0

我在项目中遇到过这么个场景:开发环境用 myapp:dev,测试环境用 myapp:test,生产环境用 myapp:prod。其实底层都是同一个镜像,只是标签不同。这样管理起来特别清晰,不会搞混。

提示:标签不是版本号,它只是一个字符串。别指望标签能帮你做版本控制。真正的版本控制靠的是 IMAGE ID 和 Digest。我见过有人把 latest 标签到处乱打,结果回滚时根本不知道哪个才是真正的「最新」。

4.4 docker inspect —— 扒开镜像看个透

docker inspect 是我最常用的调试命令之一。它能返回镜像的完整元数据,以 JSON 格式输出。说白了,就是镜像的「身份证」加「体检报告」。

docker inspect ubuntu:22.04

输出内容很长,我挑几个关键字段说说:

字段说明
Id镜像完整 ID(64位)
RepoTags该镜像的所有标签列表
Parent父镜像 ID(如果是基础镜像则为空)
Created创建时间
ContainerConfig.Cmd默认启动命令
ContainerConfig.Env环境变量列表
RootFS.Layers镜像层 ID 列表,能看到分层结构

举个例子,我想看一个镜像的环境变量:

docker inspect --format='{{.ContainerConfig.Env}}' ubuntu:22.04

输出:

[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]

我曾经排查过一个镜像启动失败的问题,用 docker inspect 一看,发现 Entrypoint 指向了一个不存在的脚本。这种问题光看 Dockerfile 是看不出来的,必须扒元数据。

实用技巧:用 --format 参数可以只提取你关心的字段。比如 docker inspect --format='{{.RootFS.Layers}}' myimage 只看分层信息。我经常用这个来对比两个镜像的层是否一致。

4.5 综合实战:镜像管理流水线

最后,我分享一个日常用的镜像管理流程。假设你刚构建了一个新镜像:

  1. 查看镜像列表:docker images 确认新镜像已存在
  2. 打标签:docker tag myapp:latest myapp:v1.2.3 保留版本号
  3. 检查元数据:docker inspect myapp:v1.2.3 确认环境变量、入口点正确
  4. 清理旧镜像:docker rmi myapp:v1.2.2 删除旧版本(如果不再需要)
  5. 定期清理悬空镜像:docker image prune -f

这个流程我用了好几年,从来没在镜像管理上出过岔子。你想想看,镜像管理看似简单,但一旦乱起来,找问题能找一整天。养成好习惯,比什么都强。

最后提醒一句:别把所有镜像都打 latest 标签。我见过有人一个仓库里十几个镜像全叫 latest,结果根本分不清哪个是哪个。版本号要明确,标签要规范,这是镜像管理的基本功。

可可精品资料库