镜像基础操作
本教程共 25 篇 · 第 9 篇 · 更新于 2026-07-26 · 约 8 分钟阅读
9. 镜像基础操作
本节目标:掌握镜像的拉取、查看、删除、打标签、离线传输和历史查看,理解镜像分层结构。学完你能把本地镜像管理得井井有条。
镜像和容器的关系再确认
上一章管的是容器,这章回到镜像。简单复习下:镜像是只读模板,容器是镜像跑起来的实例。一个镜像可以跑出很多容器,但镜像是源头。
类比面向对象编程的话:镜像像「类」,容器像「对象」。改容器不影响镜像,但删了镜像,靠它跑的容器也就没了根。
拉取镜像:docker pull
docker pull 从仓库下载镜像到本地:
docker pull nginx
不指定标签,默认拉 latest。想拉特定版本,用 镜像名:标签:
docker pull nginx:alpine
docker pull ubuntu:24.04
拉取过程会按层下载,每一层下载完会显示 Pull complete:
alpine: Pulling from library/nginx
579b34f0a95b: Pull complete
d11a451e6399: Pull complete
...
Status: Downloaded newer image for nginx:alpine
Tip拉镜像时指定具体版本而不是
latest,是个好习惯。latest会随官方更新而变化,今天拉的和明天拉的可能不一样,容易踩「环境不一致」的坑。写 Dockerfile、写部署脚本时尤其要锁版本。
列出本地镜像:docker images
看本机有哪些镜像,用 docker images(或 docker image ls):
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine eedaff45e3c7 4 months ago 29.7MB
ubuntu 24.04 b1e9cef9c8b1 2 weeks ago 78MB
hello-world latest d2c94e258dcb 6 months ago 13.3KB
各列含义:
- REPOSITORY:镜像仓库源名。
- TAG:标签,也就是版本。
- IMAGE ID:镜像 ID,唯一标识。
- CREATED:构建时间。
- SIZE:镜像大小(解压后大小,不是下载大小)。
Note这里看到的 SIZE 是镜像解压后占用的磁盘大小,比下载时的层大小要大。下载时是压缩传输的。
镜像名、标签和 ID 的关系
这点容易混淆,理清楚:
- REPOSITORY:TAG 是镜像的「名字」,比如
nginx:alpine,是人用的。 - IMAGE ID 是镜像内容的唯一指纹,是机器用的。同一份镜像内容,可以挂多个名字(多个 REPOSITORY:TAG 指向同一个 ID)。
这就是为什么 docker tag 能给镜像加别名—它不复制镜像,只是让另一个名字指向同一个 ID。
删除镜像:docker rmi
不要的镜像用 docker rmi(或 docker image rm)删掉,腾出磁盘:
docker rmi hello-world
可以一次删多个,用空格隔开:
docker rmi nginx:alpine ubuntu:24.04
Warning如果有容器(哪怕已停止)是基于这个镜像创建的,
rmi会报错拒绝删除:image is being used by stopped container。得先把相关容器删掉,或者用-f强制删:docker rmi -f nginx。强删只是解除名字关联,容器仍可能引用着这层数据,所以最好先清容器再清镜像。
批量清理没用到的镜像:
docker image prune
它只删没有容器引用的镜像。想删得更彻底(删所有没被容器使用的),加 -a:
docker image prune -a
给镜像打标签:docker tag
tag 给已有镜像加一个新名字,常用于推送前的命名:
docker tag nginx:alpine my-nginx:v1
执行后 docker images 会多出一行 my-nginx v1,但 IMAGE ID 和 nginx:alpine 一样—它俩是同一个镜像的两个名字。
这招在往仓库推镜像时特别有用,因为推送要求镜像名带 用户名/ 前缀:
docker tag my-nginx:v1 yourname/my-nginx:v1
离线传输镜像:save 和 load
内网环境没法联网拉镜像,或者要把镜像从一台机器搬到另一台,save 和 load 派上用场。
导出镜像:docker save
把镜像打包成一个 tar 文件:
docker save -o nginx.tar nginx:alpine
-o 指定输出文件。也可以一次导出多个镜像到同一个文件:
docker save -o images.tar nginx:alpine ubuntu:24.04
导入镜像:docker load
把 tar 文件恢复成镜像:
docker load -i nginx.tar
-i 指定输入文件。导入后镜像名、标签都和导出时一致。
Tip别把
save/load和容器相关的export/import搞混。save处理的是镜像(完整的分层结构),export处理的是容器(拍平成单层文件系统)。日常迁移镜像用save/load,保留分层信息。
看镜像分层:docker history
镜像是分层的,history 能看到每一层是怎么来的:
docker history nginx:alpine
IMAGE CREATED CREATED BY SIZE
648f93a1ba7d 4 months ago COPY /app/build /usr/share/nginx/html 1.6MB
<missing> 5 months ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 5 months ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 5 months ago /bin/sh -c set -x && addgroup ... 9.7MB
<missing> 5 months ago /bin/sh -c #(nop) ADD file:... 7.66MB
每一行对应一层:哪条命令创建的、这一层多大。能看到大部分层是 0B—那些是配置类指令(CMD、EXPOSE、ENV),不占空间;真正占空间的是 ADD、COPY、RUN 这种改文件系统的。
Tip命令太长被截断?加
--no-trunc看完整内容:docker history --no-trunc nginx:alpine。不过输出会很长,做好心理准备。
镜像分层为什么重要
镜像分层不只是好看,它带来两个实在好处:
- 复用省空间。两个镜像都基于同一个
ubuntu基础层,这个层在本地只存一份,两个镜像共享。 - 构建加速。改了上层重新构建,下层没变就用缓存,不用重做。这也是 Dockerfile 构建快的秘密。
NoteDocker v29 起,全新安装默认使用 containerd 镜像存储(containerd image store)。它和老的 Docker 镜像存储在底层实现上有差别,但对你用
pull/images/save这些命令没有影响,行为一致。知道有这么回事就行。
搜索镜像:docker search
不想开浏览器,直接命令行搜 Docker Hub 上的镜像:
docker search nginx
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 20000 [OK]
bitnami/nginx Bitnami container image for Nginx 300
- STARS:点赞数,越高越受欢迎。
- OFFICIAL:带
[OK]的是 Docker 官方维护镜像,优先选这种,更安全。
Warning
search只能看名字、描述和星数,看不到具体标签和大小。真要选镜像,还是去 Docker Hub 网页看详情更靠谱。下载前优先挑带OFFICIAL标记的,第三方镜像质量参差不齐。
小结
镜像的基础操作就这几样:pull 拉、images 看、rmi 删、tag 改名、save/load 搬运、history 看分层。理解了分层复用,你就能解释为什么拉第二个镜像比第一个快、为什么磁盘占用没那么大。
下一节是基础操作篇的最后一章—怎么进到容器里去,以及怎么在宿主机和容器之间拷文件。