本节摘要:镜像的退役与出差同样需要词条:docker rmi 按引用删,docker image prune 按规则批量清,docker save 与 docker load 负责把镜像打成 tar 包在无外网环境间搬运。本节讲清悬空与未使用这两种"可删状态"的判定差异,给出磁盘告警时的清理决策顺序,以及导出归档的完整会话。
「悬空镜像」是贰部出场率最高的行话——2.1 的清单里那行 <none> <none> 就是它。镜像越攒越多之后,删什么、留什么、怎么把镜像送到没有外网的机器上,就是本节要解决的问题。清理讲究不伤及无辜,搬运讲究内容一致,两件事各有固定套路。
docker rmi [OPTIONS] IMAGE [IMAGE...]
义项:
| 选项 | 含义 | 使用时机 |
|---|---|---|
| 引用名或 ID | 删除指定镜像 | 日常清理 |
-f |
强制删除(含运行中容器引用的) | 确认无主后 |
| 多参数 | 一条命令删多个 | 批量退场 |
$ docker rmi nginx:latest Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container 9f2c41a7b110 is using its referenced image a72860cb95fd $ docker ps --filter ancestor=nginx:latest CONTAINER ID IMAGE STATUS PORTS NAMES 9f2c41a7b110 nginx:latest Up 3 days 80/tcp web-gw
删除失败并不可怕,报错里把"谁在用"都写明白了:容器 9f2c41a7b110 还引用着它。先停掉并删除容器,rmi 才会通过。--filter ancestor 能列出所有基于该镜像的容器,是删镜像前的标准前置检查。这也解释了 rmi 的设计逻辑:镜像层可能被运行中的容器当作文件系统底座,硬删会当场掀桌。
$ docker rm -f 9f2c41a7b110 9f2c41a7b110 $ docker rmi nginx:latest Untagged: nginx:latest
注意输出是 Untagged 而非 Deleted——这表示只摘掉了名字标签,层还在(可能被别的标签或容器共享)。把 2.1 的分层图拿来回想:引用名与内容是分离的,rmi 先摘名,内容等无人引用时才真正删除。
docker image prune [OPTIONS]
义项:
| 选项 | 含义 | 使用时机 |
|---|---|---|
| 无参数 | 只清悬空镜像 | 例行清理,最安全 |
-a |
连未被任何容器使用的镜像一起清 | 磁盘告警时 |
--filter until=24h |
只清创建超过该时长的 | 保守型清理 |
清理不是上来就 -a。按照伤害从小到大的顺序走:

实际会话长这样:
$ df -h /var/lib/docker | tail -n 1 /dev/vda1 98G 91G 2.1G 98% / $ docker image prune WARNING! This will remove all dangling images. Are you sure you want to continue? [y/N] y Deleted Images: deleted: sha256:3f8a2c1d9e4b... Total reclaimed space: 1.2GB $ df -h /var/lib/docker | tail -n 1 /dev/vda1 98G 90G 3.3G 96% /
Total reclaimed space 是本命令最值得看的一行——它告诉你这刀真正砍回了多少。悬空镜像清完仍紧张,才轮到 -a。它清的是"没有任何容器引用"的镜像,所以备而未用的老版本会被一并带走;生产主机上执行前,先用 docker images 扫一遍眼熟的对象,或者用 --filter until=168h 只清足够老的。
docker save [OPTIONS] IMAGE [IMAGE...] # 镜像 → tar 包 docker load [OPTIONS] # tar 包 → 本地镜像
义项:save 支持 -o 文件 指定输出(也支持重定向写法),可一次打包多个镜像;load 支持 -i 文件 读入,压填后会自动恢复原有的标签与分层。
$ docker save -o myweb-0.1.tar myweb:0.1 redis:7.2 $ ls -lh myweb-0.1.tar -rw-r--r-- 1 ops ops 236M Sep 3 14:02 myweb-0.1.tar $ sha256sum myweb-0.1.tar b31ce9a2f0... myweb-0.1.tar
拷贝到目标机器后:
$ sha256sum myweb-0.1.tar b31ce9a2f0... myweb-0.1.tar # 校验一致 $ docker load -i myweb-0.1.tar Loaded image: myweb:0.1 Loaded image: redis:7.2 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE myweb 0.1 8c4e21ab77d2 2 months ago 112MB
load 恢复的镜像连 CREATED 都保持原样——它搬运的是完整分层结构,不是重新构建。校验和核对在跨机房传输里不是仪式感:tar 包损坏时 load 会报 unexpected EOF,与其在目标机器上排查,不如出发前对一遍哈希。顺带分清一个易混词条:save/load 面向镜像,保留分层与标签;export/import 面向容器的文件系统快照,打出来的是扁平包、无历史无标签,两者不可混用。
💡 省流量技巧:同一镜像要分发到多台离线机器时,先在源头 save 一次,校验后复制多份;不要每台机器各自构建——构建时间与结果都可能有差异,save 出来的包才是逐位一致的。
-a 才动后者;清理按伤害从小到大走。镜像的进、造、清、搬到此齐备。叁部把镜头对准镜像的运行态:容器从创建到销毁的每一条命令词条。