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 图概括了从拉取到删除的完整生命周期,同时也标出了几个容易踩坑的点。建议你保存下来,平时操作时对照看看。
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 生成特征学习环境镜像。到那时候,今天讲的这些管理技巧就是你的基本功了。