docker compose 环境中的“磁盘碎片”实为exited容器、悬空镜像、闲置卷、冗余网络和构建缓存五类孤立资源,长期积累显著占用磁盘空间;需通过docker system df定位、分类执行prune命令安全清理,并配置日志限制与--rm模式从源头预防。

磁盘碎片在 Docker Compose 环境中其实不是传统意义上的文件系统碎片,而是指分散、孤立、未被引用的资源——比如 exited 容器、悬空镜像、闲置卷、冗余网络和构建缓存。这些“碎片”长期积累会显著吞噬磁盘空间,尤其在 macOS 和 Linux 开发环境中尤为明显。真正有效的清理,关键在于识别并分类回收这五类残留资源。
识别碎片:先看清楚谁占了空间
执行以下命令,快速定位空间大户:
- docker system df:显示 Images、Containers、Local Volumes、Build Cache 四类资源的总用量与可回收量(reclaimable)
- docker ps -a --filter "status=exited":列出所有已退出但未删除的容器(它们仍保留可写层)
- docker volume ls --filter "dangling=true":查找未被任何容器挂载的“悬空卷”(常见于反复 docker-compose up/down)
- docker images --filter "dangling=true":查看无标签的中间镜像层(build 过程中产生的冗余层)
安全清理:按需释放,不伤业务
推荐日常维护使用组合命令,兼顾效率与安全性:
- docker-compose down:停止服务并移除容器+默认网络(保留卷和镜像)
- docker container prune -f:清理所有已停止容器(含非 compose 管理的 exited 容器)
- docker image prune -f:删除所有 dangling 镜像(不影响正在运行或有标签的镜像)
- docker network prune -f:清除未被使用的自定义网络
这组操作不会误删正在运行的服务或持久化数据卷,适合每日/每次开发迭代后执行。
深度清理:重置环境时的彻底回收
当需要完全清空项目痕迹(如 CI 流水线重建、本地环境重装),可使用:
- docker-compose down --volumes --rmi all:停服务 + 删卷 + 删所有关联镜像(包括拉取的基础镜像,前提是无其他容器依赖)
- docker volume prune -f:强制删除所有未被挂载的卷(⚠️注意:此操作不可逆,确认无重要数据)
- docker builder prune -af:清理构建缓存(尤其是 buildx 多阶段构建产生的中间产物)
建议搭配 docker system prune -a -f --volumes 使用,但务必提前确认当前无其他项目依赖共享资源。
预防碎片:从源头减少残留
避免反复堆积,比事后清理更重要:
- 在 /etc/docker/daemon.json 中配置日志限制:
{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}} - Compose 文件中为服务显式设置
logging配置,或改用none驱动禁用日志 - 对临时测试服务,使用
docker-compose run --rm启动,退出即自动清理容器 - 定期运行
docker system df监控 reclaimable 比例,超过 40% 就该触发清理流程











