目录

Docker 磁盘空间分析与清理

磁盘占用概览

root@Tower:~# docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          40        25        41.17GB   5.327GB (12%)
Containers      25        22        1.641GB   98.8MB (6%)
Local Volumes   58        6         2.034GB   1.998GB (98%)
Build Cache     648       0         48.04GB   37.78GB

分类清理明细

分类可回收空间查询指令清理指令清理内容说明风险执行后减少的统计项
Build Cache37.78GBdocker builder lsdocker builder prune -a删除所有未关联镜像的构建分层缓存,解决反复 build 堆积占用无风险,不影响容器/镜像运行Build Cache
Images 悬空镜像 <none>包含在 5.327GB 内docker images -f dangling=truedocker image prune仅清理无 TAG、构建残留的悬空镜像,保留有标签旧镜像极低,不会删除正常镜像Images
Images 全部闲置镜像5.327GBdocker imagesdocker image prune -a删除所有当前无容器使用的镜像(含悬空镜像、旧版本镜像)中,历史旧镜像全部清除Images
Containers98.8MBdocker ps -adocker container prune删除所有已经停止退出的容器,仅保留运行中容器低,不中断在线业务Containers
Local Volumes1.998GBdocker volume lsdocker volume prune删除没有任何容器挂载的数据持久卷高,卷内数据库/缓存文件会彻底丢失Local Volumes

组合清理命令

清理等级命令减少的统计项
安全轻度清理docker system pruneImages(悬空镜像)、Containers、Build Cache
深度完整清理docker system prune -a --volumesImages、Containers、Build Cache、Local Volumes

镜像闲置判定逻辑

Docker 判断镜像是否闲置,只看有没有容器直接以该镜像为基础创建,不看分层继承关系。

匿名数据卷的产生原因与规避

Dockerfile 写了 VOLUME /tmp(父目录),而容器挂载只映射 /tmp/scrapling-profiles 这个二级子文件夹,没有完整覆盖父目录 /tmp。Docker 规则:只要父目录被声明为 VOLUME,即便只挂载里面一个子文件夹,整个 /tmp 底层依然会自动生成匿名数据卷,占用 Local Volumes。

挂载方式对比

会生成匿名卷(只挂二级路径):

- /mnt/xxx:/tmp/scrapling-profiles

/tmp 父目录未覆盖 → 自动创建匿名 volume。

不会生成匿名卷(直接挂载父目录):

- /mnt/xxx:/tmp

完整顶替镜像声明的 VOLUME 路径,不会多出数据卷。

注意:只要挂载的是二级目录(而非父目录本身),即使使用具名卷(named volume),父目录 /tmp 依然会自动生成匿名数据卷,原理与 bind mount 相同。