讲解
Docker 用久了,磁盘会被四类东西悄悄吃掉:停止的容器(可写层还在)、悬空镜像(构建迭代留下的 层)、不再使用的构建缓存(BuildKit 的 cache,往往是最大的头)、无主卷(容器删了卷还在)。排查从 docker system df 开始——它按镜像/容器/卷/构建缓存分类列出占用与可回收量;docker system df -v 给出逐项明细。
清理命令按爆炸半径从小到大:docker container prune(删所有停止的容器)、docker image prune(默认只删悬空镜像,-a 连「没有容器在用的镜像」一起删——会逼你下次重新 pull)、docker volume prune(删无主卷,数据库卷要是没容器挂着会被删,最危险的一个)、docker builder prune(清构建缓存)。一把梭是 docker system prune(容器+网络+悬空镜像),加 -a 和 --volumes 则全清——生产机器上敲它之前,想清楚哪些镜像本地没有备份、哪些卷里还有数据。
更好的习惯是源头减量:一次性容器加 --rm 自动清理;构建打标签别留 ;CI 节点定期 builder prune;数据库卷用明确的命名卷并纳入备份流程,让它们永远不落入「无主」集合。本章的示例只执行只读和本教程自建资源的清理;prune 类命令以示意方式给出,避免误伤你机器上的其他数据。
示例
看分类占用(只读操作,随时可执行):
docker system df
找出本教程创建的资源(按名字前缀过滤,只看不删):
docker images --filter "reference=ohmydocs-verify-*" --format '{{.Repository}}:{{.Tag}} {{.Size}}'
删除一个本教程的镜像并确认空间回收(rmi 只动指定对象,安全):
docker rmi ohmydocs-verify-pinger:1.0 >/dev/null 2>&1; docker images --filter "reference=ohmydocs-verify-pinger*" --quiet | wc -l | tr -d ' '
prune 家族的标准用法(在你自己的环境按需执行,此处不运行):
# 仅示意:删停止的容器与悬空镜像(相对安全)
docker container prune -f && docker image prune -f
# 仅示意:清构建缓存(下次全量构建变慢, 但常常能回收几十 GB)
docker builder prune -f
# 仅示意:一把梭——含未被使用的镜像与无主卷, 生产机慎用
docker system prune -a --volumes
常见坑
- volume prune 删了数据库:「无主」不等于「无用」——容器临时删掉期间,它的卷就是无主卷。prune 卷之前先备份。
- image prune -a 之后部署失败:节点上没留镜像、仓库又拉不动;清理策略要匹配网络环境。
- 日志不在 df 统计里:容器 json-file 日志单独占盘(/var/lib/docker/containers),日志轮转(logs 章节)和 prune 是两件事。
- df 的 RECLAIMABLE 误读:那是「可回收上限」,共享层的镜像删一个标签并不回收整层。
小结
df 看分布,四类垃圾各有 prune;--rm 与标签纪律从源头减量;volume prune 是最危险的一个。下一章综合实战:容器化一个 Node.js 应用。