回收未引用的数据卷
docker volume prune 批量删除没有任何容器引用的卷。它的语义随版本变化:Docker 23.0 起默认只删匿名卷,加上 -a/--all 才会包含未被使用的命名卷;更早的版本默认就会把命名卷一起删。执行前的稳妥顺序是先列出待删清单核对,再执行,最后用 docker system df 对比占用,确认释放量符合预期。
基本信息
| 默认行为 | 23.0 及以后只删未使用的匿名卷;老版本默认连命名卷一起删 |
|---|---|
| -a / --all | 连未被使用的命名卷一并删除,危险等级明显更高 |
| -f / --force | 跳过交互确认,只在明确知道清单内容时用于脚本 |
| 执行前核对 | docker volume ls --filter dangling=true 列出将被删除的卷 |
| 执行后验证 | docker system df -v 对比清理前后的卷数量与占用 |
| 作用范围 | 只影响本机 Docker 引擎,不涉及其他节点或备份系统 |
典型使用场景
- 构建机磁盘告急:历史构建产生大量匿名卷,清理后可直接回收空间
- CI Runner 定期维护:每次流水线结束清理未引用的临时卷
- 宿主机迁移或重装前回收闲置卷,减少需要搬运的数据量
- 排查「磁盘被占用但看不到大文件」,确认是 dangling 卷累积所致
- 编排下线后清理残留卷:确认项目不再需要数据后按项目维度回收
安全的清理流程
安全的清理流程
docker volume ls --filter dangling=true # 先看清将被删除的卷有哪些
docker volume ls -q | wc -l # 统计总数,便于清理后对比
docker ps -a --filter volume=卷名 # 反查是否仍有容器在引用
docker volume prune # 默认只清匿名卷(23.0 及以后)
docker system df -v | head -20 # 对比清理前后的占用
docker volume ls # 复查残留,确认清单符合预期卷类型与默认行为
| 类型 | 产生方式 | prune 默认是否删除 | 数据风险 |
|---|---|---|---|
| 匿名卷 | docker run 未指定名称时自动创建 | 23.0 及以后默认删除 | 较低,通常是临时数据,可重建 |
| 命名卷 | docker volume create 或 compose 声明 | 需加 -a 才会删除 | 高,常承载数据库与业务持久化数据 |
| compose 项目卷 | compose 自动加项目前缀与标签 | 同命名卷 | 中,项目重建可恢复结构,但旧数据不回来 |
| 绑定挂载目录 | -v /宿主路径:/容器路径 | 不受影响 | 数据在宿主文件系统上,prune 不触碰 |
prune 不进回收站,删除即不可恢复。命名卷里常有数据库数据,使用 -a 之前必须确认不存在「容器已停但数据仍需保留」的卷,典型场景是 compose down 之后还打算重新挂载的卷。
升级 Docker 前确认脚本是否依赖旧语义:老版本 prune 默认会删命名卷,升级后同一脚本行为改变。自动化里不要用 -f 掩盖清单核对步骤,至少把 dangling 列表写入日志再执行。