bigywater.tech
Docker · 80

prune:哪些东西会被删,哪些不会

docker system prune 到底会删什么?container / image / volume / network 各自的 prune 有什么规则,哪些要加 -a?怎么确保不误删别人的东西?这篇在一个有很多其它数据的 Docker 里,全程用标签过滤,逐个验证。

带 label 过滤
全部 prune 都加 --filter label=bwlab=1,别的对象数量前后不变
卷默认只清匿名卷
docker volume prune 不删没人引用的命名卷,加 -a 才删
悬空镜像 0 个
这个镜像存储下重新构建同名 tag 不会留下悬空镜像,image prune 不带 -a 没东西可删

先限定范围

实测 · 本机执行输出
  现有:exited、running、created 各一个(都带 bwlab 标签)
  docker container prune -f --filter label=bwlab=1 输出:Deleted Containers: | 8541f591a9dc61367cd4c4db638795a7a30d4c13c23668c222c6270a39650fc7 | 688a1a406683a7a0318c9d5f9daba7e6bb8c39856591f1ede605b0d43c9ecf07 |  | Total reclaimed space: 8.192kB
  剩下的 bwlab 容器:['bwlab-c75-running Up Less than a second']

这台 Docker 里有别的项目的容器、卷、镜像,所以我给自己创建的每个对象打了标签 bwlab=1,每次 prune 都带 --filter label=bwlab=1。不带过滤的 prune 会清理所有符合条件的对象,在共用的机器上先想清楚再运行。

容器与镜像

实测 · 本机执行输出
  现有:bwlab-c75-img:latest(被 tag 为 :old,别的 bwlab 镜像无)
  docker images --filter dangling=true --filter label=bwlab=1 → 0 个悬空镜像
  docker image prune -f --filter label=bwlab=1:Total reclaimed space: 0B
  之后 bwlab-c75-img 镜像还在吗?在
  docker image prune -a -f --filter label=bwlab=1:Deleted Images: | untagged: bwlab-c75-img:latest | untagged: bwlab-c75-img:old | deleted: sha256:b28fa84b254c56d14eba4ef72654d649b085a85c04f56c82472c21b6cfade177 |  | Total reclaimed space: 9.723kB
  之后 bwlab-c75-img 还在吗?没了

container prune 删所有已停止的容器(exited、created),不管运行中的;image prune 默认只删悬空镜像,加 -a 才删所有没有容器使用的镜像。

卷

实测 · 本机执行输出
  现有:一个命名卷 bwlab-c75-named(带标签),以及 run --rm -v /anon-data 留下的匿名卷:12 个悬空卷(含别人的)
  docker volume prune -f --filter label=bwlab=1:Total reclaimed space: 0B;bwlab-c75-named 还在吗?在
  docker volume prune -a -f --filter label=bwlab=1:Deleted Volumes: | bwlab-c75-named |  | Total reclaimed space: 0B;bwlab-c75-named 还在吗?没了

volume prune 默认只清匿名卷,命名卷即使没有容器引用也保留;加 -a 才删。数据在卷里,所以这是个安全的默认。

网络

实测 · 本机执行输出
  docker network prune -f --filter label=bwlab=1:Deleted Networks: | bwlab-c75-net

network prune 删除没有任何容器连接的自定义网络。

验证

实测 · 本机执行输出
  整个 Docker 里的容器 8 → 8,镜像 7 → 7,卷 19 → 19,网络 4 → 4(我的对象已全部清理,数量应与开始时一致)
  本实验的对象还剩:(0, 0, 0, 0)

前后对比整个 Docker 的对象数量(容器 8、镜像 7、卷 19、网络 4)没有变化,说明过滤起了作用。

分步演示

docker prune
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。所有 prune 都带 --filter label=bwlab=1,只作用于本实验创建的对象;没有运行 docker system prune 和 docker builder prune(它们会影响共用的数据和构建缓存);前后对象数量用 docker ps / images / volume ls / network ls 统计;实验后已全部清理
    • 没有验证:docker system prune 的行为(不运行)、docker builder prune 的规则(until、keep-storage)、prune 与正在使用的镜像层的关系、--filter until=的效果、prune 之后磁盘空间的实际释放(Docker Desktop 虚拟机磁盘不会自动缩小)
    京ICP备2026067502号-1京公网安备11010502063487号