首页 / Docker 入门教程 / 镜像基础操作

Docker 入门教程

镜像基础操作

本教程共 25 篇 · 第 9 篇 · 更新于 2026-07-26 · 约 8 分钟阅读

DockerDocker 入门教程镜像docker pulldocker imagesdocker tag镜像分层

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

内网环境没法联网拉镜像,或者要把镜像从一台机器搬到另一台,saveload 派上用场。

导出镜像: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—那些是配置类指令(CMDEXPOSEENV),不占空间;真正占空间的是 ADDCOPYRUN 这种改文件系统的。

Tip

命令太长被截断?加 --no-trunc 看完整内容:docker history --no-trunc nginx:alpine。不过输出会很长,做好心理准备。

镜像分层为什么重要

镜像分层不只是好看,它带来两个实在好处:

  1. 复用省空间。两个镜像都基于同一个 ubuntu 基础层,这个层在本地只存一份,两个镜像共享。
  2. 构建加速。改了上层重新构建,下层没变就用缓存,不用重做。这也是 Dockerfile 构建快的秘密。
Note

Docker v29 起,全新安装默认使用 containerd 镜像存储(containerd image store)。它和老的 Docker 镜像存储在底层实现上有差别,但对你用 pull/images/save 这些命令没有影响,行为一致。知道有这么回事就行。

不想开浏览器,直接命令行搜 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 看分层。理解了分层复用,你就能解释为什么拉第二个镜像比第一个快、为什么磁盘占用没那么大。

下一节是基础操作篇的最后一章—怎么进到容器里去,以及怎么在宿主机和容器之间拷文件。