4、镜像查看与管理:docker images、docker rmi、docker tag、docker inspect
镜像管理,说白了就是跟本地仓库里的「原材料」打交道。你拉下来的镜像、自己构建的镜像,全堆在本地。怎么查?怎么删?怎么改名?怎么扒开看细节?这节我带你挨个过一遍。
核心命令一览
docker images—— 列出本地所有镜像docker rmi—— 删除镜像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 综合实战:镜像管理流水线
最后,我分享一个日常用的镜像管理流程。假设你刚构建了一个新镜像:
- 查看镜像列表:
docker images确认新镜像已存在 - 打标签:
docker tag myapp:latest myapp:v1.2.3保留版本号 - 检查元数据:
docker inspect myapp:v1.2.3确认环境变量、入口点正确 - 清理旧镜像:
docker rmi myapp:v1.2.2删除旧版本(如果不再需要) - 定期清理悬空镜像:
docker image prune -f
这个流程我用了好几年,从来没在镜像管理上出过岔子。你想想看,镜像管理看似简单,但一旦乱起来,找问题能找一整天。养成好习惯,比什么都强。
最后提醒一句:别把所有镜像都打 latest 标签。我见过有人一个仓库里十几个镜像全叫 latest,结果根本分不清哪个是哪个。版本号要明确,标签要规范,这是镜像管理的基本功。
可可精品资料库