今天分享一下如何处理Docker日志的问题。

1 Docker日志好坑

Docker 默认使用的是 json-file 日志驱动。日志会一直写,一直写,一直写……没有限制、没有轮转、没有清理!

日志默认位置:

/var/lib/docker/containers/<container-id>/<container-id>-json.log

当你发现它时,可能已经:

  • 占了几十个 G

  • 吃满了磁盘

  • 服务都挂了!

2 如何处理日志问题

主要通过日志轮询方式处理。下面介绍三种方式设置日志轮询

2.1 运行容器时设置轮转策略(推荐)

docker run -d \
  --name myapp \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myapp:latest

参数解释:

  • max-size=10m:单个日志文件最大 10MB

  • max-file=3:最多保留 3 个轮转文件(最多 30MB)

容器总日志控制在 30MB 内,绝不爆炸!

2.2 修改 Docker 配置

该配置适用于所有容器

编辑配置文件 /etc/docker/daemon.json

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5"
  }
}

重启 Docker 服务:

systemctl restart docker

注意:只对之后创建的容器生效!

2.3 正在运行的容器

你可以这样快速清理日志(生产环境慎用!):

echo "" > $(docker inspect --format='{{.LogPath}}' <container-id>)

或者更稳一点:

  1. docker stop 停掉容器

  2. docker rm 删除容器

  3. 使用轮转参数重新 run容器

2.4 禁用日志输出

这个操作慎用,有可能影响应用运行,而且不方便后续排查

docker run --log-driver=none 容器名

2.5 批量删除所有容器日志

#!/bin/sh 
  
echo "======== start clean docker containers logs ========"  
  
logs=$(find /data/docker/containers/ -name *-json.log)  
  
for log in $logs  
        do  
                echo "clean logs : $log"  
                cat /dev/null > $log  
        done  

echo "======== end clean docker containers logs ========"

3 实战建议

根据不同场景推荐配置值。

场景

建议参数

开发环境

max-size=5m

max-file=3

测试环境

max-size=10m

max-file=5

生产环境

max-size=50m

max-file=10

Docker 日志默认设置太坑,一定要手动配置!

最佳实践:

  • json-file + max-size + max-file

  • 修改 daemon.json 设置全局默认

  • 老容器要么清理日志,要么重启带轮转参数