docker日志膨胀问题

一、问题出现

Docker 已成为开发者的常用工具,但在高负载和高并发的环境下,Docker 容器生成的日志文件可能会迅速膨胀,占用大量磁盘空间,甚至导致系统性能问题。本文将探讨如何有效地管理和减少 Docker 日志的大小,确保日志的高效存储和易于管理。

Docker 默认使用 json-file 日志驱动来记录容器的标准输出和标准错误输出。这些日志通常会存储在 /var/lib/docker/containers/[container-id]/ 路径下,文件名为 container-id-json.log。

随着容器的运行,日志文件会不断增长,甚至变得庞大无比。

二、容器日志清理方案

  • 方案一:手动清理日志文件,可解燃眉之急,治标不治本。
  • 方案二:脚本定期清理日志文件,缺点是日志文件全丢了,无法追溯。
  • 方案三:限制所有容器的日志文件大小,治本,缺点是需要重新创建容器和启动 docker 镜像。

方案一:手动清理方案

echo > /var/lib/docker/containers/容器id/容器id-json.log

方案二:脚本定期清理

#!/bin/sh 

logs=$(find /var/lib/docker/containers/ -name *-json.log)  

for log in $logs  
        do  
                echo "clean logs : $log"  
                echo > $log  
        done

把执行脚本的命令加到 Linux 的定时任务crontab中就可以了

方案三:限制 Docker 容器日志大小

修改/etc/docker/daemon.json配置文件,填写下面的配置

{
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}
}

max-size=500m,表示容器的日志文件大小上限是 500MB, max-file=3,表示容器有三个日志,第一个满了 500MB之后就写第二个,第二个满了 500MB就写第三个,如果第三个满了,就清空第一个日志文件,重新写第一个日志文件,循环模式。

改完之后需要重启 docker 守护进程

systemctl daemon-reload 
systemctl restart docker
注意:
这种方式只对新建的容器有效的,之前的容器不生效。