讲解
镜像的完整名字由「仓库地址/命名空间/名字:标签」组成,平时写的 nginx:1.27-alpine 其实是 docker.io/library/nginx:1.27-alpine 的简写——Docker Hub 官方镜像可以省略仓库地址和 library 命名空间。标签(tag)是镜像的可变别名,默认 latest 只是「最后打的那个标签」,不代表「最新稳定版」,生产环境永远应该锁定具体版本号或 digest。
镜像的物理结构是分层的:每条 Dockerfile 指令产生一个只读层,层与层之间靠内容哈希复用。pull 时只下载本地没有的层,这就是为什么第二次拉取几乎瞬间完成;多个镜像共享同一个基础层(比如都基于 alpine),磁盘上只存一份。docker image inspect 和 docker history 能看清一个镜像的层构成。
常用命令一组就够:docker pull 拉取、docker images 列表、docker image inspect 看详情(配置、层、入口)、docker history 看每层的来历和大小、docker rmi 删除(有容器在用时要先处理容器)、docker tag 给镜像起别名。删除镜像本质是删标签,只有最后一个标签被删且没有容器引用时层数据才真正回收。
示例
拉取一个具体标签的镜像(比 latest 更可复现):
docker pull alpine:3.21
查看本地镜像列表,注意 REPOSITORY、TAG、SIZE 三列:
docker images alpine
看镜像的入口配置与层数:
docker image inspect alpine:3.21 --format '入口: {{json .Config.Entrypoint}} 默认命令: {{json .Config.Cmd}} 层数: {{len .RootFS.Layers}}'
给镜像打一个本教程约定前缀的别名(tag 不复制数据,只是加个名字):
docker tag alpine:3.21 ohmydocs-verify-alpine-copy:3.21
docker images 'ohmydocs-verify-alpine-copy'
删除别名,原镜像不受影响:
docker rmi ohmydocs-verify-alpine-copy:3.21
常见坑
- 迷信 latest:latest 没有任何版本语义,今天拉的和明天拉的可能不同;Dockerfile 和部署脚本里锁版本。
- rmi 报 image is being used:有(哪怕已停止的)容器引用该镜像,先 docker rm 清理容器再删镜像。
- 以为 tag 是副本:同一镜像 ID 可以挂多个标签,删一个标签不动数据;真正占空间的是层。
- 囤积悬空镜像:反复构建会留下 标签的悬空层,定期清理(清理章节专讲)。
小结
镜像名 = 仓库/命名空间/名字:标签,生产锁版本;镜像是分层只读的,层可复用;pull/images/inspect/history/tag/rmi 是日常六件套。下一章用镜像跑起容器。