docker system prune 仅清理当前宿主机的未使用资源,包括已停止容器、悬空镜像、闲置网络和构建缓存,不删运行中容器、数据卷、带标签镜像或跨主机资源。
docker system prune 不是“全机房”工具,它只作用于当前 docker 守护进程管理的本地节点。所谓“全机房”需配合集群管理(如 swarm、kubernetes)或批量运维脚本实现,单靠一条 prune 命令无法跨主机清理。
明确作用范围:它只清你这台机器
docker system prune 默认清理当前宿主机上以下四类未使用资源:
- 所有已停止的容器
- 所有悬空镜像(dangling images,即无标签、无容器引用的中间层镜像)
- 所有未被任何容器使用的网络
- 所有构建缓存(builder cache)
它不会触碰正在运行的容器、已挂载的数据卷(volume)、带标签的镜像,也不会连接其他服务器——这是设计使然,也是安全底线。
深度释放的关键参数组合
要真正释放大量空间,需按需叠加参数,但每加一项都意味着更高风险:
- docker system prune -f:跳过确认,适合脚本调用
- docker system prune -a -f:额外删除所有未被容器引用的镜像(含你手动 pull 的、打过 tag 的“备用镜像”)
- docker system prune -a -f --volumes:再进一步,连未被任何容器使用的卷也删掉(⚠️ 卷中数据不可恢复!)
例如,一次较彻底的清理可执行:
docker system prune -a -f --volumes --filter "until=168h"
含义:删掉所有 7 天前未被使用的镜像、容器、网络、缓存和卷,避免误删近期还在调试的资源。
真要管“全机房”,得靠外部编排+批量执行
若你管理的是多台 Docker 主机(比如几十台边缘节点),需借助运维工具统一下发命令:
- 用 Ansible 批量执行:
ansible docker_nodes -m shell -a "docker system prune -a -f --volumes" - 用 SSH 循环调用:
for host in $(cat hosts.txt); do ssh $host 'docker system prune -f'; done - 在 Swarm 集群中,需先
docker node ls查节点,再逐个登录清理(Swarm 不提供跨节点 prune 接口)
注意:生产环境务必提前检查各节点上是否有重要卷或离线容器,建议搭配 docker system df 先看空间分布,再决定是否清理。
防垃圾再生:让清理变自动
光靠手动 prune 治标不治本。推荐加一层定时防护:
- 每日凌晨 2 点自动清理旧资源:
0 2 * * * docker system prune -f --filter "until=24h" > /dev/null 2>&1 - CI/CD 构建机建议每次构建后跑:
docker builder prune -f --keep-storage 5G(保留最多 5GB 缓存) - 开发机可设 crontab 每小时清理退出容器:
0 * * * * docker container prune -f











