2.3 镜像清理与搬运词条:rmi、prune、save、load


2.3 镜像清理与搬运词条:rmi、prune、save、load

本节摘要:镜像的退役与出差同样需要词条:docker rmi 按引用删,docker image prune 按规则批量清,docker save 与 docker load 负责把镜像打成 tar 包在无外网环境间搬运。本节讲清悬空与未使用这两种"可删状态"的判定差异,给出磁盘告警时的清理决策顺序,以及导出归档的完整会话。

「悬空镜像」是贰部出场率最高的行话——2.1 的清单里那行 <none> <none> 就是它。镜像越攒越多之后,删什么、留什么、怎么把镜像送到没有外网的机器上,就是本节要解决的问题。清理讲究不伤及无辜,搬运讲究内容一致,两件事各有固定套路。

词条卡:docker rmi

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

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 与 docker load

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 出来的包才是逐位一致的。

本节要点回顾

  • rmi 先摘名后删层:输出 Untagged 与 Deleted 的区别就是引用与内容的关系;被容器引用时删不动,报错里带着容器 ID。
  • 悬空与未使用是两种状态:prune 只清前者,-a 才动后者;清理按伤害从小到大走。
  • Total reclaimed space 是清理的成绩单,配合 df 复核磁盘。
  • save/load 是镜像的行李箱:完整保留分层与标签,跨机房必带校验和。
  • save/load 与 export/import 别混用:前者镜像、后者容器快照。

镜像的进、造、清、搬到此齐备。叁部把镜头对准镜像的运行态:容器从创建到销毁的每一条命令词条。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U