如果文件不在容器層(upperdir),則從鏡像層(lowerdir)讀取;

修改:

首次寫入: 如果在upperdir中不存在,overlay和overlay2執(zhí)行copy_up操作,把文件從lowdir拷貝到upperdir,由于overlayfs是文件級(jí)別的(即使文件只有很少的一點(diǎn)修改,也會(huì)產(chǎn)生的copy_up的行為),后續(xù)對(duì)同一文件的在此寫入操作將對(duì)已經(jīng)復(fù)制到容器的文件的副本進(jìn)行操作。這也就是常常說的寫時(shí)復(fù)制(copy-on-write)
刪除文件和目錄: 當(dāng)文件在容器被刪除時(shí),在容器層(upperdir)創(chuàng)建whiteout文件,鏡像層(lowerdir)的文件是不會(huì)被刪除的,因?yàn)樗麄兪侵蛔x的,但without文件會(huì)阻止他們顯示,當(dāng)目錄在容器內(nèi)被刪除時(shí),在容器層(upperdir)一個(gè)不透明的目錄,這個(gè)和上面whiteout原理一樣,阻止用戶繼續(xù)訪問,即便鏡像層仍然存在。

注意事項(xiàng)

copy_up操作只發(fā)生在文件首次寫入,以后都是只修改副本,
overlayfs只適用兩層目錄,,相比于比AUFS,查找搜索都更快。
容器層的文件刪除只是一個(gè)“障眼法”,是靠whiteout文件將其遮擋,image層并沒有刪除,這也就是為什么使用docker commit 提交保存的鏡像會(huì)越來越大,無論在容器層怎么刪除數(shù)據(jù),image層都不會(huì)改變。

 三、overlay2鏡像存儲(chǔ)結(jié)構(gòu)

從倉庫pull一個(gè)ubuntu鏡像,結(jié)果顯示總共拉取了4層鏡像如下:

此時(shí)4層被存儲(chǔ)在了/var/lib/docker/overlay2/目錄下:

這里面多了一個(gè)l目錄包含了所有層的軟連接,短鏈接使用短名稱,避免mount時(shí)候參數(shù)達(dá)到頁面大小限制(演示中mount命令查看時(shí)候的短目錄):

處于底層的鏡像目錄包含了一個(gè)diff和一個(gè)link文件,diff目錄存放了當(dāng)前層的鏡像內(nèi)容,而link文件則是與之對(duì)應(yīng)的短名稱:

在這之上的鏡像還多了work目錄和lower文件,lower文件用于記錄父層的短名稱,work目錄用于聯(lián)合掛載指定的工作目錄。而這些目錄和鏡像的關(guān)系是怎么組織在的一起呢?答案是通過元數(shù)據(jù)關(guān)聯(lián)。元數(shù)據(jù)分為image元數(shù)據(jù)和layer元數(shù)據(jù)。

image元數(shù)據(jù)

  鏡像元數(shù)據(jù)存儲(chǔ)在了/var/lib/docker/image/<storage_driver>/imagedb/content/sha256/目錄下,名稱是以鏡像ID命名的文件,鏡像ID可通過docker images查看,這些文件以json的形式保存了該鏡像的rootfs信息、鏡像創(chuàng)建時(shí)間、構(gòu)建歷史信息、所用容器、包括啟動(dòng)的Entrypoint和CMD等等。例如ubuntu鏡像的id為47b19964fb50:

查看其對(duì)應(yīng)的元數(shù)據(jù)(使用vim :%!python -m json.tool格式化成json) 截取了其rootfs的構(gòu)成:

上面的 diff_id 對(duì)應(yīng)的的是一個(gè)鏡像層,其排列也是有順序的,從上到下依次表示鏡像層的最低層到最頂層:

diff_id如何關(guān)聯(lián)進(jìn)行層?具體說來,docker 利用 rootfs 中的每個(gè)diff_id 和歷史信息計(jì)算出與之對(duì)應(yīng)的內(nèi)容尋址的索引(chainID) ,而chaiID則關(guān)聯(lián)了layer層,進(jìn)而關(guān)聯(lián)到每一個(gè)鏡像層的鏡像文件。

layer元數(shù)據(jù)

  layer 對(duì)應(yīng)鏡像層的概念,在 docker 1.10 版本以前,鏡像通過一個(gè) graph 結(jié)構(gòu)管理,每一個(gè)鏡像層都擁有元數(shù)據(jù),記錄了該層的構(gòu)建信息以及父鏡像層 ID,而最上面的鏡像層會(huì)多記錄一些信息作為整個(gè)鏡像的元數(shù)據(jù)。graph 則根據(jù)鏡像 ID(即最上層的鏡像層 ID) 和每個(gè)鏡像層記錄的父鏡像層 ID 維護(hù)了一個(gè)樹狀的鏡像層結(jié)構(gòu)。  

在 docker 1.10 版本后,鏡像元數(shù)據(jù)管理巨大的改變之一就是簡(jiǎn)化了鏡像層的元數(shù)據(jù),鏡像層只包含一個(gè)具體的鏡像層文件包。用戶在 docker 宿主機(jī)上下載了某個(gè)鏡像層之后,docker 會(huì)在宿主機(jī)上基于鏡像層文件包和 image 元數(shù)據(jù)構(gòu)建本地的 layer 元數(shù)據(jù),包括 diff、parent、size 等。而當(dāng) docker 將在宿主機(jī)上產(chǎn)生的新的鏡像層上傳到 registry 時(shí),與新鏡像層相關(guān)的宿主機(jī)上的元數(shù)據(jù)也不會(huì)與鏡像層一塊打包上傳。  

Docker 中定義了 Layer 和 RWLayer 兩種接口,分別用來定義只讀層和可讀寫層的一些操作,又定義了 roLayer 和 mountedLayer,分別實(shí)現(xiàn)了上述兩種接口。其中,roLayer 用于描述不可改變的鏡像層,mountedLayer 用于描述可讀寫的容器層。具體來說,roLayer 存儲(chǔ)的內(nèi)容主要有索引該鏡像層的 chainID、該鏡像層的校驗(yàn)碼 diffID、父鏡像層 parent、storage_driver 存儲(chǔ)當(dāng)前鏡像層文件的 cacheID、該鏡像層的 size 等內(nèi)容。這些元數(shù)據(jù)被保存在 /var/lib/docker/image/<storage_driver>/layerdb/sha256/<chainID>/ 文件夾下。如下:

每個(gè)chainID目錄下會(huì)存在三個(gè)文件cache-id、diff、zize:

cache-id文件:

docker隨機(jī)生成的uuid,內(nèi)容是保存鏡像層的目錄索引,也就是/var/lib/docker/overlay2/中的目錄,這就是為什么通過chainID能找到對(duì)應(yīng)的layer目錄。以chainID為d801a12f6af7beff367268f99607376584d8b2da656dcd8656973b7ad9779ab4 對(duì)應(yīng)的目錄為 130ea10d6f0ebfafc8ca260992c8d0bef63a1b5ca3a7d51a5cd1b1031d23efd5,也就保存在/var/lib/docker/overlay2/130ea10d6f0ebfafc8ca260992c8d0bef63a1b5ca3a7d51a5cd1b1031d23efd5

diff文件:

保存了鏡像元數(shù)據(jù)中的diff_id(與元數(shù)據(jù)中的diff_ids中的uuid對(duì)應(yīng))

size文件:

保存了鏡像層的大小

在 layer 的所有屬性中,diffID 采用 SHA256 算法,基于鏡像層文件包的內(nèi)容計(jì)算得到。而 chainID 是基于內(nèi)容存儲(chǔ)的索引,它是根據(jù)當(dāng)前層與所有祖先鏡像層 diffID 計(jì)算出來的,具體算如下:

如果該鏡像層是最底層(沒有父鏡像層),該層的 diffID 便是 chainID。
該鏡像層的 chainID 計(jì)算公式為 chainID(n)=SHA256(chain(n-1) diffID(n)),也就是根據(jù)父鏡像層的 chainID 加上一個(gè)空格和當(dāng)前層的 diffID,再計(jì)算 SHA256 校驗(yàn)碼。

mountedLayer 信息存儲(chǔ)的可讀init層以及容器掛載點(diǎn)信息包括:容器 init 層ID(init-id)、聯(lián)合掛載使用的ID(mount-id)以及容器層的父層鏡像的 chainID(parent)。相關(guān)文件位于/var/lib/docker/image/<storage_driver>/layerdb/mounts/<container_id>/ 目錄下。如下啟動(dòng)一個(gè)id為3c96960b3127的容器:

查看其對(duì)應(yīng)的mountedLayer三個(gè)文件:

可以看到initID是在mountID后加了一個(gè)-init,同時(shí)initID就是存儲(chǔ)在/var/lib/docker/overlay2/的目錄名稱:

查看mountID還可以直接通過mount命令查看對(duì)應(yīng)掛載的mountID,對(duì)應(yīng)著/var/lib/docker/overlay2/目錄,這也是overlayfs呈現(xiàn)的merged目錄:

在容器中創(chuàng)建了一文件:

此時(shí)到宿主的merged目錄就能看到對(duì)應(yīng)的文件:

關(guān)于init層

  init層是以一個(gè)uuid -init結(jié)尾表示,夾在只讀層和讀寫層之間,作用是專門存放/etc/hosts、/etc/resolv.conf等信息,需要這一層的原因是當(dāng)容器啟動(dòng)時(shí)候,這些本該屬于image層的文件或目錄,比如hostname,用戶需要修改,但是image層又不允許修改,所以啟動(dòng)時(shí)候通過單獨(dú)掛載一層init層,通過修改init層中的文件達(dá)到修改這些文件目的。而這些修改往往只讀當(dāng)前容器生效,而在docker commit提交為鏡像時(shí)候,并不會(huì)將init層提交。該層文件存放的目錄為/var/lib/docker/overlay2/<init_id>/diff

小結(jié)

通過以上的內(nèi)容介紹,一個(gè)容器完整的層應(yīng)由三個(gè)部分組成,如下圖:

鏡像層:也稱為rootfs,提供容器啟動(dòng)的文件系統(tǒng)
init層: 用于修改容器中一些文件如/etc/hostname、/etc/resolv.conf等
容器層:使用聯(lián)合掛載統(tǒng)一給用戶提供的可讀寫目錄。

四、總結(jié)

  本文介紹了以overlayfs作為存儲(chǔ)驅(qū)動(dòng)的的鏡像存儲(chǔ)原理其中每層的鏡像數(shù)據(jù)保存在/var/lib/docker/overlay2/<uuid>/diff目錄下,init層數(shù)據(jù)保存了在 /var/lib/docker/overlay2/<init-id>/diff目錄下,最后統(tǒng)一視圖(容器層)數(shù)據(jù)在 /var/lib/docker/overlay2/<mount_id>/diff目錄下,docker通過image元數(shù)據(jù)和layer元數(shù)據(jù)利用內(nèi)容尋址(chainID)將這些目錄組織起來構(gòu)成容器所運(yùn)行的文件系統(tǒng)。

參考:

《use overlayfs driver 》

《Docker 鏡像之存儲(chǔ)管理》

到此這篇關(guān)于Docker鏡像存儲(chǔ)overlayfs的使用的文章就介紹到這了,更多相關(guān)Docker鏡像存儲(chǔ)overlayfs內(nèi)容請(qǐng)搜素三五互聯(lián)以前的文章或下面相關(guān)文章,希望大家以后多多支持三五互聯(lián)

更多關(guān)于云服務(wù)器域名注冊(cè),虛擬主機(jī)的問題,請(qǐng)?jiān)L問三五互聯(lián)官網(wǎng):m.shinetop.cn

贊(0)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享網(wǎng)絡(luò)內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。郵箱:3140448839@qq.com。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明出處:三五互聯(lián)知識(shí)庫 » Docker鏡像存儲(chǔ)overlayfs的使用

登錄

找回密碼

注冊(cè)

主站蜘蛛池模板: 国产午精品午夜福利757视频播放 国产午夜A理论毛片 | 日韩av第一页在线播放| 乱人伦无码中文视频在线| 亚洲а∨天堂久久精品2021| 蜜芽久久人人超碰爱香蕉| 久久国内精品自在自线91| 久久亚洲精品无码va白人极品| 香蕉EEWW99国产精选免费| 色一伊人区二区亚洲最大| 久青草视频在线视频在线| 精品国精品自拍自在线| 天天摸天天做天天爽水多| 免费午夜无码片在线观看影院| 欧美色欧美亚洲高清在线观看| 免费国产一区二区不卡| 亚洲精品有码在线观看| 美乳丰满人妻无码视频| 日韩本精品一区二区三区| 国产视频有码字幕一区二区| 中文字幕精品人妻丝袜| 国产精品免费中文字幕| 我国产码在线观看av哈哈哈网站| 国产精品尤物乱码一区二区| 精品无码一区在线观看| 精品久久久久久中文字幕| 精品少妇爆乳无码aⅴ区| 夜夜躁日日躁狠狠久久av| 无码射肉在线播放视频| 国产69精品久久久久99尤物| 国产一区二区不卡在线看| 国产女人喷潮视频免费| 凸凹人妻人人澡人人添| 国产熟睡乱子伦午夜视频| 国产熟女一区二区三区蜜臀| 国产精品激情av在线播放| XXXXXHD亚洲日本HD| 夜夜添无码试看一区二区三区 | 好男人社区影视在线WWW| 国产成人亚洲精品狼色在线| 高清无码18| 亚洲综合久久精品国产高清|