docker文件中l(wèi)ayerID-diffID-chainID-cacheID 關(guān)系

參考鏈接: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,他們從遠(yuǎn)程的repository拉取下來。

第二步:

查看鏡像的詳細(xì)信息:

docker inspect ubuntu:latest

其中有一個(gè)rootfs的鍵值對,如下:

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

這是鏡像的底層的rootfs,但是我們發(fā)現(xiàn)這些sha256值和第一步拉取下來的層layerID不一致。這是為什么呢?

因?yàn)閜ull下來的是壓縮的數(shù)據(jù),layerID是壓縮數(shù)據(jù)的sha256的值(Layer IDDistribution根據(jù)layer compressed data計(jì)算的),而inspect rootfs中的值是解壓后,對解壓的內(nèi)容進(jìn)行sha256的值他們是diffID,是在本地由Docker根據(jù)layer uncompressed data計(jì)算的。
記住這里的rootfs layers的值是diffID

第三步:

那么從遠(yuǎn)程拉取下來的layerID和解壓后的diffID是如何一一對應(yīng)的呢?

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

diffid-by-digest v2metadata-by-diffid

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

v2metadata-by-diffid保存了diffid -> (digest,repository)的映射關(guān)系,這可以方便查找layer的digest及其所屬的repository。也即是反向查詢,可以從diffID->layerID(其實(shí)就是digest)。

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

<diffID> //得到 相對應(yīng)的diffID

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

[{"Digest":"sha256:345e3491a907bb7c6f1bdddcf4a94284b8b6ddd77eb7d93f09432b17b20f2bbe","SourceRepository":"docker.io/library/ubuntu","HMAC":""}] // 得到相應(yīng)的layerID和庫相關(guān)信息。

第四步:

從diffID組成chainID:

layer.ChainID只用本地,根據(jù)layer.DiffID計(jì)算,并用于layerdb的目錄名稱。

chainID唯一標(biāo)識了一組(像糖葫蘆一樣的串的底層)diffID的hash值,包含了這一層和它的父層(底層),當(dāng)然這個(gè)糖葫蘆可以有一顆山楂,也就是chainID(layer0)==diffID(layer0);對于多顆山楂的糖葫蘆,ChainID(layerN) = SHA256hex(ChainID(layerN-1) + " " + DiffID(layerN))

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

這個(gè)sha256目錄中保存了所有的chainID,在第二步對鏡像的inspect中,

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

三個(gè)diffID,第一個(gè)是最底層的ccdbb80308cc5ef43b605ac28fac29c6a597f89f5a169bbedbb8dec29c987439,所以diffID(layer0)==chainID(layer0)

然后這個(gè)文件夾中包含了diff、cache-id等,最主要的是Diff文件保存了這個(gè)層的diffID.cache-id為具體/var/lib/docker/overlay2/<cache-id>存儲路徑。

另外兩個(gè)chainID如何計(jì)算呢?

除了底層的layer層,還有一些高層的layer,他們的chainID文件夾中包含了parent文件,這個(gè)是值為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:”和中間的空格“ ”這兩個(gè)字符,否則計(jì)算就錯(cuò)誤了。

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

再計(jì)算最后的chainID:

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

得出最后的值為:

3dd8c8d4fd5b59d543c8f75a67cdfaab30aef5a6d99aea3fe74d8cc69d4e7bf2

第五步:

最后從chainID->cacheID

通過上一步計(jì)算找到當(dāng)前最頂層的chainID:

/var/lib/docker/image/overlay2/layerdb/sha256/保存了chianID信息,目錄名稱為chainID

這個(gè)目錄下的cache-id、diff、parent

通過這個(gè)chain生成一個(gè)cache-id

diff保存當(dāng)前l(fā)ayer的diff ID

parent保存上一層layer的chainID

cd 3dd8c8d4fd5b59d543c8f75a67cdfaab30aef5a6d99aea3fe74d8cc69d4e7bf2
cat cache-id

ddd5760e7cbfde67e325e77b540dfc13e7dccf1c7d1b156554d0a79378642bd1

第六步:

從cache-id得到最終的磁盤文件:

在/var/lib/docker/overlay2/

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

得到當(dāng)前的內(nèi)容。

完結(jié)。

總結(jié):

Overlay2比overlay更加高效,因?yàn)閛verlay2優(yōu)化了inode的利用。

layerID -> diffID -> chainID -> cacheID

layerID和diffID的對應(yīng)關(guān)系在diffid-by-digest和v2metadata-by-diffid

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

cacheID主要存在于/var/lib/docker/overlay2/<cache-id>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內(nèi)容