3. Docker 镜像管理:拉取、查看、删除

镜像管理是 Docker 用得最频繁的操作,没有之一。你想想看,不管是跑 MaxQuant 还是搭建特征学习环境,第一步就是把镜像拿到本地。拉取、查看、删除这三件事看似简单,但里面的坑其实不少。我刚开始接触 Docker 时,就因为不懂清理,硬盘几次被镜像撑爆。嗯,这节课我把这些经验都摊开讲。

3.1 拉取镜像:docker pull 的细节

docker pull 是从镜像仓库(默认 Docker Hub)下载镜像到本地的命令。我个人习惯先指定明确版本标签,而不是裸写 latest,因为 latest 可能随时变,团队协作时容易出问题。

基本语法:
docker pull [选项] 仓库地址/镜像名:标签

比如拉取 Ubuntu 22.04:

docker pull ubuntu:22.04

拉取 MaxQuant 相关的镜像(假设托管在 Docker Hub):

docker pull biocontainers/maxquant:v2.6.0

这里有个小技巧:如果你在代理环境或国内网络慢,可以配置镜像加速器。我曾经在内网部署时,默认 Docker Hub 拉取超时,换成阿里云镜像就稳了。配置方式如下:

# 修改 /etc/docker/daemon.json
{
  "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
# 重启 Docker
systemctl daemon-reload
systemctl restart docker
我的习惯:拉取前先用 docker search 搜索一下镜像可用标签,避免拉错版本。尤其是一些生物信息学镜像,官方可能同时维护多个变种。

3.2 查看镜像:docker images & docker inspect

镜像拉下来后,得看看它占了多大空间、有哪些标签、啥时候创建的。最常用的命令是 docker images(或 docker image ls)。

docker images

输出示例:

REPOSITORY              TAG       IMAGE ID       CREATED       SIZE
ubuntu                  22.04      f9a8a5b8b5f8   2 weeks ago   77.8MB
biocontainers/maxquant  v2.6.0    a1b2c3d4e5f6   3 months ago  1.2GB
python                  3.11      ea2d9c7b6f5e   1 week ago    880MB

如果你需要更详细的元数据(比如环境变量、开放端口、构建历史),用 docker inspect:

docker inspect ubuntu:22.04

输出是 JSON 格式,我经常用它来查镜像的 Entrypoint 和 Env,尤其在调试容器启动失败时。

注意: docker images 显示的是 本地所有镜像,包括那些临时产生的中间层镜像(:)。中间层镜像一般不可直接删除,但会随着顶层镜像删除而被清理。

3.3 删除镜像:docker rmi 与批量清理

删除镜像用 docker rmi(remove image)。基本用法:

docker rmi ubuntu:22.04

如果镜像正在被容器使用,Docker 会拒绝删除。你得先停掉并删除对应的容器:

docker stop 容器ID
docker rm 容器ID
docker rmi 镜像ID

我遇到过最头疼的情况是:悬空镜像(:)堆积如山,手动一个个删太累。这时候用 docker image prune 一键清理:

docker image prune -a -f

-a 表示清理所有未使用的镜像,-f 是强制不提示。不过要注意——它也会删掉那些虽然没引标签但可能被别的镜像依赖的层。我曾经在生产环境执行过这个命令,结果回滚时发现依赖层被删了,镜像拉不出来,不得不重新构建。所以建议先加 --filter 过滤一下:

docker image prune -a --filter "until=24h"

这样只清理 24 小时前未使用的镜像,保留最近的。

3.4 常用命令对比表格

命令 作用 典型场景 是否删除中间层
docker rmi 镜像ID 删除单个镜像 明确知道要删哪个镜像 否(除非是唯一顶层)
docker image prune 删除悬空镜像 清理 : 镜像 是(清理悬空层)
docker image prune -a 删除所有未使用镜像 硬盘告急,大批量清理 是(可能误删依赖层)
docker system prune -a 删除所有未使用资源 彻底大扫除(包括容器、网络、缓存) 是

3.5 镜像管理核心流程

下面这张 SVG 图概括了从拉取到删除的完整生命周期,同时也标出了几个容易踩坑的点。建议你保存下来,平时操作时对照看看。

Docker 镜像生命周期(拉取 · 查看 · 删除) 用户操作 docker pull docker images docker rmi 本地镜像仓库 (分层文件系统) 列表 / 详细信息 (images / inspect) 删除 / 清理 (rmi / system prune) ⚠ 悬空镜像 (<none>:<none>) 占用磁盘但不可直接使用 ✅ docker image prune 清理悬空 / 未使用镜像 慎用 -a 避免删掉依赖层 🔑 关键原则 1. 拉取时指定精确标签,避免 latest 陷阱 2. 删除前确认是否有容器依赖 3. 批量清理先用 --filter 限制范围

3.6 避坑经验汇总

  • 镜像标签踩坑:我去年遇到过,同事在 CI 里写死 python:latest,结果大版本升级后 Python 3.12 语法不兼容,构建炸了。从此我在所有脚本里强制指定 python:3.11-slim 这样的固定标签。
  • 镜像层过多导致磁盘爆炸:频繁构建镜像且不清理,中间层会占大量空间。我曾经在笔记本上调试 MaxQuant 镜像,连着 build 了 20 次,60GB 固态直接标红。解决方案是定期执行 docker system prune -a,但不建议在生产环境乱用。
  • 删除镜像时提示“被容器引用”:别慌,先 docker ps -a 找到对应容器,用 docker rm -f 容器ID 强制删除,再删镜像。注意 -f 会直接干掉运行中的容器,小心数据丢失。
  • 清理完镜像后拉取又慢:如果你把常用镜像都删了,下次用又要重新下载。我的做法是保留最近 3 个版本的镜像,只清理更旧的。可以写个小脚本 + cron 自动执行。
我自己的日常命令清单:
# 查看所有镜像(包括中间层)
docker images -a

# 删除特定镜像
docker rmi myimage:tag

# 清理悬空镜像
docker image prune

# 清理所有未使用镜像(慎用)
docker image prune -a -f

# 查看镜像分层
docker history ubuntu:22.04
特别注意:在共享集群或多用户环境中,不要轻易执行 docker system prune -a,因为你可能删掉别人正在用的基础镜像。建议先跟团队确认,或者使用 docker system df 查看磁盘使用情况,再决定清理哪些。

镜像管理其实是个习惯问题。把拉取、查看、删除三个命令练熟,再配合上面的清理策略,基本不会出大乱子。你在后面搭建 MaxQuant 环境时,会用 docker pull 拉取专用镜像,也可能会自己 docker build 生成特征学习环境镜像。到那时候,今天讲的这些管理技巧就是你的基本功了。