容器跑了一个月,日志把磁盘吃满了
上周有台机器报警,磁盘跑到 92%。登上去 df 一看,根分区只剩三个 G。第一反应是找大文件,du 一层一层往下翻,最后停在 /var/lib/docker/containers。
占空间的既不是镜像也不是数据卷,是每个容器目录里那个 xxx-json.log。几个跑得勤的容器各自攒了好几 G,加起来二十多个 G。
原因不复杂。Docker 默认用 json-file 驱动,不设上限就一直往下写,容器不重启它就不会滚。我那台机器上有个每几秒打一次心跳的服务,一个月能写出十几 G。平时不看日志感觉不到,等磁盘红了才暴露。
要治这个事,得分两步走。
新容器好办,启动时带上参数就行,给日志设个大小和文件个数,超了自动轮转。max-size 给 10m,max-file 给 3,一个容器最多占 30m,跑再久也不会失控。
老容器麻烦一点。日志配置是创建时写进容器元数据的,改不了,只能重建。我的做法是先把现有的日志文件清空,把磁盘救回来,再挑时间重建容器。
清空这里有个坑:不要直接 rm 掉日志文件。文件被删了但容器进程还持有句柄,空间不会释放,du 看着降了 df 还是满的。正确做法是把文件内容清空而不是删除,末尾没数据了,内核才会把块真正还回来。
这一步做完,磁盘立刻能回一部分。之后新建的容器都带轮转参数,老容器在下次升级时慢慢换掉。
最后一件事,也是最容易忽略的:这事得有监控。磁盘使用率过 80% 就该报出来,别等 92% 才想起看。我现在的做法是每天定时跑个脚本,几台机器一起查,超阈值就推到手机上。花十分钟写的东西,省掉一次半夜处理。
- 点赞
- 收藏
- 关注作者
评论(0)