Docker 的 overlay2 驱动把“镜像只读层 + 容器可写层”叠成一套文件系统,
因此你在 /var/lib/docker/overlay2/<id>/ 下永远会看到 diff 和 merged 两个体积差不多的目录——这并非“重复存了两份”,而是两种不同视角的同一套数据:
-
diff(upperdir)
容器真正写入的数据落盘位置。
只要 Kafka 日志、索引或其他文件被创建/修改,就会以“copy-up”方式写进这里 。 -
merged
内核挂载点(union mount),把只读镜像层 + diff 叠起来后呈现给容器进程的“完整视图”。
它里面的文件 90% 以上是 inode 复用,并不额外占块设备空间;du会把底层镜像大小也累加进来,所以看上去“一样大” 。
为什么 Kafka 场景下特别明显
- 默认保留 7 天 (
log.retention.hours=168),实时数据不断追加,diff 目录持续增长 。 - 每条 segment 文件先写
.log再刷.index、.timeindex,一次写操作触发多次 copy-up,导致 diff 膨胀更快 。
结论
merged 只是视图,不占额外物理空间;真正吃掉磁盘的是 diff 里的 Kafka 日志文件。
想减少占用,要么
- 缩短保留期 (
KAFKA_CFG_LOG_RETENTION_HOURS=24等) , - 把
/var/lib/docker挂到独立大分区, - 或者直接挂载宿主机目录到容器,让日志绕开 overlay(不再进 diff)。
解决办法:
简单说就是减少保存量
仅保留1天的数据
sed -Ei 's/^log.retention.ms\s*=.*/log.retention.ms=86400000/' server.properties