摘要:详细了解一下docker在overlay2驱动的文件系统

(1)环境配置:

//dcker版本
root@iZ2ze2te6pm3iwftejxt16Z:~# docker --version
Docker version 18.09.7, build 2d0083d
//overlay2版本
Storage Driver: overlay2

(2)repository元数据

/var/lib/docker/image/overlay2/目录的结构如下

QQ截图20200412230731.jpg
(图一)

repository 是由具有某个功能的 docker 镜像的所有迭代版本构成的镜像库,repository元数据记录了repository的详细信息。repository元数据位于
/var/lib/docker/image/<graph_driver>/repositories.json目录下,所以在overlay2驱动下位于
/var/lib/docker/image/overlay2/repositories.json文件下

QQ截图20200412231435.jpg
(图二)

repositories.json文件中存储了所有本地镜像的 repository 的名字,比如 coolq/wine-coolq,hello-world ,还有每个 repository 下的镜像的名字、标签及其对应的镜像 ID。当前 docker 默认采用 SHA256 算法根据镜像元数据配置文件计算出镜像 ID。上图中的coolq/wine-coolq:latestcoolq/wine-coolq@sha256:be0c50ebe999afe9ab613b9f16b59abde6f482bde87cbb78fae186ef933d3643本质上是一样的,因为指向同一个镜像 ID。其中sha256:be0c50ebe999afe9ab613b9f16b59abde6f482bde87cbb78fae186ef933d3643被称为镜像的摘要,在拉取镜像时可以看到它。

QQ截图20200412232035.jpg
(图三)

QQ截图20200412232347.jpg
(图四)

图四中红线勾住的为镜像ID的缩写,图四镜像ID的缩写对应图二中的红线勾的完整的镜像ID

也可以直接docker pull REPOSITORY@DIGEST方式来拉取镜像

QQ截图20200413150154.jpg
(图五)

(3)image元数据

image元数据包括了镜像架构(如 amd64)、操作系统(如 linux)、镜像默认配置、构建该镜像的容器 ID 和配置、创建时间、创建该镜像的 docker 版本、构建镜像的历史信息以及 rootfs 组成。其中构建镜像的历史信息和 rootfs 组成部分除了具有描述镜像的作用外,还将镜像和构成该镜像的镜像层关联了起来。Docker 会根据历史信息和 rootfs 中的 diff_ids 计算出构成该镜像的镜像层的存储索引 chainID,这也是 docker 1.10 镜像存储中基于内容寻址的核心技术。

images元数据被保存在文件/var/lib/docker/image/<graph_driver>/imagedb/content/sha256/<image_id>中。

以coolq/wine-coolq:latest镜像举例:

QQ截图20200413152321.jpg

coolq/wine-coolq:latest镜像的元数据被保存在
/var/lib/docker/image/overlay2/imagedb/content/sha256/2785da1c4eeab09045da3051fbbc403c94c78d8ee138721869546cafd2768ef6的文件中

查看详细的元数据:

QQ截图20200413152809.jpg

QQ截图20200416011207.jpg

其中的diff_ids就是镜像层了,而且排列顺序也有讲究,从上到下依次依赖构建

QQ截图20200413154628.jpg

(4)layer元数据

layer对应镜像层的概念。
从images 元数据,拿到了diff_ids怎么去找到对应的layer元数据
以 diff_ids 为sha256:03c9b9f537a4ae66d7ae7a4361e7f36e6755380107eadff3fbc11cd604c6c9b9举例。

layer元数据都存放在/var/lib/docker/image/<graph_driver>/layerdb/sha256/<chainID>/ 目录之下,但是<chainID>不会计算,直接通过搜索diif_ids从而寻找layer元数据

QQ截图20200413155944.jpg

/var/lib/docker/image/overlay2/layerdb/sha256/2e533c5c9cc8936671e2012d79fc6ec6a3c8ed432aa81164289056c71ed5f539这个目录就是diff_ids为sha256:03c9b9f537a4ae66d7ae7a4361e7f36e6755380107eadff3fbc11cd604c6c9b9对应的元数据存放的目录chainID就是2e533c5c9cc8936671e2012d79fc6ec6a3c8ed432aa81164289056c71ed5f539

(5)镜像层的数据文件

找到了layer元数据的存放目录,接下来由layer元数据寻找与之对应的镜像层数据文件

依然以 diff_ids 为sha256:03c9b9f537a4ae66d7ae7a4361e7f36e6755380107eadff3fbc11cd604c6c9b9举例。

进入sha256:03c9b9f537a4ae66d7ae7a4361e7f36e6755380107eadff3fbc11cd604c6c9b9存放layer 元数据的目录

QQ截图20200413160822.jpg

注意图中的diff和cache-id文件

QQ截图20200413161328.jpg

diff文件的内容正是diff-ids

cache-id文件的内容正是镜像层的数据文件存放的目录名

QQ截图20200413161710.jpg

镜像层的数据文件都存放在/var/lib/docker/overlay2目录下,/var/lib/docker目录下占用空间最大的就是/var/lib/docker/overlay2这个目录。

可见diff_idssha256:03c9b9f537a4ae66d7ae7a4361e7f36e6755380107eadff3fbc11cd604c6c9b9镜像层的数据文件的位置被存放在
/var/lib/docker/image/overlay2/layerdb/sha256/2e533c5c9cc8936671e2012d79fc6ec6a3c8ed432aa81164289056c71ed5f539/cache-id文件里面。

(5)容器的存储

有了镜像接下来寻找容器,查看容器的存储。

QQ截图20200413165947.jpg

docker ps -a查看容器的CONTAINER ID为5a86909765fb
CONTAINER ID可以/var/lib/docker/下找到二个目录,如上图所标,分别是

  • /var/lib/docker/containers/5a86909765fb035cad47b8876cfe77946b56ee31245956c31913842972c0e247
    目录内容为:

QQ截图20200413174413.jpg

很明显就是容器的hosts,hostname配置文件

  • /var/lib/docker/image/overlay2/layerdb/mounts/5a86909765fb035cad47b8876cfe77946b56ee31245956c31913842972c0e247

QQ截图20200413170053.jpg

注意这个目录中的mount-idinit-id文件。

QQ截图20200413174841.jpg

init-id和mount-id文件内容完全一样

8a15ad05f77b0170c4d0f8bbbdf6dc442e6cc0be5b0ab59f8245f2d2d297eb7f目录就是container的数据文件存放
在/var/lib/docker/overlay2中的目录名。

进入/var/lib/docker/overlay2/8a15ad05f77b0170c4d0f8bbbdf6dc442e6cc0be5b0ab59f8245f2d2d297eb7f文件目录中可以发现

QQ截图20200413175417.jpg

注意上图红线圈住的三个文件。

QQ截图20200413175635.jpg

可以发现lower文件存放的是作为overlay2驱动的lowerdir的目录名
diff目录作为overlay2驱动的upperdir,
lower文件存放的目录名对应的目录作为lowerdir,和diff目录作为overlay2驱动的upperdir,一块被挂载merged目录下。

QQ截图20200413180229.jpg

两个文件的inode值均为2102386也证明了,merged中的文件就是lowerdir和upperdir的文件的硬链接

参考链接:
Docker 镜像之存储管理 - sparkdev - 博客园

文章目录