记一次ecs云盘满的处理docker 磁盘日志爆满的处理

案发现场:

测试服务器,CPU&内存2 核8 GiB,系统盘100G,跑着gitlab,docker,没有其他什么玩意,正式的代码基本还没有扔上去。docker里跑着kafka,apollo,redis,eureka,zentao,postgre,mysql等常用的组件。gitlab里跑着开发的仓库。

案情:

服务器磁盘使用88%,快满了,读写小于10M,iops500,cpu 25%,内存87%,

分析

由于使用着docker,本身就吃内存,内存87%可以理解,但是磁盘明显不对劲,

筛查

df明细筛查

mnt/hdd/prod/docker/overlay2/ 占用88%,就是这个了。经过网络查找,有的认为是mnt/hdd/prod/docker/overlay2虚拟磁盘里的log导致,
经 find /mnt/hdd/prod/docker/overlay2/** -mtime +0 -name “.log.” -exec rm -rf {} ;处理,清理磁盘效果有限,未达到清理效果

再次对docker目录进行筛查
cd /var/lib/docker/
du -sh * | sort -nr | head   

发现/var/lib/docker/containers 44G /var/lib/docker/overlay2 33G,containers是最大元凶,继续进入

cd /var/lib/docker/containers
du -sh * | sort -nr | head   #这个可以快速查看大文件
du -ck */*-json.log*   #这个可以显示所有log的大小

列出各个容器目录的容量,找到占用空间大的容器,进入清理日志

cat /dev/null >*-json.log

又经查 /var/lib/docker/overlay2/*/diff/opt/atlassian/confluence/confluence/web-inf/WEB-INF 目录 占用较大空间,进入后看到里面多是jar包,由于运行的java项目,里面应该是docker构造容器时缓存的jar包,这个是正常的,不用管它了

容器containers目录下的 -json.log才是占用磁盘的元凶,为了不让以后疯狂增长,特别是测试服务器,对docker做以下设置
修改docker daemon.json文件,配置日志文件参数
默认 /etc/docker/daemon.json

{
	"log-driver": "json-file",
	"log-opts": {
		"max-size": "50m",
		"max-file": "1"
	}
}

修改后,docker需要重新加载配置文件和重启。
CentOS7的操作

systemctl daemon-reload
systemctl restart docker

注意:新创建的容器会生效,原有容器不生效。
参数说明
参数 说明
log-opts max-size 容器日志文件上限大小
log-opts max-file 窗口日志文件上限个数
查出Docker容器日志并删除脚本
默认查找目录 /var/lib/docker/containers/

#!/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容器正在运行的话,使用rm -rf方式删除日志后,通过df -h会发现磁盘空间并没有释放。
原因是通过rm -rf删除,将会从文件系统的目录结构上解除链接(unlink)。
如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也是一直被占用。
正确操作覆盖操作 *cat /dev/null > -json.log。
或者可以通过rm -rf删除后重启docker容器。


版权声明:本文为wuqingsssss原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。