docker檔案系統分層儲存原理

2022-06-05 06:24:07 字數 2702 閱讀 9633

前言

眾所周知,docker映象技術的基礎是聯合檔案系統(unionfs),其檔案系統是分層的,那它的分層機制是什麼樣的呢?共分為幾種層呢?又是怎麼工作的呢?

linux 中各發行版實現的 unionfs 各不相同,所以docker在不同 linux 發行版中使用的也不同。通過docker info 命令可以檢視當前系統所使用哪種 unionfs,常見的幾種發行版使用如下:

centos, storage driver: overlay2、overlay

debain, storage driver: aufs

介紹下面我們就以centos發行版的overlay2檔案系統進行介紹,其實不管是什麼發行版,其原理都如出一轍。

先來看張圖:

從上述圖中可以看到三個層結構,即lowerdir、upperdir、merged層

對應的,使用docker inspect [容器id]就可以看到這幾個層所在的位置

"

graphdriver":

},

1、lowerdir層:其中lowerdir是唯讀的映象層(image layer),其中就包含bootfs/rootfs層,bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引導載入kernel,當boot成功 kernel 被載入到記憶體中,bootfs就被umount了,rootfs(root file system)包含的就是典型linux系統中的/dev、/proc、/bin、/etc等標準目錄。

lowerdir是可以分很多層的,除了bootfs/rootfs層以外,還可以通過dockerfile建立很多image層,構建過程如下:

dockerfile中每乙個指令都會生成乙個新的image層,如上圖所示。

當from時就已經生成了bootfs/rootfs層,也就是kernel和base層。

2、upperdir層

upperdir層是lowerdir的上一層,只有這一層可讀可寫的,其實就是container層,在啟動乙個容器的時候會在最後的image層的上一層自動建立,所有對容器資料的更改都會發生在這一層。

3、merged層

merged層就是聯合掛載層,也就是給使用者暴露的統一視覺,將image層和container層結合,就如最上邊的圖中描述一致,同一檔案,在此層會展示離它最近的層級裡的檔案內容,或者可以理解為,只要container層中有此檔案,便展示container層中的檔案內容,若container層中沒有,則展示image層中的。

聯合掛載系統的工作原理

1、讀:

如果檔案在upperdir(容器)層,直接讀取檔案;

如果檔案不在upperdir(容器)層,則從映象層(lowerdir)讀取;

2、寫:

首次寫入:如果upperdir中不存在,overlay和overlay2執行copy_up操作,把檔案從lowdir拷貝到upperdir中,由於overlayfs是檔案級別的(即使只有很少的一點修改,也會產生copy_up的動作),後續對同一檔案的再次寫入操作將對已經複製到容器層的檔案副本進行修改,這也就是嚐嚐說的寫時複製(copy-on-write)。

刪除檔案或目錄:當檔案被刪除時,在容器層(upperdir)建立whiteout檔案,映象層(lowerdir)的檔案是不會被刪除的,因為它們是唯讀的,但without檔案會阻止它們顯示,當目錄被刪除時,在容器層(upperdir)乙個不透明的目錄,這個和上邊的whiteout的原理一樣,組織使用者繼續訪問,image層不會發生改變

3、注意事項

copy_up操作只發生在檔案首次寫入,以後都是只修改副本,

overlayfs只適用兩層目錄,,相比於比aufs,查詢搜尋都更快。

容器層的檔案刪除只是乙個「障眼法」,是靠whiteout檔案將其遮擋,image層並沒有刪除,這也就是為什麼使用docker commit 提交儲存的映象會越來越大,無論在容器層怎麼刪除資料,image層都不會改變。 

4、容器整體構成圖

此圖中沒有展現聯合掛載層

對比帶著問題看事物,docker容器為什麼啟動這麼快呢???

先來看一張docker與vm的對比圖:

可以清楚的看到,vm比docker多了hypervisor 和 guest os的過程,也正是省略了這些過程使docker技高一籌,問題又來了,為什麼docker可以省略這些過程呢?

以下是官網提供的容器啟動過程圖:

docker學習 映象原理 聯合檔案系統 分層原理

聯合檔案系統和分層原理 docker的映象都是唯讀的,當容器啟動時,乙個新的可寫層被載入到這個映象的頂部。這一層我們通常稱之為 容器層 容器層之下的層叫 映象層 圖中的頂上兩層,是docker為docker容器新建的內容,而這兩層屬於容器範疇。這兩層分別為docker容器的初始層 init laye...

檔案系統分類

隱藏 檔案系統 磁碟 fat全域性檔案系統 gfs 分層檔案系統 hfs hfs plus 高效能檔案系統 ibm通用並行檔案系統 jfsmacintosh檔案系統 minix netware檔案系統 nilfs novell儲存服務 ntfs qfsqnx4fs reiserfs spadfs u...

檔案 FAT檔案系統分析

一 硬碟儲存結構 硬碟總體儲存圖 採用希捷硬碟120g,winhex檢視,主引導記錄mbr如下 硬碟分割槽表,64位元組,分四個分割槽,每個分割槽佔16位。擴充套件分割槽,就像加入了乙個u盤,第乙個扇區512位元組,為分割槽引導記錄dbr,還有其他。二 fat檔案儲存基本原理 fat表就是乙個簇號的...