快速修复(安全清理套路)
# 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 prune | dangling 镜像 | -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 会误删。
解法
docker system df先看四类占比;- 按目标选命令:容器=
container prune、dangling 镜像=image prune、卷=volume prune -a(确认后)、缓存=builder prune; - 共享环境所有产物打
--label,清理用--filter label=圈定; - 删完用
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),taggedprune-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
按「前置 → 同根 / 同域 / 相关」读:
- 相关(报错相近,根因不同):
- WSL 报 No space left 但 df 还有空间(同为「空间没了」排查:WSL 虚盘 vs Docker 占用)
- docker compose 起栈失败:依赖没就绪(同批 Docker 域实测 canonical)
适用工具 (1)
本问题方案已挂到下列工具的方案页——从工具页也能回到这里,双向可达。
docker · 外部工具来源与证据
← 编码代理与终端 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡