概要描述
正常情况下/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