bigywater.tech
Docker · 23

层共享:多个镜像共用同一层时磁盘占多少

多个镜像共用同一层,磁盘上到底占多少?docker images 里每个镜像都写着几十 MB,加起来是不是真实占用?这篇用 docker system df -v 的 SHARED / UNIQUE 两列实测。

228.3 vs 61.8 MB
四个镜像的 SIZE 直接相加,与基础镜像加三个 UNIQUE SIZE 的差别
2.104MB
子镜像里 1 MiB 随机文件对应的 UNIQUE SIZE,约等于压缩内容加解包层
Untagged
rmi 基础镜像只去掉名字,子镜像大小不变、继续可用

SHARED、UNIQUE 与不能直接相加

实测 · 本机执行输出
  只有基础镜像时:{'bwlab-c18base': ('55.5MB', '13.58MB', '41.96MB', '0')}
  bwlab-c18z       SIZE   57.6MB  SHARED SIZE  55.53MB  UNIQUE SIZE  2.104MB  CONTAINERS 0
  bwlab-c18y       SIZE   57.6MB  SHARED SIZE  55.53MB  UNIQUE SIZE  2.104MB  CONTAINERS 0
  bwlab-c18x       SIZE   57.6MB  SHARED SIZE  55.53MB  UNIQUE SIZE  2.104MB  CONTAINERS 0
  bwlab-c18base    SIZE   55.5MB  SHARED SIZE  55.53MB  UNIQUE SIZE  1.512kB  CONTAINERS 0
  四个镜像的 SIZE 加起来 228.3 MB;基础镜像加上三个 UNIQUE SIZE 是 61.8 MB(这才是更接近真实占用的数字)

docker system df -v 比 docker images 多了 SHARED SIZE 和 UNIQUE SIZE 两列。子镜像 x、y、z 各自 SIZE 57.6MB,其中 55.53MB 是与别的镜像共用的,只有 2.104MB 是自己独有的。基础镜像在有了子镜像以后,UNIQUE 掉到 1.512kB。

四个 SIZE 加起来 228.3 MB,而更接近真实占用的数字(基础镜像的 SIZE 加三个 UNIQUE SIZE)是 61.8 MB。估算镜像占了多少磁盘时,别把 docker images 的大小相加。我没有去磁盘上量字节数来核对 61.8 MB,它是 docker 自己的统计。

删基础镜像

实测 · 本机执行输出
  docker rmi bwlab-c18base → 退出码 0;输出:Untagged: bwlab-c18base:latest
  剩下的镜像:['bwlab-c18x', 'bwlab-c18y', 'bwlab-c18z']
  bwlab-c18x:SIZE 57.6MB SHARED 55.53MB UNIQUE 2.104MB
  运行 x(仍可用?)退出码 0;1048576 字节

基础镜像的名字被 docker rmi 去掉后,子镜像的 SIZE、SHARED、UNIQUE 都没变,也能照常运行:被引用的层不会被删。

SIZE 是什么

实测 · 本机执行输出
  docker images 的 DISK USAGE 与 CONTENT SIZE:24.1MB / 9.34MB
  docker system df -v:SIZE 24.1MB,SHARED 13.58MB,UNIQUE 10.49MB

这个镜像存储下的 SIZE 把压缩内容和解包后的层加在一起(24.1MB 对压缩内容 9.34MB),所以它不是文件系统里文件的总大小。

分步演示

层共享与磁盘占用
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。随机文件用 os.urandom 生成(几乎不可压缩);镜像大小取 docker system df -v 与 docker images 的输出;镜像在本机构建(--provenance=false --sbom=false);实验后已删除镜像。Docker Desktop 里还有别的镜像和容器,但本文只看名字以 bwlab-c18 开头的镜像
    • 没有验证:去 Docker Desktop 虚拟机磁盘里量真实字节数、容器可写层的占用、经典存储驱动下 SHARED / UNIQUE 的算法、build cache 对占用的影响
    京ICP备2026067502号-1京公网安备11010502063487号