无法通过overlay2子目录ID定位对应Docker容器,寻求解决方法
定位Docker overlay2目录对应的容器(磁盘占满排查)
我在排查Docker导致的磁盘占满问题时,通过以下命令找到了大文件所在的overlay2目录:
$ sudo find /var/lib/docker/overlay2/ -xdev -size +100M -ls | tail -1 1249766 116312 -r--r--r-- 1 root root 119095683 Jul 19 11:05 /var/lib/docker/overlay2/309cec9f854b2323ccadaf88603d5ee5e2a42e63da253e75645dbe067cf898a2/diff/var/www/intranet/portail_v2/.git/objects/pack/pack-5b2029d9dc4efc3443b7688e796cb88d6d2e38c3.pack $ id=309cec9f854b2323ccadaf88603d5ee5e2a42e63da253e75645dbe067cf898a2 $ echo ${id:0:12} 309cec9f854b
但用这个短ID查找容器时没有结果:
$ sudo docker container ls -a | grep -i ${id:0:12} $
解决方法
1. 遍历所有容器的存储层信息匹配ID
overlay2目录的ID是容器可写层的独立标识,和容器ID并非直接关联,需要通过容器的存储配置匹配:
# 查找所有容器的可写层(UpperDir)是否包含目标ID sudo docker inspect --format '{{.Id}}: {{.GraphDriver.Data.UpperDir}}' $(docker ps -aq) | grep $id
如果找到匹配项,输出开头的字符串就是容器完整ID,可通过docker ps -a | grep <容器ID前12位>查看容器详情。
2. 排查是否属于镜像层
如果容器列表中无匹配结果,该overlay2目录可能属于某个镜像的层,执行以下命令排查:
# 查找所有镜像的层信息是否包含目标ID sudo docker inspect --format '{{.Id}}: {{.GraphDriver.Data.UpperDir}}' $(docker images -q) | grep $id
3. 通过overlay2的link文件关联短标识
每个overlay2目录下的link文件存储了对应的短标识,可通过它反向查找关联资源:
# 读取目标overlay2目录的link内容 sudo cat /var/lib/docker/overlay2/$id/link
得到短标识后,可尝试用它匹配容器或镜像的名称/ID。
4. 查看Docker磁盘使用明细
直接用Docker自带工具定位占用空间最大的资源:
sudo docker system df -v
该命令会列出所有容器、镜像、卷的磁盘占用情况,能快速锁定大资源对象。
内容的提问来源于stack exchange,提问作者SebMa
相关产品推荐
相关产品推荐

