?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
AUFS 聯(lián)合文件系統(tǒng)。的aufs
存儲驅動程序是用于在多克爾管理圖像和層的Ubuntu的默認存儲驅動器,以及適用于Debian版本拉伸之前。對于Debian Stretch,overlay2是默認值。
AUFS是Docker使用的最成熟的存儲驅動程序。它提供了快速的容器啟動時間,以及高效的內存和存儲使用。
如果您的Linux內核版本為4.0或更高版本,并且您使用Docker CE,請考慮使用較新的overlay2,它比aufs
存儲驅動程序具有潛在的性能優(yōu)勢。
注意:盡管如果AUFS在Linux內核中存在,但默認情況下使用AUFS,但某些分發(fā)版和Docker版本不支持AUFS。請參閱先決條件>以獲取有關受支持平臺的更多信息,另請參閱存儲驅動程序首選項的順序。
對于Docker CE,AUFS在Ubuntu上支持,而在Stretch之前在Debian版本上支持。
對于Docker EE,AUFS在Ubuntu上受支持。
如果您使用Ubuntu,則需要安裝額外的軟件包以將AUFS模塊添加到內核。如果您不安裝這些軟件包,則需要devicemapper
在Ubuntu 14.04(不推薦)或overlay2
Ubuntu 16.04及更高版本上使用,這也受支持。
AUFS不能使用下面的后盾文件系統(tǒng):aufs
,btrfs
,或ecryptfs
。這意味著包含的文件系統(tǒng)/var/lib/docker/aufs
不能是這些文件系統(tǒng)類型之一。
aufs
存儲驅動程序配置Docker如果在啟動Docker時將AUFS驅動程序加載到內核中,并且沒有配置其他存儲驅動程序,Docker默認使用它。
使用以下命令來驗證您的內核是否支持AUFS。$ grep aufs /proc/filesystems nodev aufs
檢查Docker正在使用哪個存儲驅動程序。$ docker info <truncated output>存儲驅動程序:aufs Root Dir: /var/lib/docker/aufs 備份文件系統(tǒng):extfs Dirs:0 Dirperm1支持:true<truncated output>
如果您使用的是不同的存儲驅動程序,則AUFS不包含在內核中(在這種情況下,將使用不同的默認驅動程序),或者Docker已明確配置為使用不同的驅動程序。檢查/etc/docker/daemon.json
或輸出ps auxw | grep dockerd
以查看Docker是否已經啟動了--storage-driver
標志。
aufs
存儲驅動程序作品AUFS是一個聯(lián)合文件系統(tǒng),這意味著它在單個Linux主機上分層多個目錄并將它們呈現(xiàn)為單個目錄。這些目錄在AUFS術語中稱為分支,在Docker術語中稱為層。統(tǒng)一過程被稱為聯(lián)合安裝。
下圖顯示了一個基于ubuntu:latest
圖像的Docker容器。
每個圖像層和容器層都在Docker主機上表示為子目錄/var/lib/docker/
。聯(lián)合安裝提供了所有圖層的統(tǒng)一視圖。目錄名稱不直接對應于圖層本身的ID。
AUFS使用Copy-on-Write(CoW)策略來最大限度地提高存儲效率并將開銷降至最低。
以下docker pull
命令顯示了一個Docker主機下載一個包含五層的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管理。
所有關于圖像和容器圖層的信息都存儲在中的子目錄中/var/lib/docker/aufs/
。
diff/
:每個圖層的內容,每個圖層都存儲在一個單獨的子目錄中
layers/
:關于圖像圖層堆疊的元數(shù)據。該目錄包含Docker主機上每個圖像或容器層的一個文件。每個文件都包含堆棧(其父項)下面的所有圖層的ID。
mnt/
:安裝點,每個映像或容器層一個,用于組裝和安裝容器的統(tǒng)一文件系統(tǒng)。對于只讀的圖像,這些目錄將始終為空。
如果容器正在運行,則以/var/lib/docker/aufs/
下列方式更改內容:
diff/
:可寫容器層中引入的差異,如新文件或修改過的文件。
layers/
:關于可寫容器層的父層的元數(shù)據。
mnt/
:每個正在運行的容器的統(tǒng)一文件系統(tǒng)的安裝點,完全與容器內顯示的一樣。
aufs
讀取和寫入的工作方式考慮三種場景,其中一個容器打開一個文件進行重疊讀取訪問。
該文件不存在于容器層中:如果容器打開一個文件以進行讀取訪問,并且文件尚不存在于容器層中,則存儲驅動程序會在圖像層中搜索文件,容器層。它從它所在的圖層讀取。
該文件僅存在于容器層中:如果容器打開一個用于讀取訪問的文件,并且文件存在于容器層中,則從該文件中讀取該文件。
該文件同時存在于容器圖層和圖像圖層中:如果容器打開文件進行讀取訪問,并且文件存在于容器圖層和一個或多個圖像圖層中,則從容器圖層讀取文件。容器圖層中的文件會隱藏圖像圖層中具有相同名稱的文件。
考慮一些容器中的文件被修改的場景。
第一次寫入文件:容器首次寫入現(xiàn)有文件時,該文件不存在于容器(upperdir
)中。該aufs
驅動程序執(zhí)行copy_up操作將文件從存在的圖像層復制到可寫容器層。容器然后將更改寫入容器層中的文件的新副本。但是,AUFS在文件級別而不是塊級別上工作。這意味著所有的copy_up操作都會復制整個文件,即使文件非常大,只有一小部分被修改。這可能會對容器寫入性能產生顯著影響。AUFS在搜索多層圖像中的文件時可能會出現(xiàn)明顯的延遲。但是,值得注意的是copy_up操作僅在給定文件第一次寫入時發(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
(即“跨設備鏈接不允許”),即使源和目標路徑都位于同一個AUFS層上,除非目錄中沒有子節(jié)點。您的應用程序需要被設計為處理EXDEV
并回退到“復制和取消鏈接”策略。
總結一些已經提到的性能相關方面:
AUFS存儲驅動程序的性能低于overlay2
驅動程序,但對于PaaS和其他類似的容器密度很重要的使用案例來說,這是一個不錯的選擇。這是因為AUFS可以在多個正在運行的容器之間高效地共享映像,從而實現(xiàn)快速的容器啟動時間和最少的磁盤空間使用。
AUFS如何在圖像層和容器之間共享文件的底層機制非常高效地使用頁面緩存。
AUFS存儲驅動程序可以在容器寫入性能方面引入顯著的延遲。這是因為第一次容器寫入任何文件時,該文件必須被定位并被復制到容器頂部可寫層中。當這些文件存在于許多圖像層下并且文件本身很大時,這些延遲會增加并且復雜化。
以下通用性能最佳實踐也適用于AUFS。
固態(tài)設備(SSD)比旋轉磁盤提供更快的讀取和寫入速度。
將卷用于寫入繁重的工作負載:卷為寫入繁重的工作負載提供最佳和最可預測的性能。這是因為它們繞過了存儲驅動程序,并且不會產生精簡配置和寫入時復制引入的任何潛在開銷。卷還有其他好處,例如允許您在容器之間共享數(shù)據,并且即使在沒有正在運行的容器正在使用它們時也會持久存在。
了解圖像,容器和存儲驅動程序
選擇存儲驅動程序
Btrfs存儲驅動程序在實踐中
Device Mapper存儲驅動程序在實踐中