bigywater.tech
Docker · 79

docker system df:镜像、容器、卷和构建缓存各占多少

docker system df 的四行各算什么?写 30 MB 数据到不同的地方,它们各涨多少?Reclaimable 到底怎么定义?这篇制造已知大小的数据,逐项对照数字。

+63.0 MB
一个 30 MB 随机层的镜像,在 Images 和 Build Cache 两行各增加的大小
+31.0 / +31.5 MB
往卷、往容器可写层写 30 MB 随机数据后,对应一行的增量
Reclaimable
没有被容器引用的卷和镜像所占的大小,起容器引用后立刻变小

四行

实测 · 本机执行输出
  Images         TotalCount=7 Active=1 Size=1.573GB Reclaimable=273.8MB (17%)
  Containers     TotalCount=8 Active=8 Size=10.04MB Reclaimable=0B (0%)
  Local Volumes  TotalCount=19 Active=8 Size=6.818GB Reclaimable=267.8MB (3%)
  Build Cache    TotalCount=662 Active=9 Size=4.458GB Reclaimable=4.242GB
  JSON 字段:['Active', 'Reclaimable', 'Size', 'TotalCount', 'Type']

Images、Containers(可写层)、Local Volumes、Build Cache。每行有总数(TotalCount)、在用的数(Active)、大小和可回收大小。

同样 30 MB 在不同行

实测 · 本机执行输出
  往命名卷写 30 MB 随机数据:Local Volumes Size 6.818GB → 6.849GB(增加 31.0 MB);Containers 行增量 0.0 MB(--rm 容器已删除)
  容器可写层写 30 MB:Containers Size 10.04MB → 41.5MB(增加 31.5 MB);TotalCount 8 → 9,Active 8 → 9
  构建带 30 MB 随机层的镜像:Images Size 1.573GB → 1.636GB(增加 63.0 MB);Build Cache Size 4.458GB → 4.521GB(增加 63.0 MB)

卷里的数据和容器可写层里的数据按实际字节计(增量约 31 MB,含元数据);镜像按「压缩内容加解包后的层」计,所以 30 MB 随机数据变成 63 MB;构建缓存里同样的层又计一份。这些增量是在一个本来就有不少数据的 Docker Desktop 里测的,可能受其它活动影响。

可回收

实测 · 本机执行输出
  现在:卷 Reclaimable=299.3MB (4%),容器 Reclaimable=0B (0%),镜像 Reclaimable=323.2MB (19%)
  删掉那个运行中的容器后:Containers Size 41.5MB → 10.04MB;容器 TotalCount 9 → 8
  命名卷 bwlab-c74v 现在没有容器引用:Local Volumes Reclaimable 299.3MB (4%) → 299.3MB (4%)(这个卷里有 30 MB)
  镜像 bwlab-c74img 没有被任何容器使用:Images Reclaimable 323.2MB (19%) → 323.2MB (19%)
  起一个使用这个卷和这个镜像的容器:Local Volumes Reclaimable 299.3MB (4%) → 267.8MB (3%);Images Reclaimable 323.2MB (19%) → 260.3MB (15%)

Reclaimable 是没有被任何容器引用的部分:没有容器使用的镜像、没有容器挂载的卷。起一个容器引用它们,可回收立刻变小。docker prune 回收的就是这部分(见下一篇)。

分步演示

docker system df
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。docker system df --format json 取数,单位换算成 MB 后相减;Docker Desktop 里还有其它项目留下的镜像、卷和构建缓存(Build Cache 就有 4.458GB),所以只看增量;随机数据用 /dev/urandom(几乎不可压缩);实验后已删除我创建的卷、容器、镜像
    • 没有验证:docker system df -v 的逐对象数据(c18 里用过 SHARED / UNIQUE)、Reclaimable 百分比的分母、构建缓存的回收条件(最近使用时间)、Build Cache 里 63.0 MB 与 Images 里的 63.0 MB 是否就是同一份数据(只看到数字相同)
    京ICP备2026067502号-1京公网安备11010502063487号