docker下的overlay2驱动的文件系统
摘要:详细了解一下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/目录的结构如下
(图一)
repository 是由具有某个功能的 docker 镜像的所有迭代版本构成的镜像库,repository元数据记录了repository的详细信息。repository元数据位于
/var/lib/docker/image/<graph_driver>/repositories.json目录下,所以在overlay2驱动下位于
/var/lib/docker/image/overlay2/repositories.json文件下
(图二)
repositories.json文件中存储了所有本地镜像的 repository 的名字,比如 coolq/wine-coolq,hello-world ,还有每个 repository 下的镜像的名字、标签及其对应的镜像 ID。当前 docker 默认采用 SHA256 算法根据镜像元数据配置文件计算出镜像 ID。上图中的coolq/wine-coolq:latest和coolq/wine-coolq@sha256:be0c50ebe999afe9ab613b9f16b59abde6f482bde87cbb78fae186ef933d3643本质上是一样的,因为指向同一个镜像 ID。其中sha256:be0c50ebe999afe9ab613b9f16b59abde6f482bde87cbb78fae186ef933d3643被称为镜像的摘要,在拉取镜像时可以看到它。
(图三)
(图四)
图四中红线勾住的为镜像ID的缩写,图四镜像ID的缩写对应图二中的红线勾的完整的镜像ID。
也可以直接docker pull REPOSITORY@DIGEST方式来拉取镜像
(图五)
(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镜像举例:
coolq/wine-coolq:latest镜像的元数据被保存在
/var/lib/docker/image/overlay2/imagedb/content/sha256/2785da1c4eeab09045da3051fbbc403c94c78d8ee138721869546cafd2768ef6的文件中
查看详细的元数据:
其中的diff_ids就是镜像层了,而且排列顺序也有讲究,从上到下依次依赖构建。
(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元数据。
/var/lib/docker/image/overlay2/layerdb/sha256/2e533c5c9cc8936671e2012d79fc6ec6a3c8ed432aa81164289056c71ed5f539这个目录就是diff_ids为sha256:03c9b9f537a4ae66d7ae7a4361e7f36e6755380107eadff3fbc11cd604c6c9b9对应的元数据存放的目录。chainID就是2e533c5c9cc8936671e2012d79fc6ec6a3c8ed432aa81164289056c71ed5f539
(5)镜像层的数据文件
找到了layer元数据的存放目录,接下来由layer元数据寻找与之对应的镜像层数据文件。
依然以 diff_ids 为sha256:03c9b9f537a4ae66d7ae7a4361e7f36e6755380107eadff3fbc11cd604c6c9b9举例。
进入sha256:03c9b9f537a4ae66d7ae7a4361e7f36e6755380107eadff3fbc11cd604c6c9b9存放layer 元数据的目录
注意图中的diff和cache-id文件。
diff文件的内容正是diff-ids。
而cache-id文件的内容正是镜像层的数据文件存放的目录名
镜像层的数据文件都存放在/var/lib/docker/overlay2目录下,/var/lib/docker目录下占用空间最大的就是/var/lib/docker/overlay2这个目录。
可见diff_ids为sha256:03c9b9f537a4ae66d7ae7a4361e7f36e6755380107eadff3fbc11cd604c6c9b9镜像层的数据文件的位置被存放在
/var/lib/docker/image/overlay2/layerdb/sha256/2e533c5c9cc8936671e2012d79fc6ec6a3c8ed432aa81164289056c71ed5f539/cache-id文件里面。
(5)容器的存储
有了镜像接下来寻找容器,查看容器的存储。
docker ps -a查看容器的CONTAINER ID为5a86909765fb
由CONTAINER ID可以/var/lib/docker/下找到二个目录,如上图所标,分别是
- /var/lib/docker/containers/5a86909765fb035cad47b8876cfe77946b56ee31245956c31913842972c0e247
目录内容为:
很明显就是容器的hosts,hostname等配置文件
- /var/lib/docker/image/overlay2/layerdb/mounts/5a86909765fb035cad47b8876cfe77946b56ee31245956c31913842972c0e247
注意这个目录中的mount-id和init-id文件。
init-id和mount-id文件内容完全一样。
8a15ad05f77b0170c4d0f8bbbdf6dc442e6cc0be5b0ab59f8245f2d2d297eb7f目录就是container的数据文件存放
在/var/lib/docker/overlay2中的目录名。
进入/var/lib/docker/overlay2/8a15ad05f77b0170c4d0f8bbbdf6dc442e6cc0be5b0ab59f8245f2d2d297eb7f文件目录中可以发现
注意上图红线圈住的三个文件。
可以发现lower文件存放的是作为overlay2驱动的lowerdir的目录名
diff目录作为overlay2驱动的upperdir,
lower文件存放的目录名对应的目录作为lowerdir,和diff目录作为overlay2驱动的upperdir,一块被挂载在merged目录下。
两个文件的inode值均为2102386也证明了,merged中的文件就是lowerdir和upperdir的文件的硬链接。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。