kafka docker容器为何占用空间那么多,轻松上百G, 如何应对?

7 阅读1分钟

Docker 的 overlay2 驱动把“镜像只读层 + 容器可写层”叠成一套文件系统,
因此你在 /var/lib/docker/overlay2/<id>/ 下永远会看到 diffmerged 两个体积差不多的目录——这并非“重复存了两份”,而是两种不同视角的同一套数据

  1. diff(upperdir)
    容器真正写入的数据落盘位置。
    只要 Kafka 日志、索引或其他文件被创建/修改,就会以“copy-up”方式写进这里 。

  2. merged
    内核挂载点(union mount),把只读镜像层 + diff 叠起来后呈现给容器进程的“完整视图”。
    它里面的文件 90% 以上是 inode 复用,并不额外占块设备空间;du 会把底层镜像大小也累加进来,所以看上去“一样大” 。

为什么 Kafka 场景下特别明显

  • 默认保留 7 天 (log.retention.hours=168),实时数据不断追加,diff 目录持续增长 。
  • 每条 segment 文件先写 .log 再刷 .index.timeindex,一次写操作触发多次 copy-up,导致 diff 膨胀更快 。

结论
merged 只是视图,不占额外物理空间;真正吃掉磁盘的是 diff 里的 Kafka 日志文件
想减少占用,要么

  1. 缩短保留期 (KAFKA_CFG_LOG_RETENTION_HOURS=24 等) ,
  2. /var/lib/docker 挂到独立大分区,
  3. 或者直接挂载宿主机目录到容器,让日志绕开 overlay(不再进 diff)。

解决办法:

简单说就是减少保存量

仅保留1天的数据

sed -Ei 's/^log.retention.ms\s*=.*/log.retention.ms=86400000/' server.properties