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 Cache | 37.78GB | docker builder ls | docker builder prune -a | 删除所有未关联镜像的构建分层缓存,解决反复 build 堆积占用 | 无风险,不影响容器/镜像运行 | Build Cache |
| Images 悬空镜像 <none> | 包含在 5.327GB 内 | docker images -f dangling=true | docker image prune | 仅清理无 TAG、构建残留的悬空镜像,保留有标签旧镜像 | 极低,不会删除正常镜像 | Images |
| Images 全部闲置镜像 | 5.327GB | docker images | docker image prune -a | 删除所有当前无容器使用的镜像(含悬空镜像、旧版本镜像) | 中,历史旧镜像全部清除 | Images |
| Containers | 98.8MB | docker ps -a | docker container prune | 删除所有已经停止退出的容器,仅保留运行中容器 | 低,不中断在线业务 | Containers |
| Local Volumes | 1.998GB | docker volume ls | docker volume prune | 删除没有任何容器挂载的数据持久卷 | 高,卷内数据库/缓存文件会彻底丢失 | Local Volumes |
组合清理命令
| 清理等级 | 命令 | 减少的统计项 |
|---|---|---|
| 安全轻度清理 | docker system prune | Images(悬空镜像)、Containers、Build Cache |
| 深度完整清理 | docker system prune -a --volumes | Images、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 相同。