docker磁盘空间满了排查方法

  其他常见问题
内容纲要

概要描述

正常情况下/var/lib/docker是单独挂载磁盘的,并且磁盘越大越好;比较常见的问题是docker磁盘满了,然后就会导致docker各种状态不正常,比如卡住了、容器状态不正常等。
docker磁盘满了,一般分两种情况:
1、是/var/lib/docker下具体目录发现overlay2下某个文件夹占用空间过大
2、具体目录下没有文件占用空间过大,且可能 df -h 和 du -h 结果不一致

详细说明

/var/lib/docker/overlay2下某个文件夹占用空间过大

通过执行下面命令,发现 /var/lib/docker/overlay2 目录下有一个目录占用空间过大

cd /var/lib/docker/overlay2
du -sh *


该问题一般是由于数据应该写在宿主机集群,错误的写入了docker容器中导致的,关键在于如何确定这个目录所对应的容器,通过下面步骤排查

查看容器的大小

通过如下命令查看各个容器的大小,任意一个都可以:

docker ps --size
docker system df -v

如果能看到占用空间非常大的容器,那么直接进入该容器查看原因,如下图可以直接进入hdfs的容器,进一步做排查,有疑问联系星环技术支持

但有时候这个命令并不能看出容器的实际占用空间(跟docker的挂载原理有关),此时需要手动排查

根据目录名查找对应的容器

首先进入到占用空间过大对应目录下

cd /var/lib/docker/overlay2/2ae66baf192c3f8893b804efffb2cd0a892bee3e9ec9e2d398c9a6c78d8464e6
ls diff/

可以根据这个目录下的文件内容来推测相应的容器,如下图所示,可以知道这个目录应该是对应zookeeper容器

然后在节点上 (一定要是磁盘满了的节点上),执行下面命令

docker ps -a | grep -i zookeeper

如果结果只有一个容器,那直接进入容器中排查哪个文件异常大即可,有疑问联系星环技术支持
如果结果有多个容器的话,还需要继续排查,比如

此时需要,执行下面命令

docker inspect  container-ID

在结果中查看 LowerDir 字段来查看是否能找到目录名

删除对应的docker容器

第二步中找到容器ID之后,就可以去容器中查找哪些文件比较大,有疑问联系星环技术支持

没有具体目录占用空间大,且df -h 和 du -h 结果不一致

导致该问题的原因可能是由于某进程不能释放文件,导致docker无法清理。
查看是否有状态为delete的文件(僵死文件,这些文件实际上已经被删除了,但是有服务程序在使用这些文件,导致这些文件一直被占用,无法释放磁盘空间)
通过下面四步来释放空间:
1、通过 lsof /var/lib/docker 2>&1 | grep delete ,查看是否有进程占用文件句柄
2、 通过 ps -ef | grep <占用句柄PID> ,找到对应的docker container
3、使用docker rm -vf ,删除对应容器和关联的卷
4、使用 ps -ef | grep 确定是否已经删除

这篇文章对您有帮助吗?

平均评分 5 / 5. 次数: 1

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。