Docker 使用一段时间后,很多同学会碰到磁盘被占满的情况,运行 docker ps -a 发现一堆已经退出的容器,docker images 里堆积着大量没有标签的镜像,构建缓存更是悄无声息地吃掉几十 GB 空间。这时 docker system prune 命令就派上用场了,它可以一次性清理 Docker 中的无用资源,快速释放磁盘空间。不过这个命令威力不小,用错参数可能把还在用的资源也删掉,下面详细讲解它的使用方法和注意事项。

docker system prune 到底清理哪些资源
执行 docker system prune 时,Docker 会清理以下四类资源:所有已经停止的容器、所有未被任何容器使用的网络、所有悬空镜像(dangling images,即没有标签且没有被容器引用的镜像层)、以及悬空的构建缓存。所谓悬空镜像,是指镜像构建过程中产生的中间层镜像,它们的 REPOSITORY 和 TAG 列都显示为 <none>,这类镜像通常没有保留价值。
默认情况下,该命令不会清理卷,这是出于数据安全考虑,因为卷里往往存放着数据库等重要数据。执行时 Docker 会给出确认提示,需要输入 y 才会继续:
# 基本用法,清理前会询问确认 docker system prune # 直接跳过确认提示 docker system prune -f # 连同未使用的卷一起清理(危险,慎用) docker system prune --volumes
需要注意区分悬空镜像和未使用镜像。悬空镜像是 <none> 标签的中间层,而未被任何容器使用的正常镜像默认不会被清理。如果想把所有未被使用的镜像(包括有完整标签的)也删掉,需要加上 -a 参数,这一点后面会详细说明。
常用参数详解与 prune 命令家族对比
docker system prune 支持几个关键参数。-a 或 --all 表示清理所有未被容器使用的镜像,不仅仅是悬空镜像,这个参数释放空间效果最明显,但也意味着下次启动服务时需要重新拉取或构建镜像。--volumes 表示清理未被使用的匿名卷和命名卷。-f 表示跳过确认,常用于脚本自动化场景。还可以配合 --filter 参数限制清理范围,例如只清理 24 小时之前创建的容器。
# 清理所有未使用的镜像和构建缓存 docker system prune -a # 清理所有未使用资源,包括卷 docker system prune -a --volumes # 只清理 48 小时之前创建的悬空镜像 docker system prune --filter "until=48h" # 组合过滤条件:48小时前且标签为 deprecated 的资源 docker system prune --filter "until=48h" --filter "label=deprecated"
除了 system prune,Docker 还提供了一组针对单一资源的 prune 命令,各有侧重:docker container prune 只清理停止的容器,docker image prune 只清理镜像,docker volume prune 只清理卷,docker network prune 只清理网络,docker builder prune 只清理构建缓存。
| 命令 | 清理对象 | 适用场景 |
|---|---|---|
| docker system prune | 容器、网络、悬空镜像、构建缓存 | 日常磁盘空间维护 |
| docker image prune -a | 所有未使用镜像 | 镜像堆积过多时 |
| docker volume prune | 未使用的卷 | 确认无重要数据后清理 |
| docker builder prune | 构建缓存 | 频繁构建导致缓存膨胀 |
实践建议是:日常维护优先使用分类型的 prune 命令,把 docker system prune 留给需要一次性大扫除的场景,这样控制粒度更细,误删风险更低。
生产环境使用注意事项与安全清理建议
在生产服务器上执行清理命令前,务必做好检查。首先用 docker system df 查看各类资源占用空间的概况,再用 docker system df -v 查看明细,确认哪些空间是可以释放的。特别要检查卷的使用情况,因为 --volumes 参数会删除所有未被容器引用的卷,如果某个数据库容器暂时停止了,它挂载的卷就可能被判定为未使用而遭到删除,造成数据丢失。
# 第一步:查看空间占用概况 docker system df # 第二步:查看详细明细,找出占空间大的镜像和卷 docker system df -v # 第三步:确认无误后执行清理(不加 --volumes 更安全) docker system prune -f
其次要注意正在运行的容器不会被清理,它们引用的镜像和网络也是安全的。但如果服务采用了滚动重启策略,某些镜像当前未被使用,加上 -a 参数后可能被删除,导致旧版本回滚时需要重新拉取镜像。因此生产环境建议只使用默认的 docker system prune,不加 -a 也不加 --volumes,必要时再单独执行 docker image prune 或 docker builder prune。
最后,如果希望定期自动清理,可以写一个简单的定时任务,例如每天凌晨三点执行一次轻量清理,同时通过 --filter 限定时间范围,避免清理掉当天可能还需要回滚使用的资源。对于 Kubernetes 环境下的节点,则更推荐使用专门的镜像垃圾回收机制,而不是手动执行 prune,让系统根据磁盘使用率自动决策,整体会更加稳妥。
docker system pruneDocker清理Docker镜像删除修改时间:2026-09-03 00:36:45