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