3. Docker 镜像基础操作:拉取、查看、删除

镜像,是 Docker 世界的「交付件」。你想想看,不管是跑一个 Nginx 还是搭建一套生信管线,最终都得靠镜像来启动容器。所以,把这三大基础操作——拉取、查看、删除——练熟了,后面的每一步才能走得稳。

3.1 拉取镜像:docker pull

拉取镜像说白了就是从镜像仓库(默认是 Docker Hub)把需要的镜像下载到本地。命令短,但背后的门道不少。

docker pull [选项] [仓库地址/]名称[:标签]

最简单的用法:

docker pull ubuntu:22.04

这条命令会从 Docker Hub 拉取 Ubuntu 22.04 的官方镜像。标签 :22.04 指定了版本,不写标签默认是 :latest。

我遇到过不少新手直接 docker pull ubuntu,结果拉下来的是最新版,和队友的环境不一致,排查了半天才发现是 glibc 版本对不上。所以我的习惯:永远显式指定标签。

场景 推荐标签策略 说明
开发测试 :latest 或 :版本号 灵活,但留意版本漂移
生产部署 :具体版本号 锁定版本,避免意外更新
生信管线 :软件名-版本-日期 可追溯,适合批处理

如果你在内网环境,或者用私有仓库,需要指定完整地址:

docker pull registry.example.com/bioinfo/fastqc:0.12.1

有一点要留神:Docker Hub 对匿名用户有拉取频率限制(每小时 100 次)。做批量操作时,建议先 docker login 认证一下。

3.2 查看镜像:docker images 与 docker system df

镜像拉下来之后,怎么知道本地有哪些货?用 docker images 或 docker image ls——它俩完全等价。

docker images
# 或
docker image ls

输出大概长这样:

REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
ubuntu        22.04     a0a45bd1f5c3   2 weeks ago   77.8MB
fastqc        0.12.1    7f2b9c3d8e1a   3 days ago    456MB
busybox       latest    beae173ccac6   4 weeks ago   1.24MB

如果你只想看某个镜像的详细信息,可以用 docker inspect:

docker inspect ubuntu:22.04

它会返回一个巨长的 JSON,包含架构、层信息、环境变量、入口命令等。我一般在排查「为什么这个镜像跑不起来」时,会先 inspect 一眼 CMD 和 ENTRYPOINT。

还有一个特别实用的命令——docker system df。它能告诉你镜像、容器、卷各自占了多少空间。

docker system df

输出示例:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          12        5         3.457GB   1.234GB (35%)
Containers      8         3         245MB     102MB (41%)
Local Volumes   4         2         1.1GB     0B (0%)

你看,一目了然。哪里吃空间,哪里能清理,心里有数。

3.3 删除镜像:docker rmi

磁盘空间不够了?那就得动刀了。docker rmi 用来删除一个或多个镜像。

docker rmi [选项] 镜像名或ID [镜像名或ID...]

举例:

docker rmi ubuntu:22.04
docker rmi 7f2b9c3d8e1a  # 用 IMAGE ID 删也行

注意:如果镜像正在被某个容器使用(即使是停止状态的容器),也无法直接删除。你会看到类似这样的报错:
Error response from daemon: conflict: unable to remove repository reference "ubuntu:22.04" (must force) - container a1b2c3d4e5f6 is using its referenced image
这时要么删掉那个容器,要么加 -f 参数强制删除(但我个人不太建议乱用 -f,容易留下孤儿层)。

批量删除不用的镜像,我常用这一套组合拳:

# 删除所有悬空镜像(没有标签的)
docker image prune

# 删除所有未被任何容器使用的镜像
docker image prune -a

docker image prune -a 威力很大,能一口气清理掉大量臃肿的中间层。我曾经在 CI 服务器上跑完一轮测试后用这命令,释放了 15GB 空间。

还有个小技巧:想删除所有镜像?

docker rmi $(docker images -q)

用这个之前,先确认你不需要这些镜像了。我被同事误执行过一次,线上环境差点重演了一遍,痛。

3.4 核心知识图谱

我把这三个操作和它们之间的关系,画成一张图,方便你对照着理解。

Docker 镜像基础操作流程 Docker 镜像核心操作流程 远程镜像仓库 本地镜像列表 容器实例 docker rmi docker pull 对应命令速查: 拉取镜像:docker pull [仓库/]名称[:标签] 查看镜像:docker images | docker image ls | docker inspect 删除镜像:docker rmi 名称或ID 空间分析:docker system df prune 清理

我的操作习惯:日常开发时用 docker images --digests 查看镜像的摘要值,这样能精确区分同一个标签的不同版本。在做质控管线的镜像版本管理时,这个摘要值比标签更可靠。

3.5 避坑指南

  • 不要盲目用 :latest:我踩过的坑,不希望你重蹈覆辙。团队协作时,指明的版本号比「最新」靠谱一百倍。
  • 删除前确认镜像是否被引用:用 docker ps -a --filter ancestor=镜像名 查一下,再动手删。我曾经图省事直接 docker rmi -f,结果某个容器热重启失败,那个下午过得真够呛。
  • 定期清理无用镜像:特别是在 CI/CD 环境中,一天能堆积几十个中间层镜像。写个定时任务跑 docker image prune -a --filter "until=48h"(清理 48 小时前的镜像),能省下大量磁盘空间。