PinkHello
做一个快乐的程序猿
15 记一次docker日志磁盘告警问题

前景

今日,我正在开开心心的刷着JFX的Coding中,突然线上报警群中爆了个炸弹,EC2磁盘超过80%。

资源不足预警

处理过程

解决问题姿势就位:

  • 赶紧开机 ==》 ❤️中万匹🦙奔腾而过 ❤️中MMP

  • 默默的通过跳板机进入目标机器

  • 不管三七二十一,执行查看磁盘占用大小,我的乖乖,占用确实超过了87%了,一下子暴涨的

# 查看磁盘占用大小
> sudo df -h
# 查看当前目录总量
> sudo du -sh
  • 开始定位具体哪个文件或者目录占用这么大,跑到根目录下。
# 查看当前目录下一级子文件和子目录占用的磁盘容量
> sudo du -lh --max-depth=1
  • 一开始猜想可能是docker容器的日志占用大,上面执行后,还真 TM 是
/var/lib/docker/containers 目录占用 42G
  • 开始查看是哪个容器占用的这么大的空间
# 查看 containers 日志目录排序
> sudo du -d1 -h /var/lib/docker/containers | sort -h
# 查看具体的哪个日志文件大
> sudo find /var/lib/docker/containers -name *.log

当然这个配图是我清理之后的 docker容器文件排序 查找docker容器日志文件

  • 定位到最大的文件,一顿操作
   # 清空比较大的日志文件
   > sudo sh -c "cat /dev/null > ${log_file}"

清理docker容器日志后

思考

  • 上面的方式是一种方式解决【临时】
      # 查看 docker 的 Logging Driver
      > docker info | grep 'Logging Driver'
    

    如何彻底解决这个问题:

    • 写个shell脚本 使用 crontab 定期执行清理
         #!/bin/sh
         echo "======== start clean docker containers logs ========"  
         logs=$(find /var/lib/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 ========"
      
    • 假如是docker run创建容器的,指定 --log-opt max-size=${MAX_SIZE}m --log-opt max-file=${NUMBER}
    • docker-compose 方式更高docker-compose.yaml文件
        logging:
            driver: "json-file"
            options:
              max-size: "${MAX_SIZE}m"
              max-file: ${NUMBER}
      
    • docker 全局修改 /etc/docker/daemon.json
        {
          "log-driver": "json-file",
          "log-opts": {
            "max-size": "${MAX_SIZE}m"
          }
        }
      
        > systemctl daemon-reload
        > systemctl restart docker
      
  • 为什么会瞬间💥式的增长 ???

最后修改于 2021-05-10