linux

docker容器日志把系统盘占满解决方法

现在云服务器商一般都会把系统盘和数据盘分开卖,系统盘一般只有40GB,尤其是Linux使用前要先把数据盘挂载,要不然就白买了。我们如果安装docker,默认情况下容器的日志都会装到40GB的磁盘上,路径是/var/lib/docker/containers/{containerhash}/{containerhash}-json.log,我们的容器输出的所有日志,无论是否保存文件,都会存在这个地方,因为docker logs 命令查看的就是这个地方,时间久了就会占满系统盘,导致各种问题。

我们可以用linux命令 df -lh 查看磁盘占用情况,使用du -lh –max-depth=1来查看当前目录的文件大小,逐步排查哪个文件夹占用的比较大。

现在有两种解决方法

1 重新设置服务器,把容器日志设置到数据盘

顺便说一下,如果一开始没有挂在数据盘,可以按照这个链接https://www.cnblogs.com/stulzq/p/7610100.html操作。

然后我们修改docker 服务的描述文件,修改启动参数来更改docker 容器日志与其他所有有关东西的存储位置。vi /usr/lib/systemd/system/docker.service,使用vi编辑器在ExecStart的值中增加参数–graph=”数据盘路径/docker”

重启docker服务,就成功了,然后再删除/var/lib/docker 文件夹

但是这样就会让所有的镜像与容器的配置都失效了,具体怎么恢复我还没找到方法,所以要慎重使用,我们可以使用第二种方法

2 编写定时任务脚本清理日志

我们发现占地方最多的还是容器的日志,所以可以编写一个脚本,删除这些日志,由于服务正在运行,占用的空间只有服务重启之后才能及时收回,所以我们用写入空文件的方法来删除日志。编写一个简单的脚本放在/root/scripts/remove-docker-log.sh

1
2
3
4
5
6
7
#!/bin/sh
#例如文件名/root/scripts/remove-docker-log.sh
cd /var/lib/docker/containers
for container in `ls`
do
echo ' ' > $container/$container-json.log
done

然后使用Linux的Cron计划任务,把这个脚本在每天的2点执行,因为我们有时候会熬夜到1点,很难熬夜到2点。先启用cron服务,CentOS是systemctl enable crond,然后通过在线的cron表达式生成网页生成一个表达式 http://www.bejson.com/othertools/cron/

最后添加一条计划任务crontab -e,在编辑器中输入0 0 2 * * ? /bin/sh /root/scripts/remove-docker-log.sh,使用vi的常见方法保存退出即可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据