前段时间有客户反映我们部署服务的服务器磁盘快满了,联系我们说看看清理一下
于是就开始看服务器
我们所有的服务都是使用docker部署的,经过检查,这次占满了磁盘的都是在/var/lib/docker/overlay2目录下的文件夹,这个路径一看就是docker的存储目录,但是为什么docker跑得好好的他的占用会变高呢?
图中可见,/var/lib/docker/overlay2目录的占用大的离谱
那我们进来看看这个目录下是什么占用了这么大的空间
上图可见,/var/lib/docker/overlay2目录下的文件夹名基本都是这种md5编码,并且其中有一个a875e开头的文件夹的占用达到了518G,相当恐怖
那/var/lib/docker/overlay2目录存 的到底是什么呢?为什么能有这么大的占用?我们又需要如何去进行清理呢?
我查阅了一些博客文章了解到,overlay2是docker使用的文件存储驱动,也就是说,在/var/lib/docker/overlay2目录下的文件都是docker使用的存储【废话】
overlay2是分层存储,每一层通过本层的md5作为文件夹名来命名,如果要存储的两个东西【比如两个镜像】的底层几层的内容是一样的,那他们的md5就也是一样的,通过md5核验,确认他们这几层是一样的之后,在overlay2中实际存储的时候,这几层就可以只存储一份,然后由这两个东西共用,来达到节省空间的目的。
所以我们在/var/lib/docker/overlay2目录下看到的这茫茫多的md5,就是一层一层的数据
那为什么我们客户服务器上的a875e开头的文件夹占用会达到518G呢?究竟是什么东西占用了这么多?
我们进这个文件夹里看一眼
可以看到,在这个a875e的文件夹中,有一个diff文件夹占用259G,一个merged文件夹占用259G,直觉告诉我这两个文件夹中存储的应该是基本一致的东西
所以是什么东西呢???
经过排查,我们发现是我们一个服务会将一些运行文件存储在本地文件路径中,但是,这个服务在启动的时候因为一些疏忽,没有将他要存储文件的路径挂载到宿主机中,导致这个服务一直在往容器内的某个路径写文件,这个服务在运行了一年多之后写入容器内本地的文件终于到了……259G,但虽然在容器内占用是259G,但是在宿主机上,变成了diff文件夹占用259G,merged文件夹占用259G,合共518G,磁盘空间就这么被吃掉了。
为了测试我们的推断,我们进入容器内删除了那些本地文件,然后再在宿主机上查看宿主机的磁盘占用,果然,我们在容器内删除的文件大小是259G,但是宿主机上空出了518G的空间,故我们可以确定,我们在a875e的文件夹中看到的diff文件夹和merged文件夹,其中实际占用巨量空间的东西就是我们在容器内存储的本地文件,换言之,/var/lib/docker/overlay2目录会存储我们起的容器中的文件【应该还包括我们的镜像本身,docker镜像也是分层存储在这里的,毕竟容器跑起来以后系统相关的一些文件是和镜像一样的】
所以回到标题
docker的overlay2中存的都是什么?
存的是我们的镜像文件和容器内的文件
如何清理/var/lib/docker/overlay2?
- 删除不用的镜像
- 检查是否有容器内的服务会往容器内的本地写文件
- 检查各容器的磁盘占用,如果有发现磁盘占用过高的情况则对应处理【原则上如果容器内服务有写文件行为,则写文件的目录应当挂载到宿主机上,而不是直接往容器的本地写
- 需要应急处理的话可以先进入容器内直接删除容器内可以删除的文件