ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## <span style="font-size:15px">**什么是镜像层?**</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个镜像都由多个镜像层组成。这些镜像层都是**只读的**,从下往上,以栈的方式组合在一起,组成镜像的根文件系统。 ## <span style="font-size:15px">**什么是容器层?**</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当容器启动时,一个新的**可写层**被加载到镜像的顶部。 这一层通常被称作容器层(Container layer),容器层之下的都叫镜像层(Image layers)。所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个容器运行时都有自己的容器层,保存容器运行相关数据(所有文件变化数据),因为镜像层是只读的,所以多个容器可以共享同一个镜像。删除容器时,Docker Daemon会删除容器层,保留镜像层。 <br> ## <span style="font-size:15px">**各种ID的含义**</span> ### <span style="font-size:15px">**imageID**</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;镜像的唯一标识,其数值根据该镜像的元数据配置文件采用sha256算法的计算获得。 ``` [root@iZbp1bum6107bp8mgzkeunZ ~]# docker image inspect nginx | jq ".[0].Id" "sha256:12766a6745eea133de9fdcd03ff720fa971fdaf21113d4bc72b417c123b15619" ``` ### <span style="font-size:15px">**chainID**</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Docker内容寻址机制采用的索引ID,`docker image inspect <image_id>`查到的 RootFS 的 ID 都是 chainID, 每一个镜像的 RootFS 的最低层的 chainID 都可以在`/var/lib/docker/image/overlay2/layerdb/sha256/`目录下找到对应的文件夹。 `/var/lib/docker/image/overlay2/layerdb/sha256/{chainID}`目录下可以找到`cacheID`和`diffID` ``` [root@iZbp1bum6107bp8mgzkeunZ ~]# docker image inspect nginx | jq ".[0].RootFS" { "Type": "layers", "Layers": [ "sha256:608f3a074261105f129d707e4d9ad3d41b5baa94887f092b7c2857f7274a2fce", "sha256:ea207a4854e73eca698e94f323fadb920bbc5fc2af83d4bda9f47fd33fa1a076", "sha256:33cf1b723f65c22ccc4660c44fe8b919b75e7bb9ffcfe80432bb75363be34a5b", "sha256:5c77d760e1f430188e860d79c2f4efa0f082f6831046e5584810bc5ead42dc5d", "sha256:fac199a5a1a59d93dd9b23d4c3445c39070ce0d94f94def585085476f89610cf", "sha256:ea4bc0cd4a9350584676b6aa3669984eb614f559229c11dc56a85140b49f0228" ] } [root@iZbp1bum6107bp8mgzkeunZ ~]# ls /var/lib/docker/image/overlay2/layerdb/sha256/ | grep 608f3a074261105f129d707e4d9ad3d41b5baa94887f092b7c2857f7274a2fce 608f3a074261105f129d707e4d9ad3d41b5baa94887f092b7c2857f7274a2fce [root@iZbp1bum6107bp8mgzkeunZ ~]# ls /var/lib/docker/image/overlay2/layerdb/sha256/608f3a074261105f129d707e4d9ad3d41b5baa94887f092b7c2857f7274a2fce cache-id diff size tar-split.json.gz ``` ### <span style="font-size:15px">**cacheID**</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由宿主机随即生成的一个uuid,存放于`/var/lib/docker/image/overlay2/layerdb/sha256/{chainID}/cache-id`文件中(容器层不会有 cacheID),每一个 cacheID 都对应着一个镜像层,每一个 cacheID 对应着`/var/lib/docker/overlay2/${cache-id}`目录 ``` [root@iZbp1bum6107bp8mgzkeunZ ~]# cat /var/lib/docker/image/overlay2/layerdb/sha256/085831b1436186cd069fbc921d93064bfe0f119cb99fb41360e20d004824e4a0/cache-id && echo 1710201f3395fe390c5ddcd9a735654da29f2cfa77eb7263a98ed4ac73abe14f [root@iZbp1bum6107bp8mgzkeunZ ~]# ls /var/lib/docker/overlay2/1710201f3395fe390c5ddcd9a735654da29f2cfa77eb7263a98ed4ac73abe14f committed diff link lower work ``` ### <span style="font-size:15px">**diffID**</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;镜像层校验ID,是根据该镜像层的打包文件校验获得。存放于`/var/lib/docker/image/overlay2/layerdb/sha256/{chainID}/diff`。diffID 采用 SHA256 算法,基于镜像层文件包的内容计算得到。而 chainID 是基于内容存储的索引,它是根据当前层与所有上层镜像层的`diffID `计算出来的。 ### <span style="font-size:15px">**containerID**</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;容器的唯一标识,每一个容器对应一个`/var/lib/docker/containers/{container_id}`目录。 ``` [root@iZbp1bum6107bp8mgzkeunZ ~]# docker inspect `docker ps | grep nginx-hostname | awk '{print$1}'` | jq ".[0].Id" "e38891c4d9a6b2ca9048db18e12bd2b05fa3a8d68687ea7acedab288bebf6441" [root@iZbp1bum6107bp8mgzkeunZ ~]# ls -l /var/lib/docker/containers | grep "e38891c4d9a6b2ca9048db18e12bd2b05fa3a8d68687ea7acedab288bebf6441" drwx--x--- 4 root root 4096 Nov 1 23:52 e38891c4d9a6b2ca9048db18e12bd2b05fa3a8d68687ea7acedab288bebf6441 ```