容器日志把磁盘吃满,先止血再防复发
容器里的日志把磁盘吃满,是线上最常见也最容易反复发生的一类问题。删一次日志能救急,但如果不把限制写进配置,过几天它还会回来。下面按「先止血、再定位、最后防复发」的顺序走一遍。
一、先看清是谁在占盘
docker system df 会列出镜像、容器可写层、卷和构建缓存各自占多少空间。很多时候看到的是镜像占大头,但真正每天在涨的是某个容器的日志文件。容器日志默认落在 /var/lib/docker/containers/<容器ID>/<容器ID>-json.log,用 du -sh 对这几个目录排序,就能找出增长最快的那一个,再对着容器 ID 去 docker ps 里确认是哪个服务。
二、急着恢复写入,先做临时处理
空间彻底满了会连带影响其他服务,先恢复可用性最重要。清空日志文件要用 truncate -s 0 文件路径,不要直接 rm,因为 rm 之后文件描述符还在,空间不会马上归还,反而让人误判没效果。清理完之后立刻用 df -h 确认使用率下降。
三、把限制写进 daemon.json
临时清理只是止血,根治要在 /etc/docker/daemon.json 里给默认日志加限制:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
改完必须 systemctl reload docker,之后新建的容器才会生效。已经在跑的容器不会自动套用新配置,需要重建容器,或者单独给它加上 --log-opt。这一点经常被忽略,结果第二天发现问题照旧。
四、让应用自己少写日志
日志暴涨的根因往往在应用。把错误日志和调试日志分开,生产环境不要开 debug 级别,异常里不要把整个请求体或大对象打出来。如果确实需要保留完整日志做审计,就在采集端做轮转和归档,而不是让容器本地一直堆着。
五、留一条告警,而不是等人发现
把磁盘使用率和单容器日志文件大小都做成告警,阈值分别设在 80% 和 2GB 左右。告警内容里带上容器名和宿主机,值班的人不用先登录再查就能判断该处理哪台机器。日志问题几乎不会一次消失,真正管用的是那个提前响的告警。
- 点赞
- 收藏
- 关注作者
评论(0)