今天分享一下如何处理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
:单个日志文件最大 10MBmax-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>)
或者更稳一点:
docker stop
停掉容器docker rm
删除容器使用轮转参数重新 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 实战建议
根据不同场景推荐配置值。
Docker 日志默认设置太坑,一定要手动配置!
最佳实践:
用
json-file
+max-size
+max-file
修改
daemon.json
设置全局默认老容器要么清理日志,要么重启带轮转参数
评论