现在云服务器商一般都会把系统盘和数据盘分开卖,系统盘一般只有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的常见方法保存退出即可。