Docker 容器磁盘占用100%
目前生产环境使用的
docker
+微服务
的环境,配合自动化编译部署
环境,大大减少了,项目测试或上线的复杂度,让运维变得了快乐起来,可是在服务运行的一段时间后,某些主机磁盘空间被占满了(项目本身对磁盘要求不高,因此默认使用的是40G磁盘空间的云服务器),于是又进入了漫长的踩坑之路
首先查看磁盘占用
df -h
结果显示多条如下数据
overlay 40G 40G 0G 100% /var/lib/docker/overlay2/{id}/merged
百度到了清理docker空间的方法,可用于清理一些无用的docker数据
docker system prune -a
执行之后,发现虽然清理了2个多G的数据,但是依旧无法明白为何几个微服务会占用那么多的磁盘空间,于是尝试查找系统中的大文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr # 查找"/"目录下所有大于100M的所有文件
发现/var/lib/docker/containers/{container_id}/
下存在数据较大的*-json.log
日志文件,百度发现这是docker容器运行的标准输入日志
,遂删除之。项目中已使用-v
的方式挂载项目输出日志文件,因此对容器运行日志没有了需求,研究后发现在构建参数的时候可以对标准输入日志大小
与数量
进行限制,以减少日志文件对存储空间的占用,以下配置分别为日志文件最大容量、最大日志文件数。
docker run ...... --log-opt max-size=10m --log-opt max-file=1
也可以在docker的配置文件中进行全局修改:新建或修改/etc/docker/daemon.json,添加log-dirver和log-opts参数(daemon.json参数说明:https://www.cnblogs.com/pzk7788/p/10180197.html)
{
"log-driver":"json-file",
"log-opts": {"max-size":"10m", "max-file":"1"}
}
另外,在查找大文件的扫描结果中,可能有通过-v
进行了挂载数据目录的,里面的数据可根据相应的挂载目录
找到对应的容器进行清理或设置;也可能有出现许多容器产生的未通过-v
挂载的目录/var/lib/docker/overlay2/{id}/merged
,即文章开头通过df -h
找到的文件(如果一个宿主机存在多个容器,多个容器的数据都位于宿主机的overlay(Filesystem)
,而且大小一致),可通过docker inspect {container}
中GraphDriver
找到}/var/lib/docker/overlay2/{id}
中的{id}
,进而确定容器进行清理或设置