docke目录下overlay2和container关系

目的

/var/lib/docker/overlay2/找到关联容器,磁盘告警经过分析发现是overlay2/xxxx 目录占用磁盘很大空间,如何管理到容器?

env

  • docker

overlay2

/var/lib/docker/overlay2 是 Docker 使用 OverlayFS 存储驱动时的默认路径,它用于存放容器和镜像的联合文件系统(层)

1./var/lib/docker/overlay2目录解析

这个目录包含了**镜像层(只读层)和容器的(可写层)**,组织结构如下:

1
2
3
4
5
6
7
/var/lib/docker/overlay2/
├── <layer-id>/
│ ├── diff/ # 实际的文件变化(新增、修改的文件)
│ ├── merged/ # 容器运行时挂载点(只有运行中才有)
│ ├── work/ # OverlayFS 工作目录
│ └── link # 指向父层
├── l/ # 长链接名,用于加快层的引用

每个 <layer-id> 是 Overlay 层的标识(类似 UUID)。


m1.查找某个容器对应的 overlay2 层

1. 找到容器的 ID 或名称

1
docker ps -a

2. 查找容器的 metadata 目录

Docker 容器的元信息存在 /var/lib/docker/containers/<container-id>/config.v2.json 中。

1
cat /var/lib/docker/containers/<container-id>/config.v2.json

这个文件中有一个字段叫 "GraphDriver",内容大致如下:

1
2
3
4
5
6
7
8
9
"GraphDriver": {
"Name": "overlay2",
"Data": {
"LowerDir": "...",
"UpperDir": "/var/lib/docker/overlay2/<layer-id>/diff",
"WorkDir": "/var/lib/docker/overlay2/<layer-id>/work",
"MergedDir": "/var/lib/docker/overlay2/<layer-id>/merged"
}
}

从中可以得到该容器使用的 overlay2 层目录名。

m2.利用lsof定位

1.查出哪个容器正在使用某个 merged 挂载目录:

1
lsof +D /var/lib/docker/overlay2/<layer-id>/merged

如果该容器正在运行,会看到类似:

1
2
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
containerd-shim 1234 root ... DIR ... /var/lib/docker/overlay2/<id>/merged

2.根据pid定位实际打开关联文件
lsof -p xxx

根据蛛丝马迹分析,是那个容器


m3.容器overlay2 层和进程关系

/var/lib/docker/overlay2/

1.查询容器UpperDir
docker inspect $(docker ps -qa) |grep -C 60 UpperDir

2.根据结果找到容器关联信息