编码代理与终端 · 收录于 2026-08-31 · 适用 1 工具 ✓ 实测验证

docker system prune 到底删什么?容器/镜像/卷/缓存清理边界速查

已验证 2026-08-31prune 删除范围各不同——system prune 默认删停止容器+dangling 镜像+未用网络,不碰卷和 build cache;volume prune 默认只删匿名卷(named 卷要 -a);删前先 docker system df 看占比,共享环境用 --filter label= 圈定。

快速修复(安全清理套路)

# 1. 先看占比,别盲删
docker system df

# 2. 只清确定不要的:停止容器 + dangling 镜像 + 未用网络
docker system prune -f

# 3. 卷是另一个维度,确认后单独清(-a 才会动 named 卷)
docker volume ls -f dangling=true          # 先列出“未用”卷,确认没有要留的
docker volume prune -a -f                  # 或带 label 圈定:--filter label=my-project

# 4. 构建缓存随时可清
docker builder prune -f
# 共享 daemon 上的隔离姿势:所有产物带 label,清理用 filter 圈定
docker run --label my-project=true ...
docker volume create --label my-project=true ...
docker system prune -f --filter label=my-project=true

你会遇到什么

磁盘吃紧想清理 Docker:docker system prune -f 跑完发现空间没怎么回来;docker volume prune 显示 Total reclaimed space: 0B;或者反方向——照着「清理教程」执行后,正在用的镜像/卷被删了,服务起不来。

prune 系列命令的删除范围各不相同,默认值还有反直觉的坑(比如 docker volume prune 默认只删未用的匿名卷,named 卷要 -a 才删——实测确认)。

本文路径:速查表(一条命令一列)→ 安全清理套路 → 实测演示与原理。赶时间直接看「快速修复」。

为什么会这样

prune 家族是「按类别回收」命令,每个命令有自己的默认范围,-a/--volumes/--filter 是范围开关:

命令删除范围备注
docker system prune停止的容器 + dangling 镜像 + 未用网络不碰卷、不碰带 tag 的未用镜像、不碰 build cache
docker system prune -a+ 所有未用镜像(含带 tag)危险:会删掉缓存着但没在用的镜像
docker system prune --volumes+ 未用匿名卷不删 named 卷(help 原文:Prune anonymous volumes)
docker volume prune未用匿名卷默认不删 named 卷(本版本实测,help 原文见下)
docker volume prune -a所有未用卷(含 named)带 --filter label= 可精确圈定
docker container prune停止的容器--filter label= / until=
docker image prunedangling 镜像-a 才含未用带 tag 镜像
docker network prune未用网络--filter label=
docker builder prune构建缓存可安全回收(只影响下次构建速度)

三个默认值最容易踩坑,全部实测:① system prune 默认删停止的容器——你以为只是清缓存,结果所有 docker create/exit 的容器都没了(包括你准备 docker start 复用的);

② 卷是「默认不碰」:system prune 不带 --volumes 一个卷都不删,而 volume prune 默认又只删匿名卷(--help 原文 -a, --all Remove all unused volumes, not just anonymous ones,实测 named 卷在无 -a 时原样保留)——两个默认方向相反,混着用必踩;

③ dangling 镜像 = 被新构建顶掉、没有 tag 的旧镜像(<none>:<none>),image prune 默认只清这类,带 tag 的未用镜像要 -a 才删(实测:system prune 后 prune-demo-img:latest 原样存在)。

确定性推论:删之前先 docker system df 看各类占比;共享环境用 --filter label=你的标识 圈定自己的产物,绝不在共享 daemon 上跑无过滤的 system prune -a。

一步步来

1. 先看空间去哪了 — 必做

docker system df
# Images / Containers / Local Volumes / Build Cache 四类占比,先看再删

2. 删容器 — 按诊断

停止的容器用 docker container prune -f;想精确圈自己的:docker container prune -f --filter label=my-project=true(实测:只删匹配容器)。

3. 删镜像 — 按诊断

docker image prune -f 只清 dangling;-a 会把未用的带 tag 镜像也删(实测:system prune 默认删了 dangling 但 prune-demo-img:latest 保留;docker image rm <tag> 才删带 tag 的)。共享环境别用无过滤 -a。

4. 删卷 — 必做(最容易误删/漏删)

docker volume ls -f dangling=true      # 未用卷清单,先人工确认
docker volume prune -a -f              # 默认只删匿名卷!-a 才含 named

实测:docker volume prune -f 只删了匿名卷,prune-demo-named 原样保留;docker volume prune -a -f --filter label=prune-demo=true 才删掉它。

5. 删构建缓存 — 可做

docker builder prune -f:只影响下次构建速度,不影响镜像/容器。

怎么确认清理安全

删完后 docker ps -a、docker images、docker volume ls 里你需要的都在;docker compose up 能正常拉起(卷数据、带 tag 镜像都还在)。实测演示:system prune(默认)后 tagged 镜像 + named 卷均保留,只有停止容器/dangling/未用网络被删。

其它环境的表现

命令/参数实测行为(docker 29.1.3)
system prune(默认)删停止容器 + dangling 镜像 + 未用网络;卷/tagged 镜像/build cache 保留
system prune -a加删所有未用镜像(含带 tag)
system prune --volumes加删未用匿名卷(help 原文)
volume prune(默认)只删未用匿名卷(-a 原文:not just anonymous ones)
volume prune -a删所有未用卷(含 named)
--filter label=容器/卷/网络/镜像均支持,精确圈定(实测)

症状

# 清理后空间没回来(卷没删)
$ docker volume prune -f
Total reclaimed space: 0B        # named 卷默认不删,这就是原因

# 清理教程翻车:正在用的镜像被删
$ docker system prune -a -f      # 未用带 tag 镜像全没了 → 下次启动要重新拉

特征:prune 后空间没变化(卷/带 tag 镜像没被默认覆盖);或反噬(无过滤 -a 删了共享镜像)。

原因

prune 家族各命令默认范围不同:system prune 默认含停止容器与 dangling 镜像但不含卷;volume prune 默认只删未用匿名卷;带 tag 的未用镜像需 -a。共享环境跑无过滤 -a/--volumes 会误删。

解法

  1. docker system df 先看四类占比;
  2. 按目标选命令:容器=container prune、dangling 镜像=image prune、卷=volume prune -a(确认后)、缓存=builder prune;
  3. 共享环境所有产物打 --label,清理用 --filter label= 圈定;
  4. 删完用 docker ps -a / docker images / docker volume ls 复核。
验证证据
  • 本机实测复现(2026-08-31,WSL 定制预构建版,docker 29.1.3;全部演示产物带 label=prune-demo=true,用 --filter label= 隔离,未运行无过滤 system prune):
  • 构造:两次 build 制造 dangling 镜像 + 2 个停止容器(1 个带匿名卷)+ named 卷 + 网络;
  • system prune -f --filter label=prune-demo=true:删 2 容器 + 1 网络 + 1 dangling 镜像(untagged: e71931f35c62),tagged prune-demo-img:latest 与 prune-demo-named 卷保留;
  • volume prune -f:只删匿名卷(25b060c64c02…),named 卷保留;
  • volume prune -a -f --filter label=prune-demo=true:删 named 卷;
  • volume prune --help 原文 -a, --all Remove all unused volumes, not just anonymous ones;
  • builder prune -f:本机 build cache 为空,0B(语义验证)。
  • 实测复现日志(2026-08-31)

相关 canonical

按「前置 → 同根 / 同域 / 相关」读:

适用工具 (1)

本问题方案已挂到下列工具的方案页——从工具页也能回到这里,双向可达。

docker · 外部工具

来源与证据

收录 验证 ✓ 实测验证适用 1 工具
方案含本地实测或来源可复核的解法;未实测项已在文中如实标注。

← 编码代理与终端 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡