Docker 容器镜像层级分析
Summary: Author: 张亚飞 | Read Time: 3 minute read | Published: 2022-10-17
Filed under
—
Categories:
MarkDown
—
Tags:
Tag,
Docker 容器镜像
Docker 容器镜像
Docker
容器有一个属性 .GraphDriver.Data.MergedDir
,在容器启动时会挂载到系统目录下
例如启动命令运行一个 docs.builder
的容器
docker run --rm --name=docs.builder -p 8888:8000 -v /data/test/DocsBuilder/config:/srv/config -v /data/test/DocsBuilder/src/views:/srv/src/views -v /data/test/DocsBuilder/dist:/srv/dist -w=/srv --env NODE_ENV=dev registry.cn-beijing.aliyuncs.com/webrtc-boom/docs.builder:dev serve
查看系统挂载目录,多出来一个文件系统为 overlay
的挂载卷 /var/lib/docker/overlay2/6037509dc8b4ae05db1001bb682e9879aac214f440a0fecb5b9ec48999fb561c/merged
# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 99G 83G 17G 84% /var/lib/docker/overlay2/6037509dc8b4ae05db1001bb682e9879aac214f440a0fecb5b9ec48999fb561c/merged
...
查看容器运行信息
docker inspect docs.builder
配置示例如下:
[
{
"GraphDriver": {
"Data": {
"LowerDir": "
/var/lib/docker/overlay2/a4ce945707609e805494222eb08a09facc3bce99f1114079b154fdf54ee7d6ca-init/diff:
/var/lib/docker/overlay2/2b618d44900c34b4ebf64023f35c823ff2afc36d31f2c8cec6ffbe737db2742f/diff:
/var/lib/docker/overlay2/72a6d6b4dc5031915fda372d6c365913964168fbf8d12c276256051254b26b04/diff:
/var/lib/docker/overlay2/7263fd3ea10fcdae783644c0e3a2b98243870a7772c97489873d18ff2dd51fe9/diff:
/var/lib/docker/overlay2/822daf9d6b900b6e238812d7d86c1fc57f2cbe944a13e89d6ce708656966bb12/diff:
/var/lib/docker/overlay2/ae2bdd610b78aec08200c3817ae5c556d4a165c5c4d78d736c465d9b5eef7e5a/diff:
/var/lib/docker/overlay2/d994e020bd875df7344dac999e0c49cf7c8fe4c4f992b2a21fa23d9db6620897/diff:
/var/lib/docker/overlay2/3932155d8ca825e33f534c13733aedf5d00616c8df2ef5cedbd323bafb189d48/diff:
/var/lib/docker/overlay2/5a6b3d7fa782f80ab385c1da1bd48aaf95f62c053b21ec146ff9b9cd8ce9ed48/diff:
/var/lib/docker/overlay2/75bd284b8ac44f018432af3651f23cc3855df3f897a58ae1770a9108f321a82a/diff:
/var/lib/docker/overlay2/be88be1793ef25eca6ad6a24dae44a4f918d9049bde164a8389226bda88a6c51/diff",
"MergedDir": "/var/lib/docker/overlay2/a4ce945707609e805494222eb08a09facc3bce99f1114079b154fdf54ee7d6ca/merged",
"UpperDir": "/var/lib/docker/overlay2/a4ce945707609e805494222eb08a09facc3bce99f1114079b154fdf54ee7d6ca/diff",
"WorkDir": "/var/lib/docker/overlay2/a4ce945707609e805494222eb08a09facc3bce99f1114079b154fdf54ee7d6ca/work"
},
"Name": "overlay2"
}
}
]
可以看到 6037509dc8b4ae05db1001bb682e9879aac214f440a0fecb5b9ec48999fb561c
就是 .GraphDriver.Data.MergedDir
里配置的,
那这个挂载目录和容器镜像有什么关系呢?
查看镜像配置:
docker image inspect registry.cn-beijing.aliyuncs.com/webrtc-boom/docs.builder:dev
同样可以看到同样有 .GraphDriver.Data.MergedDir
配置,同时 LowerDir
的顺序也保持一致,
不同的是上面容器中在镜像 2b618d44900c34b4ebf64023f35c823ff2afc36d31f2c8cec6ffbe737db2742f
多了一层,
也就是 a4ce945707609e805494222eb08a09facc3bce99f1114079b154fdf54ee7d6ca
[
{
"GraphDriver": {
"Data": {
"LowerDir": "
/var/lib/docker/overlay2/72a6d6b4dc5031915fda372d6c365913964168fbf8d12c276256051254b26b04/diff:
/var/lib/docker/overlay2/7263fd3ea10fcdae783644c0e3a2b98243870a7772c97489873d18ff2dd51fe9/diff:
/var/lib/docker/overlay2/822daf9d6b900b6e238812d7d86c1fc57f2cbe944a13e89d6ce708656966bb12/diff:
/var/lib/docker/overlay2/ae2bdd610b78aec08200c3817ae5c556d4a165c5c4d78d736c465d9b5eef7e5a/diff:
/var/lib/docker/overlay2/d994e020bd875df7344dac999e0c49cf7c8fe4c4f992b2a21fa23d9db6620897/diff:
/var/lib/docker/overlay2/3932155d8ca825e33f534c13733aedf5d00616c8df2ef5cedbd323bafb189d48/diff:
/var/lib/docker/overlay2/5a6b3d7fa782f80ab385c1da1bd48aaf95f62c053b21ec146ff9b9cd8ce9ed48/diff:
/var/lib/docker/overlay2/75bd284b8ac44f018432af3651f23cc3855df3f897a58ae1770a9108f321a82a/diff:
/var/lib/docker/overlay2/be88be1793ef25eca6ad6a24dae44a4f918d9049bde164a8389226bda88a6c51/diff",
"MergedDir": "/var/lib/docker/overlay2/2b618d44900c34b4ebf64023f35c823ff2afc36d31f2c8cec6ffbe737db2742f/merged",
"UpperDir": "/var/lib/docker/overlay2/2b618d44900c34b4ebf64023f35c823ff2afc36d31f2c8cec6ffbe737db2742f/diff",
"WorkDir": "/var/lib/docker/overlay2/2b618d44900c34b4ebf64023f35c823ff2afc36d31f2c8cec6ffbe737db2742f/work"
},
"Name": "overlay2"
}
}
]
可以看到可以通过挂载卷通过 .GraphDriver.Data.MergedDir
找到关联的容器信息,再清理占用较大空间的挂载卷。
排查 /var/lib/docker/overlay2
占用较大文件
# du -hs * | grep G
4.8G 6037509dc8b4ae05db1001bb682e9879aac214f440a0fecb5b9ec48999fb561c
1.2G 60d3351f8a48fb9a01c1b8cac15e305e32ce4647cbbcbb8e6a31d298810312fe
2.2G 6eed604940c4c781ec5543e60e8660a46d1b893cb4089ee45cee186e4ef9b8fe
1.4G c12c07c7003cc57cdfc688db18c63e66ee24ee940c7c1ff4aa4433bdf084c182
使用 df
查看确认 6037509dc8b4ae05db1001bb682e9879aac214f440a0fecb5b9ec48999fb561c
是容器挂载的镜像
# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 99G 83G 17G 84% /var/lib/docker/overlay2/6037509dc8b4ae05db1001bb682e9879aac214f440a0fecb5b9ec48999fb561c/merged
...
找出 .GraphDriver.Data.MergedDir
的所有容器
docker inspect -f $'{{.Name}}\t{{.GraphDriver.Data.MergedDir}}' $(docker ps -aq)
可以看到是一个名为 nifi_nifi_1
的容器占用的
/nifi_nifi_1 /var/lib/docker/overlay2/6037509dc8b4ae05db1001bb682e9879aac214f440a0fecb5b9ec48999fb561c/merged
...
How do I identify which container owns which overlay directory?
Comments