试图了解docker图像层ID是如何到达的。
在基于Linux的VM上,我按如下所示提取ubuntu 20.04映像。
docker pull ubuntu:20.04
然后我将其保存为tar文件,然后将其解压缩。
docker save ubuntu:20.04> ubuntu2004.tar
tar -xvf ubuntu2004.tar
我已经在VM上安装了一个文件夹,所以现在我在Windows机器上看到解压缩的tar,如下所示。
您可能知道4个文件夹包含图像的4层。看起来很长的文件夹名称是层的ID。在这些文件夹中,我们可以看到一个json文本文件,其中有一个json对象。此Json对象也具有该层的相同ID。因此ID为1c87ad44cc6b364480a5340ab1050b8dfb1691ed2abc85a1dbc3ee2fb5f2cf06
问题:这些ID如何到达?
以下总结了我在这方面所做的研究。
用于存储层内容的diff目录现在以一个随机生成的“缓存ID”命名,并且Docker引擎维护该层与其缓存ID之间的链接,以便它知道在何处定位该层内容。磁盘。
我启动了多个VM,提取了相同的ubuntu:20.04映像,然后将其提取以最终发现各层ID完全相同。因此,我得出结论,主机VM上的docker引擎一定不能随机生成这些ID。它必须使用某种逻辑来生成这些ID。或从中提取资源的存储库必须已经具有这些ID。
Jessica G here深入docker层并说了同样的话,即层ID是随机生成的。
每个步骤中,创建的图层均以其随机生成的ID表示。
对于底层:ChainID(layer0)= DiffID(layer0)
对于其他层:ChainID(layerN)= SHA256hex(ChainID(layerN-1)+“” + DiffID(layerN))
我观察到,对于任何层,该ID与diff ID不同。我是我想念这里的东西。否则此帖子可能会过时。
所以直到现在,我仍无法了解docker引擎如何生成id。还是当它们被推送时在存储库中生成它们,而docker引擎将它们原样拉出?我从shell script所描述的Moby Project看了here。它将图层的id生成为图像图层sha的sha256。首先获取layer.tar文件的sha256。我再次猜想sha是从该sha获得的,并用作该层的id。但是这里的问题是该层ID与提取后发现的ID不匹配。
任何正确方向的指针将不胜感激。