docker文件中layerID-diffID-chainID-cacheID 关系

参考链接:https://blog.csdn.net/u010566813/article/details/117783220

第一步:

首先我们先拉取镜像:

docker pull ubuntu:latest

Using default tag: latest
latest: Pulling from library/ubuntu
345e3491a907: Pull complete
57671312ef6f: Pull complete
5e9250ddb7d0: Pull complete
Digest:sha256:adf73ca014822ad8237623d388cedf4d5346aa72c270c5acc01431cc93e18e2d
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

这里的345e3491a907,57671312ef6f,5e9250ddb7d0为压缩的layer层的哈希值这些值为layerID,即distribution hashes,他们从远程的repository拉取下来。

第二步:

查看镜像的详细信息:

docker inspect ubuntu:latest

其中有一个rootfs的键值对,如下:

  "RootFS": {
            "Type": "layers",
            "Layers": ["sha256:ccdbb80308cc5ef43b605ac28fac29c6a597f89f5a169bbedbb8dec29c987439",                "sha256:63c99163f47292f80f9d24c5b475751dbad6dc795596e935c5c7f1c73dc08107",                "sha256:2f140462f3bcf8cf3752461e27dfd4b3531f266fa10cda716166bd3a78a19103"
            ]
        },

这是镜像的底层的rootfs,但是我们发现这些sha256值和第一步拉取下来的层layerID不一致。这是为什么呢?

因为pull下来的是压缩的数据,layerID是压缩数据的sha256的值(Layer IDDistribution根据layer compressed data计算的),而inspect rootfs中的值是解压后,对解压的内容进行sha256的值他们是diffID,是在本地由Docker根据layer uncompressed data计算的。
记住这里的rootfs layers的值是diffID

第三步:

那么从远程拉取下来的layerID和解压后的diffID是如何一一对应的呢?

ls /var/lib/docker/image/overlay2/distribution/

diffid-by-digest v2metadata-by-diffid

其中diffid-by-digest保存了digest(layerID)->diffID的映射关系,即distribution hashesContent hashes的映射关系。也即是正向查询。

v2metadata-by-diffid保存了diffid -> (digest,repository)的映射关系,这可以方便查找layer的digest及其所属的repository。也即是反向查询,可以从diffID->layerID(其实就是digest)。

cd /var/lib/docker/image/overlay2/distribution/diffid-by-digest/sha256
cat <layerID>

<diffID> //得到 相对应的diffID

cd /var/lib/docker/image/overlay2/distribution/v2metadata-by-diffid/sha256
cat <diffID>

[{"Digest":"sha256:345e3491a907bb7c6f1bdddcf4a94284b8b6ddd77eb7d93f09432b17b20f2bbe","SourceRepository":"docker.io/library/ubuntu","HMAC":""}] // 得到相应的layerID和库相关信息。

第四步:

从diffID组成chainID:

layer.ChainID只用本地,根据layer.DiffID计算,并用于layerdb的目录名称。

chainID唯一标识了一组(像糖葫芦一样的串的底层)diffID的hash值,包含了这一层和它的父层(底层),当然这个糖葫芦可以有一颗山楂,也就是chainID(layer0)==diffID(layer0);对于多颗山楂的糖葫芦,ChainID(layerN) = SHA256hex(ChainID(layerN-1) + " " + DiffID(layerN))

cd /var/lib/docker/image/overlay2/layerdb/sha256

这个sha256目录中保存了所有的chainID,在第二步对镜像的inspect中,

["sha256:ccdbb80308cc5ef43b605ac28fac29c6a597f89f5a169bbedbb8dec29c987439", "sha256:63c99163f47292f80f9d24c5b475751dbad6dc795596e935c5c7f1c73dc08107", "sha256:2f140462f3bcf8cf3752461e27dfd4b3531f266fa10cda716166bd3a78a19103"]

三个diffID,第一个是最底层的ccdbb80308cc5ef43b605ac28fac29c6a597f89f5a169bbedbb8dec29c987439,所以diffID(layer0)==chainID(layer0)

然后这个文件夹中包含了diff、cache-id等,最主要的是Diff文件保存了这个层的diffID.cache-id为具体/var/lib/docker/overlay2/<cache-id>存储路径。

另外两个chainID如何计算呢?

除了底层的layer层,还有一些高层的layer,他们的chainID文件夹中包含了parent文件,这个是值为ChainID(layerN-1),diff文件存储了DiffID(layerN),而文件夹也就是ChainID(layerN) = SHA256hex(ChainID(layerN-1) + " " + DiffID(layerN))

echo -n "sha256:ccdbb80308cc5ef43b605ac28fac29c6a597f89f5a169bbedbb8dec29c987439 sha256:63c99163f47292f80f9d24c5b475751dbad6dc795596e935c5c7f1c73dc08107" | sha256sum | awk '{print $1}'

一定注意要加上 “sha256:”和中间的空格“ ”这两个字符,否则计算就错误了。

得出中间层chainID它也包括自己diff、parent、cache-id等:8d8dceacec7085abcab1f93ac1128765bc6cf0caac334c821e01546bd96eb741

再计算最后的chainID:

echo -n "sha256:8d8dceacec7085abcab1f93ac1128765bc6cf0caac334c821e01546bd96eb741 sha256:2f140462f3bcf8cf3752461e27dfd4b3531f266fa10cda716166bd3a78a19103" | sha256sum | awk '{print $1}'

得出最后的值为:

3dd8c8d4fd5b59d543c8f75a67cdfaab30aef5a6d99aea3fe74d8cc69d4e7bf2

第五步:

最后从chainID->cacheID

通过上一步计算找到当前最顶层的chainID:

/var/lib/docker/image/overlay2/layerdb/sha256/保存了chianID信息,目录名称为chainID

这个目录下的cache-id、diff、parent

通过这个chain生成一个cache-id

diff保存当前layer的diff ID

parent保存上一层layer的chainID

cd 3dd8c8d4fd5b59d543c8f75a67cdfaab30aef5a6d99aea3fe74d8cc69d4e7bf2
cat cache-id

ddd5760e7cbfde67e325e77b540dfc13e7dccf1c7d1b156554d0a79378642bd1

第六步:

从cache-id得到最终的磁盘文件:

在/var/lib/docker/overlay2/

cd /var/lib/docker/overlay2/<cache-id>

得到当前的内容。

完结。

总结:

Overlay2比overlay更加高效,因为overlay2优化了inode的利用。

layerID -> diffID -> chainID -> cacheID

layerID和diffID的对应关系在diffid-by-digest和v2metadata-by-diffid

chainID主要存在于/var/lib/docker/image/overlay2/layerdb/sha256/<chain-id>,

cacheID主要存在于/var/lib/docker/overlay2/<cache-id>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容