磁盘容量杀手!docker容器挂载到本地文件日志排查。


docker容器日志排查与管理经验文档

1. 问题背景

在使用 RagFlow 系统时,发现服务器 /home 分区磁盘使用量异常增高,需要排查大文件并管理容器日志,避免日志无限增长导致磁盘占满。


2. 定位大文件及目录

  1. 查看 /home 下各目录占用情况:
sudo du -h --max-depth=1 /home | sort -hr | head -20

输出示例:

2.9T    /home
1.1T    /home/docker-data
605G    /home/xugq
...

分析:

  • /home/docker-data 占用 1.1T,显著高于其他目录,需要进一步排查。
  1. 排查 /home/docker-data 下大目录:
sudo du -h --max-depth=1 /home/docker-data | sort -hr | head -10

输出示例:

925G    /home/docker-data/containers
104G    /home/docker-data/overlay2
24G     /home/docker-data/volumes
...

分析:

  • /home/docker-data/containers 占用 925G,是主要的大文件来源。
  1. 进入大容器目录,查看具体容器占用:
sudo du -h --max-depth=1 /home/docker-data/containers | sort -hr | head -10

输出示例:

925G    /home/docker-data/containers/bfcce787f0d0a1694c267fb897572a2fc1de6824f1f5221fd3f63309fa9a67af
...

分析:

  • 该容器日志文件占用几乎全部空间。
  1. 定位大文件:
sudo find /home/docker-data/containers/bfcce787f0d0a1694c267fb897572a2fc1de6824f1f5221fd3f63309fa9a67af -type f -exec du -h {} + | sort -hr | head -20

输出示例:

925G    .../bfcce787f0d0a1694c267fb897572a2fc1de6824f1f5221fd3f63309fa9a67af-json.log
8.0K    .../config.v2.json
...

结论:

  • bfcce787f0d0a1694c267fb897572a2fc1de6824f1f5221fd3f63309fa9a67af-json.log 是主要的大文件,占用 925G。

3. 查看日志内容

sudo tail -n 100 /home/docker-data/containers/.../bfcce787f0d0a1694c267fb897572a2fc1de6824f1f5221fd3f63309fa9a67af-json.log

输出显示:

  • 日志中大量 Redis 连接失败信息:
valkey.exceptions.ConnectionError: Error -3 connecting to redis:6379. Temporary failure in name resolution

结论:

  • 日志快速增长的原因是容器内部尝试连接未启动的 Redis 服务。

4. 清理日志文件

  1. 先截断大日志文件,释放空间:
sudo truncate -s 0 /home/docker-data/containers/.../bfcce787f0d0a1694c267fb897572a2fc1de6824f1f5221fd3f63309fa9a67af-json.log
  1. 验证文件大小已清空:
ls -lh /home/docker-data/containers/.../*.log

5. 配置日志滚动更新

为了防止日志文件再次无限增长,使用 logrotate 对 Docker 容器日志进行管理。

  1. 创建 logrotate 配置文件 /etc/logrotate.d/ragflowplus-container:
/home/docker-data/containers/bfcce787f0d0a1694c267fb897572a2fc1de6824f1f5221fd3f63309fa9a67af/*.log {
    size 100M
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

说明:

  • size 100M:日志达到 100M 时轮转。
  • rotate 7:保留最近 7 个压缩日志。
  • compress:轮转后的日志压缩。
  • copytruncate:在轮转时截断原日志,避免 Docker 持续写入失败。
  1. 测试配置(调试模式):
sudo logrotate -d /etc/logrotate.d/ragflowplus-container

输出显示:

  • 已识别日志文件,执行轮转操作(拷贝并截断)。
  • 注意:-d 模式仅调试,不真正执行轮转。
  1. 强制执行轮转(首次清理):
sudo logrotate -f /etc/logrotate.d/ragflowplus-container

验证:

ls -lh /home/docker-data/containers/.../
  • 看到日志文件被截断,新生成 .1.gz 等压缩轮转文件。

6. 总结与经验

  1. 快速定位大文件方法:

    • du -h --max-depth=1 | sort -hr | head -n 20
    • find ... -type f -exec du -h {} + | sort -hr | head -20
  2. 排查日志文件内容:

    • tail -n 100 查看最后日志。
    • 日志快速增长可能是服务错误或循环报错。
  3. 清理大日志文件:

    • truncate -s 0 截断日志,快速释放空间。
  4. 配置滚动更新日志防止重复问题:

    • 使用 logrotate,配置 size、rotate、compress、copytruncate。
    • 可通过调试模式检查配置:logrotate -d。
    • 强制执行首次轮转:logrotate -f。
  5. 注意事项:

    • Docker 默认容器日志可能无限增长,特别是服务报错频繁时。
    • 定期检查大文件和日志轮转状态。
    • 对多容器系统,可针对每个容器单独配置 logrotate。
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐