🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
1、当前环境上有一个nginx镜像,查看它的分层结构。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Layers中除了第一个(因为第一个是底层镜像,因此它本身就是chanid),其他每一个值都是哈希计算之后的`chainID`,对应着每一个镜像层`cacheID`。 ``` [root@iZbp1bum6107bp8mgzkeunZ ~]# docker images | grep nginx nginx latest 12766a6745ee 7 months ago 142MB [root@iZbp1bum6107bp8mgzkeunZ ~]# docker image inspect nginx | jq ".[0].RootFS" { "Type": "layers", "Layers": [ "sha256:608f3a074261105f129d707e4d9ad3d41b5baa94887f092b7c2857f7274a2fce", "sha256:ea207a4854e73eca698e94f323fadb920bbc5fc2af83d4bda9f47fd33fa1a076", "sha256:33cf1b723f65c22ccc4660c44fe8b919b75e7bb9ffcfe80432bb75363be34a5b", "sha256:5c77d760e1f430188e860d79c2f4efa0f082f6831046e5584810bc5ead42dc5d", "sha256:fac199a5a1a59d93dd9b23d4c3445c39070ce0d94f94def585085476f89610cf", "sha256:ea4bc0cd4a9350584676b6aa3669984eb614f559229c11dc56a85140b49f0228" ] } ``` 2、通过计算layers中的这些值,就可以找到这个镜像的所有镜像层。 &nbsp;&nbsp;&nbsp;计算步骤如下: 1. 由于镜像层在构建容器时,是由上到下依次构建,因此第一层的镜像层id是最底层的,sha256之后的随机数值即使chainID值 2. 根据公式,由第一层的值加上空格,拼接第二层的diffID值,使用sha256sum命令计算SHA256哈希值,得出的结果就是第二层的chainID。 3. 第三层的chainID,即使用 “sha256:”拼接第二层的chainID来与第三层的diffID来计算,依次类推。 计算过程: 1. Layers中第一层是底层,因此`608f3a074261105f129d707e4d9ad3d41b5baa94887f092b7c2857f7274a2fce`可以直接在`/var/lib/docker/image/overlay2/layerdb/sha256/`目录中可以找到。 2. 第二层通过使用上一层的chainID和它本身的哈希值做哈希计算,得出chainID值,并且在该目录下可以找到CacheID,从而找到镜像层。 3. 以此类推。 ![](https://img.kancloud.cn/b0/f0/b0f00b4b4b7c8e2dad69d3200287d33d_1842x554.png) <br><br> **结论:** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;docker通过存储驱动将镜像层经过哈希值计算之后存储到对应目录下,并且将哈希值信息写入镜像元数据,可以通过元数据中的这些哈希值信息计算得出chainID,再根据chainID找到对应目录下的cacheID和diffID,从而找到对应的镜像层数据。