docker system df 的四行各算什么?写 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 随机数据: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 回收的就是这部分(见下一篇)。