0%

限制docker日志文件大小以防占满磁盘

一大波请求扛过去了,快结束时服务异常了,磁盘使用量报警100%,结果是日志清理不及时导致的

首先通过df -h命令查看,的确是磁盘没有空间了
然后通过执行du -h -d 1 /命令,发现是/var文件夹占比最高,最终定位到是docker占用了磁盘空间
首先执行命令docker system prune -a,清理掉所有无用的容器/镜像,释放部分空间让服务正常运行起来
然后继续分析磁盘占用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
root@ecs-2953:/# du -hl -d 1 ./var/lib/docker/
25G ./var/lib/docker/overlay2
72K ./var/lib/docker/buildkit
164K ./var/lib/docker/network
4.0K ./var/lib/docker/runtimes
20K ./var/lib/docker/plugins
4.0K ./var/lib/docker/swarm
4.0K ./var/lib/docker/tmp
85G ./var/lib/docker/containers
20K ./var/lib/docker/builder
4.0K ./var/lib/docker/trust
925M ./var/lib/docker/volumes
50M ./var/lib/docker/image
111G ./var/lib/docker/

root@ecs-2953:/# du -hl -d 1 ./var/lib/docker/containers/
37G ./var/lib/docker/containers/bea9e03aae24bb9a049bfcec4e40a57dac2ae6fb8d3891284261d79e758be628
4.8M ./var/lib/docker/containers/f70b809cd9cd00419c78d562f9b4ce23a1c0ab9136c576a9d2de8e1257d4d7da
40K ./var/lib/docker/containers/1c886cc2d39a0de42fff3a3a4c8584072a38ed7a6e3d4bba7de3859e87f2698c
16M ./var/lib/docker/containers/02da9cdf596bae17fa44d085c7da82584da37bc3ba4758486376fc0dc871787b
...
85G ./var/lib/docker/containers/

/var/lib/docker/containers/中占比最大的是log文件
docker容器日志存在于/var/lib/docker/containers/下以 .json.log 结尾的文件
释放这些日志空间

1
2
3
4
# 如果直接使用 rm,是不能立即释放空间的
echo > ./var/lib/docker/containers/bea9e03aae24bb9a049bfcec4e40a57dac2ae6fb8d3891284261d79e758be628/bea9e03aae24bb9a049bfcec4e40a57dac2ae6fb8d3891284261d79e758be628-json.log
# echo > ...
# echo ...

至此紧急处理释放空间完毕

原因

服务日志是输出到docker的标准输出,然后收集到es中,默认情况下并不会限制其日志大小
压测中并没有开启日志收集,也没有主动清理日志,也没有相关配置,才导致了日志占满了磁盘

解决方法

需要通过配置来限制日志文件的配额

修改docker配置文件

通过vim /etc/docker/daemon.json,添加

1
2
3
4
{
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"5"}
}

然后重启docker,只对新建容器生效

1
2
systemctl daemon-reload
systemctl restart docker

其中 max-size表示一个容器日志文件大小上限是500M;max-file表示容器最多有三个日志,id.json、id+1.json。。。以上设置500m*5,2.5G

docker-compose增加配置

需要version 3

1
2
3
4
5
6
7
8
9
10
11
version: '3'
services:
service-name:
image: image-xxx
restart: always
logging:
# driver: "none" # 关闭日志
driver: "json-file"
options:
max-size: "100m"
max-size: "3"

docker run时配置

1
2
docker run -d --log-opt max-size=1g xxx
# docker run -it --log-driver none xxx # 关闭

参考连接

原文链接