Docker日志默认全部输出到json文件,不加控制会撑爆磁盘。我见过生产环境因为日志文件把/var/lib/docker占满导致容器集体挂掉的案例。直接说怎么管、怎么清。
日志去哪了
默认日志驱动是json-file,每个容器对应一个文件,路径:
/var/lib/docker/containers//-json.log
查看某个容器日志文件大小:
du -sh /var/lib/docker/containers/$(docker inspect –format='{{.Id}}’ )/*-json.log
或者直接看宿主机上所有容器日志占的空间:
find /var/lib/docker/containers/ -name “*-json.log” -exec du -ch {} + | tail -1
限流:启动时配置
最干净的做法是在容器启动时限制日志大小和文件数量。docker run加参数:
docker run –log-opt max-size=10m –log-opt max-file=3 your-image
这样每个日志文件最大10MB,保留最近3个文件,超过就滚动删除。注意这不会删除已有的日志,只对新产生的日志生效。
全局配置:修改daemon.json
想对所有容器生效,编辑/etc/docker/daemon.json(没有就创建):
{
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “10m”,
“max-file”: “3”
}
}
重启docker:
systemctl restart docker
已存在的容器不受影响,需要重建容器才会应用新配置。所以改完配置后,对线上容器逐个docker rm再docker run重建。
清理已有日志
不重建容器,直接清文件。推荐用truncate而不是rm,因为rm掉文件后docker可能继续写,导致磁盘空间不释放(文件句柄还活着)。
truncate -s 0 /var/lib/docker/containers//-json.log
如果只想清某个容器:
truncate -s 0 /var/lib/docker/containers/$(docker inspect –format='{{.Id}}’ )/*-json.log
脚本定期清理
写个定时任务,每天凌晨清一次日志。脚本内容:
#!/bin/bash
find /var/lib/docker/containers/ -name “*-json.log” -type f -size +100M -exec truncate -s 0 {} \;
加到crontab:
0 3 * /usr/local/bin/clean_docker_logs.sh
注意:如果日志写入很频繁,建议把max-size设小一点,比如5m,配合max-file=2,几乎不会出现大文件。
切换日志驱动
json-file的缺点是日志文件不压缩、不支持远程收集。如果业务日志量大,建议换journald或直接配日志收集器(如fluentd、logstash)。
用journald驱动:
{
“log-driver”: “journald”
}
日志会走systemd journal,用journalctl查看:
journalctl -u docker -f –since “5 min ago”
journald自带日志轮转,配置在/etc/systemd/journald.conf里,改SystemMaxUse=500M限制总大小。
生产环境建议
在雨云上部署容器时,我习惯把daemon.json配好,max-size=10m,max-file=3。雨云的SSD性能不错,但日志频繁写入还是会影响磁盘IO,限流后明显改善。如果业务日志需要持久化,用volume挂载到独立数据盘,避免撑爆系统盘。
说一个坑:docker logs命令会读取json.log文件,如果你truncate了文件,docker logs会读到空内容,但容器正常跑。如果依赖docker logs查问题,建议保留至少一个日志文件,或者用docker logs –tail 100实时看100行。
总结一下:启动时加log-opt限制,全局配daemon.json兜底,定时脚本清理残留大文件。别等到磁盘报警再动手。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。



暂无评论内容