Docker存儲驅動overlay和overlay2


OverlayFS是內核提供的,一個類似於AUFS 的現代聯合文件系統,實現簡單,且可能更快一些。 

overlay和overlay2(Docker1.12+)是docker的存儲驅動,可以通過docker.service啟動參數中的--storage-driver參數設置。

一、OverlayFS

OverlayFS將單個Linux主機上的兩個目錄合並成一個目錄,對外提供一個統一的視角,這些目錄被稱為層,合並過程被稱為聯合掛載。OverlayFS下層目錄稱為lowerdir, 上層目錄稱為upperdir,合並對外展示的統一視圖稱為merged。下層是只讀的,上層是可寫的,並且上層目錄會覆蓋下層目錄的內容。

當需要修改一個文件時,使用Copy-on-Write(寫時復制)將文件從只讀的Lower復制到可寫的Upper進行修改,結果也保存在Upper層。

在Docker中,底下的只讀層就是Image,可寫層就是Container。

下圖分層圖,鏡像層是lowdir,容器層是upperdir,統一的視圖層是merged層

二、overlay 

overlay是docker的存儲驅動,默認存儲路徑是/var/lib/docker/overlay/,在該路徑下,每個鏡像層都有一個對應的目錄,包含了該層鏡像的內容,每個鏡像層只包含一個root目錄。 鏡像層目錄中,共享的數據使用的是硬鏈接,他們的inode號相同,這樣做有效地利用了磁盤。

創建容器時,會在已有的鏡像層上創建一層容器層,容器層在路徑/var/lib/docker/overlay下也存在對應的目錄,鏡像頂層是overlay中的只讀lowerdir,容器的新目錄是可寫的upperdir。

文件 lower-id 用來記錄下層的鏡像層,upper 包含了容器層的內容。創建容器時將lower-id指向的鏡像層目錄以及upper目錄聯合掛載到merged目錄,work 用來完成如 copy-on_write 的操作。

如果在創建的容器中創建一個文件file,則在對應的讀寫層目錄中,發現upper目錄下多出了一個file文件,就是剛才在容器中創建的文件。

注意:docker1.10+使用基於內容的尋址,鏡像層ID和/var/lib/docker中的目錄名不再一一對應

三、overlay2

overlay2是overlay的改進版,只支持4.0以上內核(centos 3.10.0-514及以上內核版本也有此特性),添加了Multiple lower layers in overlayfs的特性,所以overlay2可以直接造成muitiple lower layers不用像overlay一樣要通過硬鏈接的方式,所以消耗更少的inode。

overlay2的默認存儲路徑是/var/lib/docker/overlay2/,每個鏡像層都有一個對應的目錄,包含了該層鏡像的內容。

”l“目錄包含一些符號鏈接作為縮短的層標識符,這些縮短的標識符用來避免掛載時超出頁面大小的限制。

啟動一個容器,也是載/var/lib/docker/overlay2目錄下生成一層容器層,目錄包括diff,link,lower,merged,work,

diff記錄每一層自己內容的數據,link記錄該層鏈接目錄(實際是l目錄下到層的鏈接),lower記錄下層鏡像的鏈接,merged是聯合掛載目錄,work記錄對容器的操縱。

最底層包含”link”文件,這個文件記錄着作為標識符的更短的符號鏈接的名字,最底層還有一個”diff”目錄,包含實際內容,因為是最底層,所以不包含lower文件。

從第二層開始,每層鏡像層包含”lower“文件,根據這個文件可以索引構建出整個鏡像的層次結構。

四、容器的讀寫

對於讀:

讀的文件只存在在容器層,直接從容器層讀;
讀的文件不在容器層,則從鏡像層進行讀;
讀的文件在容器層和鏡像層,讀容器層中的文件,因為容器層隱藏了鏡像層同名的文件;

對於寫:

寫的文件在容器層,直接寫入;
寫的文件不在容器層,在鏡像層,由於文件不在容器層,因此overlay/overlay2存儲驅動使用CoW操作從鏡像層拷貝文件到容器層,然后將寫入的內容寫入到拷貝的文件中;
刪除文件和目錄,刪除鏡像層的文件,會在容器層創建一個whiteout文件來隱藏它;刪除鏡像層的目錄,會創建opaque目錄,它和whiteout文件有相同的效果;
重命名目錄,對一個目錄調用rename(2)僅僅在資源和目的地路徑都在頂層時才被允許,否則返回EXDEV。

五、overlay和overlay2的區別

本質區別是鏡像層之間共享數據的方法不同,

overlay共享數據方式是通過硬連接,只掛載一層,其他層通過硬連接形式共享(增加了磁盤inode的負擔),

而overlay2是通過每層的 lower文件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM