1. 镜像到底是什么:先弄懂概念再动手
很多人接触 Docker 时,第一个接触的词就是 image,也就是镜像。但说实话,不少人在用了一两个月 Docker 之后,对镜像的理解仍然停留在"好像是个模板"这种模糊状态。一旦遇到镜像删不掉、构建不成功、或者容器跑不起来的时候,就完全不知道从哪里排查。
镜像其实可以理解成"一个打包好的操作系统文件系统快照",里面包含了程序运行所需的代码、运行时、系统工具、依赖库、配置文件等等。你运行一个容器,本质上就是把这个镜像当成一个独立的根目录,然后通过 Linux 内核的命名空间和 cgroup 机制,让里面跑起来的进程以为自己独占了一台机器。
但镜像和虚拟机镜像有一个本质区别:Docker 镜像是分层的。
Dockerfile 里每一行指令,比如 RUN apt-get install、COPY、ENV,都会生成一个新的镜像层。每一层只记录变化的部分,而不是完整记录整个文件系统。这意味着如果你拉取了两个共享基础镜像(比如都基于 ubuntu:22.04)的镜像,它们会共用底层的那些层,节省磁盘空间,也加速拉取传输。
我在实际工作中经常用一个类比跟同事解释:镜像就像积木搭出来的成品,每一层积木都是只读的。如果你想调整某个文件,不能直接在成品上改,只能重新搭一层新积木盖上去,把之前的内容"遮住"。容器运行的时候,Docker 会在镜像的最上面加一层可写的容器层,你在容器里做的所有修改都发生在这一层,一旦容器删除,这层可写层也跟着消失。
明白了这个概念,后面所有镜像相关的命令就好理解了。这篇文章我按日常使用频率,把镜像相关的命令从头到尾捋一遍,包含了参数解释、操作示例,还有我踩过的一些坑,希望能帮你少走弯路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 最常用的镜像命令清单与参数详解
2.1 docker images:查看本地镜像
这是你几乎每天都会敲的命令。不加任何参数直接执行:
bash复制docker images
输出大致长这样:
code复制REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 weeks ago 142MB
redis 7.2 5571a2a2d3a4 3 weeks ago 117MB
ubuntu 22.04 2dc39ba0599c 4 weeks ago 77.8MB
四列信息分别是仓库名、标签、镜像 ID 和大小。仓库名加标签合起来就是镜像的完整名称,比如 nginx:latest,其中 latest 是默认标签,代表最近一次构建的版本,但不一定是最新的稳定版,这是一个很常见的误解,后面会专门讲。
日常用得多的参数有这几个:
-a,显示所有镜像,包括中间层镜像。中间层镜像是构建过程中产生的临时层,正常情况会被隐藏,如果你需要调试或者清理它们,用-a查看。-q,只显示镜像 ID。这个参数在写自动化脚本时非常有用,比如你想删掉所有虚悬镜像,可以配合其他命令一起用。--format,自定义输出格式。比如我只想看到仓库名和标签:docker images --format "{{.Repository}}:{{.Tag}}",这在脚本里处理文本和批量操作时比解析默认表格靠谱得多。--filter,按条件过滤。docker images --filter dangling=true可以找出所有虚悬镜像,这些是构建新镜像时遗留下来的旧版本层,占用空间,但已经没有任何标签引用了。
dangling 这个词值得展开说一下。当你反复构建同一个镜像时,旧的镜像层如果不再被任何标签引用,就会变成虚悬状态,镜像名和标签显示为 <none>:<none>。这些镜像不会自动删除,积攒多了非常占磁盘。我见过一个同事的开发机,光虚悬镜像就占了三四十 GB,磁盘告警才发现。
2.2 docker pull:拉取镜像
本地没有的镜像,用 docker pull 从镜像仓库拉下来。最简单的用法:
bash复制docker pull nginx
等价于:
bash复制docker pull docker.io/library/nginx:latest
完整写法包含了三个部分:[仓库地址]/[命名空间]/[镜像名]:[标签]。默认仓库地址是 docker.io 也就是 Docker Hub,默认命名空间是 library,默认标签是 latest。
拉取指定版本的时候要注意,不是所有镜像都规范维护了 latest 标签,尤其是企业级中间件,很多项目方明确建议你拉取带版本号的标签。例如 Redis 官方镜像,你可以拉取 redis:7.2-alpine 这种带 Alpine Linux 精简版的标签,体积比完整版小很多,非常适合开发和轻量环境。
docker pull 值得记住的参数是 -q,静默拉取不输出进度条,在脚本中很有用。另外 --platform 参数可以用来指定拉取哪个平台的镜像,比如你在 x86 机器上想拉取 arm64 架构的镜像做交叉验证:
bash复制docker pull --platform linux/arm64 ubuntu:22.04
一条命令就把目标平台镜像拉下来了,不需要专门找一台 ARM 机器。这个参数在排查多架构镜像问题时特别好用。
2.3 docker rmi:删除镜像
rmi 是 remove image 的缩写。删除镜像的命令是:
bash复制docker rmi nginx:latest
或者直接指定镜像 ID:
bash复制docker rmi 605c77e624dd
如果该镜像正在被某个容器使用,你会收到一个报错:
code复制Error response from daemon: conflict:
