原理 Docker儲存驅動之AUFS

2021-08-15 18:24:29 字數 2931 閱讀 1630

docker儲存驅動簡介

docker內建多種儲存驅動,每種儲存驅動都是基於linux檔案系統(linux fs)或者卷管理(volume manager)技術。一般來說,docker儲存驅動的名稱與檔案系統(儲存技術)同名,見下表對應關係:

aufs簡介

aufs,起初名為anotherunionfilesystem,是一種unionfs,v2版本後更名為 advanced multi‐layered unification fileystem,即高階多層統一檔案系統。

aufs是一位名為岡島純二郎的日本人於2023年基於unionfs開發的,目的也是為了提高其可靠性和效能,也在aufs上實現了一些新的概念比如寫分支平衡等(writeable branchbalancing)。

純二郎先生曾多次提交aufs到linux主幹,但一直被拒絕,可純二郎依舊日以繼夜的修改**,並不斷提交,可一直沒有被merge,而純二郎最終也放棄提交**到linux主幹,從而aufs也一直沒有進入linux核心。關於為何linux不要aufs,主要是aufs**太糟糕,「dense,unreadable,and uncommented」,亂,可讀性差,沒注釋...。

tips:雖然aufs沒有進入liunx核心,但是ubuntu系統使用aufs作為預設的儲存驅動,docker早期僅支援ubuntu便是這個原因。

aufs核心概念

將多個目錄合併成乙個虛擬檔案系統,成員目錄稱為虛擬檔案系統的乙個分支(branch)。

例如,把 /tmp, /var, /opt三個目錄聯合掛著到 /aufs目錄下,則 /aufs目錄可見 /tmp, /var, /opt目錄下的所有檔案。而每個成員目錄,則稱為虛擬檔案系統的乙個branch。

每個branch可以指定 readwrite/whiteout‐able/readonly許可權,唯讀(ro),讀寫(rw),寫隱藏(wo)。一般情況下,aufs只有最上層的branch具有讀寫許可權,其餘branch均為唯讀許可權。唯讀branch只能邏輯上修改。

例如,把/tmp目錄和 /var目錄聯合掛載到 /aufs目錄下, /var目錄掛載為頂層branch具有rw許可權,而 /tmp目錄掛載為下層branch,具有ro許可權。如果把 /tmp目錄 /var目錄 /opt目錄聯合掛載到 /aufs目錄下,只有最頂層 /optbranch具有rw許可權,下層branch均為ro許可權。

tips:mount ­t aufs ­obr=/tmp:/var:/opt none /aufs

該指令聯合掛載 /tmp, /var, /opt至掛載點 /aufs,按照從左到右的順序 /tmp位於頂層branch,而 /opt位於最底層branch,所有的branch按照順序共同構成 /aufs棧。

aufs每層branch可以動態的增加刪除,每增加一層,下層預設置為ro,最上一層為rw。刪除branch是在aufs掛載點移除,並未刪除掛載目錄。

docker中的aufs

aufs是docker使用的第乙個儲存驅動,長時間以來,一直很穩定。雖然目前docker支援多種儲存驅動,而在ubuntu中預設使用aufs儲存驅動,可以使用docker info指令進行檢視。對於docker而言,aufs有很多優秀的特點,比如快速啟動容器,高效儲存利用率,高效記憶體利用率等。

docker映象和aufs branch對應關係 。

在執行容器的時候,建立乙個aufs branch位於image層之上,具有rw許可權,並把這些branch聯合掛載到乙個掛載點下。這就是docker能夠乙個映象執行多個容器的原理所在。

例如,image有3個目錄位於 /var/lib/docker/aufs/diff/資料夾內,當基於該image建立容器時,建立乙個容器執行目錄,同樣位於/var/lib/docker/aufs/diff/目錄下,並使用aufs聯合掛載image目錄和container目錄到 /var/lib/docker/aufs/mnt/目錄下。

每乙個目錄在aufs內都是一層branch,只有頂層容器branch可讀寫,下層image branch均唯讀。建立多個容器時,只需建立多個容器執行目錄,使用aufs把容器執行目錄掛載在image目錄之上,即實現乙個image執行多個container。

如上圖中基於同乙個image執行兩個容器,低層image一致,每啟動乙個新容器,便會新建乙個目錄作為aufs branch並與image branch進行聯合掛載。

容器檔案讀寫與刪除

當容器需要修改乙個檔案,而該檔案位於低層branch時,頂層branch會直接複製低層branch的檔案至頂層再進行修改,而低層的檔案不變,這種方式即是cow技術(寫複製),aufs預設支援cow技術。

當容器刪除乙個低層branch檔案時,只是在頂層branch對該檔案進行重新命名並隱藏,實際並未刪除檔案,只是不可見,這種方式即aufs的whiteout(寫隱藏)。

下圖所示,容器層所見file1檔案為映象層檔案,當需要修改file1時,會從映象層把檔案複製到容器層,然後進行修改,從而保證映象層資料的完整性和復用性。

下圖所示,當需要刪除file1時,由於file1是映象層檔案,容器層會建立乙個 .wh前置的隱藏檔案,從而實現對file1的隱藏,實際並未刪除file1,從而保證映象層資料的完整性和復用性。

docker本地儲存目錄

docker映象存在在/var/lib/docker/aufs/diff/目錄下。/var/lib/docker/aufs/layers/目錄儲存image的元資訊,主要是image的每一層layer組織順序(aufs branch堆積順序)。

docker

容器掛載點位於/var/lib/docker/aufs/mnt/目錄下,該目錄即為aufs聯合掛載點。

tips:早期映象的每一層資料儲存在/var/lib/docker/aufs/diff/目錄下,映象id與目錄名同名,從docker v1.10 版本之後映象id不再與 /var/lib/docker/aufs/diff/目錄下的目錄同名,而是採用乙個安全的hash值作為映象儲存資料夾名稱。 總結

採用aufs作為 docker的容器儲存驅動,使用aufs技術,能夠提供如下好處:

對Docker儲存驅動的評價

本文講的是對docker儲存驅動的評價,編者的話 docker 的生態系統不斷完善,上到容器的編排發布,下到網路儲存,都有著各種選擇。對於docker 最底層的儲存驅動,也有著overlay zfs等選擇,各有利弊,本文從一位使用者的角度對不同的驅動發表了自己的看法,僅供參考。很坦率的說,我認為每種...

docker修改儲存驅動為overlay2

docker儲存驅動和伺服器的檔案格式有關係 1.伺服器採用ext4檔案格式,則docker的儲存驅動會自然而然的使用overlay2模式 2.伺服器採用xfs的檔案格式的話,則需要設定xfs的ftype 1 在格式化的時候設定 1.停止docker systemctl stop docker mv...

docker之資料儲存

docker映象是乙個唯讀的檔案系統,容器是映象的執行環境,即在映象基礎上再加一層可讀寫的層,因此所有容器中的資料寫入時均寫到容器中,會隨著容器的銷毀而消失。為確保容器可以儲存資料,docker引入資料卷volume來處理此情況。volume就是目錄或者檔案,它可以繞過預設的聯合檔案系統,而以正常的...