docker system df显示磁盘占用与du实测overlay2大小差异的原因
docker system df 与 du 测量磁盘占用存在差异的原因 我使用Docker版本18.03.1-ce,该版本支持
docker system df命令,计算其输出的总大小为1147.5 MB;但通过du -hs /var/lib/docker/overlay2/命令测量目录大小,得到的结果是2.7G,两者存在明显差异,请问这是什么原因导致的?
核心差异原因
docker system df仅统计被活跃资源引用的内容docker system df只会计算当前被容器、镜像、卷等活跃Docker对象使用的层和数据。但overlay2目录里通常会存在大量悬空(dangling)层——比如旧镜像更新后遗留的未被引用的层、删除镜像时未清理干净的残留文件,或者中断的镜像构建产生的中间层,这些资源不会被docker system df统计,但du会把整个目录下的所有文件都算进去。你可以执行docker system df -v查看详细的悬空资源占用,这部分往往是差异的主要来源。OverlayFS写时复制(CoW)机制的逻辑与物理占用差异
OverlayFS采用写时复制机制,容器对镜像层的修改会以增量形式写入新的层文件。docker system df统计的是逻辑占用:比如多个容器共享同一个基础镜像层时,共享部分只会被计算一次;而du统计的是物理磁盘占用,它会把基础层的物理存储加上每个容器独有的写层大小全部算进去。另外,容器运行时产生的临时文件、未被Docker追踪的日志文件等,也会被du统计,但可能不会被docker system df纳入统计范围。Docker内部未被统计的隐藏文件
overlay2目录里除了活跃的镜像和容器层,还可能包含Docker的临时构建工件、缓存文件、内部元数据文件等,这些文件不属于docker system df定义的"活跃资源",因此不会被统计,但它们确实占用物理磁盘空间,会被du计算在内。文件系统层面的额外开销
多数文件系统会预留一部分空间给root用户或用于存储元数据,du会统计包括这些预留空间在内的实际磁盘占用,而docker system df只是简单累加Docker管理文件的逻辑大小,不会考虑文件系统层面的这些额外开销,这也会导致两者数值出现差距。
内容的提问来源于stack exchange,提问作者Daniel

