?
This document uses PHP Chinese website manual Release
AUFS 聯(lián)合文件系統(tǒng)。的aufs
存儲(chǔ)驅(qū)動(dòng)程序是用于在多克爾管理圖像和層的Ubuntu的默認(rèn)存儲(chǔ)驅(qū)動(dòng)器,以及適用于Debian版本拉伸之前。對(duì)于Debian Stretch,overlay2是默認(rèn)值。
AUFS是Docker使用的最成熟的存儲(chǔ)驅(qū)動(dòng)程序。它提供了快速的容器啟動(dòng)時(shí)間,以及高效的內(nèi)存和存儲(chǔ)使用。
如果您的Linux內(nèi)核版本為4.0或更高版本,并且您使用Docker CE,請(qǐng)考慮使用較新的overlay2,它比aufs
存儲(chǔ)驅(qū)動(dòng)程序具有潛在的性能優(yōu)勢(shì)。
注意:盡管如果AUFS在Linux內(nèi)核中存在,但默認(rèn)情況下使用AUFS,但某些分發(fā)版和Docker版本不支持AUFS。請(qǐng)參閱先決條件>以獲取有關(guān)受支持平臺(tái)的更多信息,另請(qǐng)參閱存儲(chǔ)驅(qū)動(dòng)程序首選項(xiàng)的順序。
對(duì)于Docker CE,AUFS在Ubuntu上支持,而在Stretch之前在Debian版本上支持。
對(duì)于Docker EE,AUFS在Ubuntu上受支持。
如果您使用Ubuntu,則需要安裝額外的軟件包以將AUFS模塊添加到內(nèi)核。如果您不安裝這些軟件包,則需要devicemapper
在Ubuntu 14.04(不推薦)或overlay2
Ubuntu 16.04及更高版本上使用,這也受支持。
AUFS不能使用下面的后盾文件系統(tǒng):aufs
,btrfs
,或ecryptfs
。這意味著包含的文件系統(tǒng)/var/lib/docker/aufs
不能是這些文件系統(tǒng)類型之一。
aufs
存儲(chǔ)驅(qū)動(dòng)程序配置Docker如果在啟動(dòng)Docker時(shí)將AUFS驅(qū)動(dòng)程序加載到內(nèi)核中,并且沒有配置其他存儲(chǔ)驅(qū)動(dòng)程序,Docker默認(rèn)使用它。
使用以下命令來驗(yàn)證您的內(nèi)核是否支持AUFS。$ grep aufs /proc/filesystems nodev aufs
檢查Docker正在使用哪個(gè)存儲(chǔ)驅(qū)動(dòng)程序。$ docker info <truncated output>存儲(chǔ)驅(qū)動(dòng)程序:aufs Root Dir: /var/lib/docker/aufs 備份文件系統(tǒng):extfs Dirs:0 Dirperm1支持:true<truncated output>
如果您使用的是不同的存儲(chǔ)驅(qū)動(dòng)程序,則AUFS不包含在內(nèi)核中(在這種情況下,將使用不同的默認(rèn)驅(qū)動(dòng)程序),或者Docker已明確配置為使用不同的驅(qū)動(dòng)程序。檢查/etc/docker/daemon.json
或輸出ps auxw | grep dockerd
以查看Docker是否已經(jīng)啟動(dòng)了--storage-driver
標(biāo)志。
aufs
存儲(chǔ)驅(qū)動(dòng)程序作品AUFS是一個(gè)聯(lián)合文件系統(tǒng),這意味著它在單個(gè)Linux主機(jī)上分層多個(gè)目錄并將它們呈現(xiàn)為單個(gè)目錄。這些目錄在AUFS術(shù)語中稱為分支,在Docker術(shù)語中稱為層。統(tǒng)一過程被稱為聯(lián)合安裝。
下圖顯示了一個(gè)基于ubuntu:latest
圖像的Docker容器。
每個(gè)圖像層和容器層都在Docker主機(jī)上表示為子目錄/var/lib/docker/
。聯(lián)合安裝提供了所有圖層的統(tǒng)一視圖。目錄名稱不直接對(duì)應(yīng)于圖層本身的ID。
AUFS使用Copy-on-Write(CoW)策略來最大限度地提高存儲(chǔ)效率并將開銷降至最低。
以下docker pull
命令顯示了一個(gè)Docker主機(jī)下載一個(gè)包含五層的Docker鏡像。
$ docker pull ubuntu Using default tag: latest latest: Pulling from library/ubuntu b6f892c0043b: Pull complete 55010f332b04: Pull complete 2955fb827c94: Pull complete 3deef3fcbd30: Pull complete cf9722e506aa: Pull complete Digest: sha256:382452f82a8bbd34443b2c727650af46aced0f94a44463c62a9848133ecb1aa8 Status: Downloaded newer image for ubuntu:latest
警告:不要直接操作其中的任何文件或目錄
/var/lib/docker/
。這些文件和目錄由Docker管理。
所有關(guān)于圖像和容器圖層的信息都存儲(chǔ)在中的子目錄中/var/lib/docker/aufs/
。
diff/
:每個(gè)圖層的內(nèi)容,每個(gè)圖層都存儲(chǔ)在一個(gè)單獨(dú)的子目錄中
layers/
:關(guān)于圖像圖層堆疊的元數(shù)據(jù)。該目錄包含Docker主機(jī)上每個(gè)圖像或容器層的一個(gè)文件。每個(gè)文件都包含堆棧(其父項(xiàng))下面的所有圖層的ID。
mnt/
:安裝點(diǎn),每個(gè)映像或容器層一個(gè),用于組裝和安裝容器的統(tǒng)一文件系統(tǒng)。對(duì)于只讀的圖像,這些目錄將始終為空。
如果容器正在運(yùn)行,則以/var/lib/docker/aufs/
下列方式更改內(nèi)容:
diff/
:可寫容器層中引入的差異,如新文件或修改過的文件。
layers/
:關(guān)于可寫容器層的父層的元數(shù)據(jù)。
mnt/
:每個(gè)正在運(yùn)行的容器的統(tǒng)一文件系統(tǒng)的安裝點(diǎn),完全與容器內(nèi)顯示的一樣。
aufs
讀取和寫入的工作方式考慮三種場景,其中一個(gè)容器打開一個(gè)文件進(jìn)行重疊讀取訪問。
該文件不存在于容器層中:如果容器打開一個(gè)文件以進(jìn)行讀取訪問,并且文件尚不存在于容器層中,則存儲(chǔ)驅(qū)動(dòng)程序會(huì)在圖像層中搜索文件,容器層。它從它所在的圖層讀取。
該文件僅存在于容器層中:如果容器打開一個(gè)用于讀取訪問的文件,并且文件存在于容器層中,則從該文件中讀取該文件。
該文件同時(shí)存在于容器圖層和圖像圖層中:如果容器打開文件進(jìn)行讀取訪問,并且文件存在于容器圖層和一個(gè)或多個(gè)圖像圖層中,則從容器圖層讀取文件。容器圖層中的文件會(huì)隱藏圖像圖層中具有相同名稱的文件。
考慮一些容器中的文件被修改的場景。
第一次寫入文件:容器首次寫入現(xiàn)有文件時(shí),該文件不存在于容器(upperdir
)中。該aufs
驅(qū)動(dòng)程序執(zhí)行copy_up操作將文件從存在的圖像層復(fù)制到可寫容器層。容器然后將更改寫入容器層中的文件的新副本。但是,AUFS在文件級(jí)別而不是塊級(jí)別上工作。這意味著所有的copy_up操作都會(huì)復(fù)制整個(gè)文件,即使文件非常大,只有一小部分被修改。這可能會(huì)對(duì)容器寫入性能產(chǎn)生顯著影響。AUFS在搜索多層圖像中的文件時(shí)可能會(huì)出現(xiàn)明顯的延遲。但是,值得注意的是copy_up操作僅在給定文件第一次寫入時(shí)發(fā)生。隨后寫入同一文件的操作與已經(jīng)復(fù)制到容器的文件副本相反。
刪除文件和目錄:
- When a _file_ is deleted within a container, a _whiteout_ file is created in the container layer. The version of the file in the image layer is not deleted (because the image layers are read-only). However, the whiteout file prevents it from being available to the container.
- When a _directory_ is deleted within a container, an _opaque file_ is created in the container layer. This works in the same way as a whiteout file and effectively prevents the directory from being accessed, even though it still exists in the image layer.
重命名目錄:rename(2)
在AUFS上不完全支持呼叫目錄。它返回EXDEV
(即“跨設(shè)備鏈接不允許”),即使源和目標(biāo)路徑都位于同一個(gè)AUFS層上,除非目錄中沒有子節(jié)點(diǎn)。您的應(yīng)用程序需要被設(shè)計(jì)為處理EXDEV
并回退到“復(fù)制和取消鏈接”策略。
總結(jié)一些已經(jīng)提到的性能相關(guān)方面:
AUFS存儲(chǔ)驅(qū)動(dòng)程序的性能低于overlay2
驅(qū)動(dòng)程序,但對(duì)于PaaS和其他類似的容器密度很重要的使用案例來說,這是一個(gè)不錯(cuò)的選擇。這是因?yàn)锳UFS可以在多個(gè)正在運(yùn)行的容器之間高效地共享映像,從而實(shí)現(xiàn)快速的容器啟動(dòng)時(shí)間和最少的磁盤空間使用。
AUFS如何在圖像層和容器之間共享文件的底層機(jī)制非常高效地使用頁面緩存。
AUFS存儲(chǔ)驅(qū)動(dòng)程序可以在容器寫入性能方面引入顯著的延遲。這是因?yàn)榈谝淮稳萜鲗懭肴魏挝募r(shí),該文件必須被定位并被復(fù)制到容器頂部可寫層中。當(dāng)這些文件存在于許多圖像層下并且文件本身很大時(shí),這些延遲會(huì)增加并且復(fù)雜化。
以下通用性能最佳實(shí)踐也適用于AUFS。
固態(tài)設(shè)備(SSD)比旋轉(zhuǎn)磁盤提供更快的讀取和寫入速度。
將卷用于寫入繁重的工作負(fù)載:卷為寫入繁重的工作負(fù)載提供最佳和最可預(yù)測的性能。這是因?yàn)樗鼈兝@過了存儲(chǔ)驅(qū)動(dòng)程序,并且不會(huì)產(chǎn)生精簡配置和寫入時(shí)復(fù)制引入的任何潛在開銷。卷還有其他好處,例如允許您在容器之間共享數(shù)據(jù),并且即使在沒有正在運(yùn)行的容器正在使用它們時(shí)也會(huì)持久存在。
了解圖像,容器和存儲(chǔ)驅(qū)動(dòng)程序
選擇存儲(chǔ)驅(qū)動(dòng)程序
Btrfs存儲(chǔ)驅(qū)動(dòng)程序在實(shí)踐中
Device Mapper存儲(chǔ)驅(qū)動(dòng)程序在實(shí)踐中