docker image prune 默认只删除悬空镜像(即无标签且未被任何容器引用的镜像层);加 -a 参数才删除所有未被容器引用的镜像,包括有标签但未使用的。

docker image prune 会删掉哪些镜像
docker image prune 默认只删除「悬空镜像(dangling images)」——即没有标签(untagged)且不被任何容器引用的镜像层。这类镜像通常出现在 docker build 重新构建同名镜像后,旧的未打标签的层就变成悬空状态。
它不会动你手动打过 tag 的镜像,哪怕那个镜像已经没容器在用了。想清理所有未被使用的镜像(包括有 tag 但无容器引用的),得加 -a 参数:
docker image prune -a
执行前会交互确认,加 -f 可跳过提示。注意:-a 会删掉所有未被运行中或已停止容器引用的镜像,务必先用 docker ps -a 和 docker images 对照检查。
docker volume prune 删除卷前必须确认的三件事
docker volume prune 会直接删除所有「未被任何容器引用」的卷,且不可恢复。容易踩坑的地方有:
- 已停止但未删除的容器,只要声明了
-v或--mount,其关联卷就不会被 prune 到 —— 所以删卷前先跑docker ps -a,把不用的容器docker rm干净 - 用
docker run --rm启动的容器,如果挂载了命名卷(named volume),该卷在容器退出后依然存在,且会被prune当作“无主卷”删掉 - 某些应用(如 PostgreSQL、Redis 官方镜像)默认使用匿名卷存数据,如果你没显式指定命名卷或绑定挂载,
prune不会碰它们 —— 但一旦你改用命名卷又忘了保留,数据就丢了
一次性清理镜像、容器、卷、构建缓存的组合命令
日常开发中常要彻底清场,推荐分步执行,避免误删:
docker container prune -f<br>docker image prune -af<br>docker volume prune -f<br>docker builder prune -f
说明:
-
docker container prune -f清掉所有已停止容器(不含运行中) -
docker image prune -af清掉所有未被容器引用的镜像(含带 tag 的) -
docker volume prune -f清掉所有未被容器声明使用的卷 -
docker builder prune -f清 BuildKit 缓存(Docker 20.10+ 默认启用),这部分常占数 GB 空间,但不影响镜像或卷
注意:docker system prune -af 是上面四者的快捷方式,但它也会顺手删掉网络(docker network prune),而自定义网络若被多个容器共用,删掉会导致容器无法通信 —— 生产环境慎用。
为什么 docker volume prune 后磁盘空间没释放
常见于 Linux 主机上使用 overlay2 存储驱动时:卷数据实际存在 /var/lib/docker/volumes/ 下,但 prune 只删元数据和目录结构,底层文件系统可能因延迟释放或硬链接残留未立即回收空间。
验证方法:
- 运行
du -sh /var/lib/docker/volumes/看目录大小 - 用
lsof +L1检查是否有进程仍打开已删卷里的文件(常见于容器未完全退出) - 重启 Docker daemon 有时能强制释放(
sudo systemctl restart docker),但会中断所有容器
真正保险的做法是:删卷前确保对应容器已 rm,删完再用 find /var/lib/docker/volumes/ -empty -delete 扫一遍空目录 —— 但别直接对 /var/lib/docker 递归操作,风险极高。











