?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
Btrfs是下一代的寫(xiě)時(shí)復(fù)制文件系統(tǒng),支持許多先進(jìn)的存儲(chǔ)技術(shù),使其非常適合Docker。Btrfs包含在主線Linux內(nèi)核中。
Docker的btrfs
存儲(chǔ)驅(qū)動(dòng)程序利用了許多用于映像和容器管理的Btrfs功能。其中包括塊級(jí)操作,精簡(jiǎn)配置,寫(xiě)入時(shí)復(fù)制快照以及易于管理。您可以輕松地將多個(gè)物理塊設(shè)備組合到一個(gè)Btrfs文件系統(tǒng)中。
本文將Docker的Btrfs存儲(chǔ)驅(qū)動(dòng)程序稱為btrfs
Btrfs文件系統(tǒng),并將其作為Btrfs。
注意:
btrfs
存儲(chǔ)驅(qū)動(dòng)程序僅在Ubuntu或Debian上的Docker CE和SLES上的Docker EE/CS引擎上受支持。
如果您滿足以下先決條件,則支持btrfs
:
Docker CE:對(duì)于Docker CE,btrfs
僅在Ubuntu或Debian上推薦。
Docker EE:對(duì)于Docker EE和CS-Engine,btrfs
僅在SLES上受支持。有關(guān)商業(yè)支持的Docker的所有支持配置,請(qǐng)參閱產(chǎn)品兼容性表。
更改存儲(chǔ)驅(qū)動(dòng)程序?qū)⑹鼓褎?chuàng)建的任何容器在本地系統(tǒng)上都不可訪問(wèn)。使用docker save
保存的容器,并推動(dòng)現(xiàn)有圖像多克爾集線器或私人倉(cāng)庫(kù),讓你不必后重新創(chuàng)建它們。
btrfs
需要專用的塊存儲(chǔ)設(shè)備,如物理磁盤(pán)。該塊設(shè)備必須格式化為Btrfs并裝入/var/lib/docker/
。以下配置說(shuō)明會(huì)引導(dǎo)您完成此過(guò)程。默認(rèn)情況下,SLES /
文件系統(tǒng)使用BTRFS格式化,因此對(duì)于SLES,不需要使用單獨(dú)的塊設(shè)備,但出于性能方面的考慮,您可以選擇這樣做。
btrfs
支持必須存在于你的內(nèi)核中。要檢查這一點(diǎn),運(yùn)行以下命令:$ sudo cat/proc/filesystems | grep btrfs btrfs
要在操作系統(tǒng)級(jí)別管理BTRFS文件系統(tǒng),您需要該btrfs
命令。如果您沒(méi)有此命令,請(qǐng)安裝btrfsprogs
軟件包(SLES)或btrfs-tools
軟件包(Ubuntu)。
此過(guò)程在SLES和Ubuntu上基本相同。
停止Docker。
2. 將/var/lib/docker/
內(nèi)容復(fù)制到備份位置,然后清空以下內(nèi)容/var/lib/docker/
:
$sudo cp-au/var/lib/docker/var/lib/docker.bk$sudo rm/var/lib/docker/%2A
3. 將您的專用塊設(shè)備或設(shè)備格式化為Btrfs文件系統(tǒng)。這個(gè)例子假定你正在使用兩個(gè)叫做/dev/xvdf
and的塊設(shè)備/dev/xvdg
。仔細(xì)檢查塊設(shè)備名稱,因?yàn)檫@是一種破壞性操作。$ sudo mkfs.btrfs -f /dev/xvdf /dev/xvdg Btrfs還有很多選項(xiàng),包括striping和RAID。請(qǐng)參閱Btrfs文檔。
4. 將新的Btrfs文件系統(tǒng)/var/lib/docker/
掛載到掛載點(diǎn)上。您可以指定用于創(chuàng)建Btrfs文件系統(tǒng)的任何塊設(shè)備。
$ sudo mount -t btrfs /dev/xvdf /var/lib/docker
不要忘記在重新啟動(dòng)時(shí)通過(guò)添加/etc/fstab
條目來(lái)使永久更改。
5. 將內(nèi)容復(fù)制/var/lib/docker.bk
到/var/lib/docker/
。$ sudo cp -au /var/lib/docker.bk/* / var / lib / docker /
6. 配置Docker以使用btrfs
存儲(chǔ)驅(qū)動(dòng)程序。即使/var/lib/docker/
現(xiàn)在使用Btrfs文件系統(tǒng),這也是必需的。編輯或創(chuàng)建文件/etc/docker/daemon.json
。如果它是新文件,請(qǐng)?zhí)砑右韵聝?nèi)容。如果它是現(xiàn)有文件,則僅添加鍵和值,如果它不是結(jié)束括號(hào)(}
)前的最后一行,請(qǐng)仔細(xì)用逗號(hào)結(jié)束該行。
{ "storage-driver": "btrfs" }
查看每個(gè)存儲(chǔ)驅(qū)動(dòng)程序的所有存儲(chǔ)選項(xiàng):
- [Stable](../../../reference/commandline/dockerd/index#storage-driver-options)- [Edge](https://docs.docker.com/edge/engine/reference/commandline/dockerd/#storage-driver-options)
啟動(dòng)Docker。運(yùn)行后,驗(yàn)證btrfs
是否正在用作存儲(chǔ)驅(qū)動(dòng)程序。$ docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 17.03.1-ce 存儲(chǔ)驅(qū)動(dòng)程序:btrfs 生成版本:Btrfs v4.4 庫(kù)文件版本:101 <output truncated>
2. 準(zhǔn)備好后,請(qǐng)刪除/var/lib/docker.bk
目錄。
Btrfs的好處之一是可以輕松地管理Btrfs文件系統(tǒng),而無(wú)需卸載文件系統(tǒng)或重新啟動(dòng)Docker。
當(dāng)空間不足時(shí),Btrfs會(huì)自動(dòng)擴(kuò)展容量大約1 GB的數(shù)據(jù)塊。
要將塊設(shè)備添加到Btrfs卷,請(qǐng)使用btrfs device add
和btrfs filesystem balance
命令。
$ sudo btrfs device add /dev/svdh /var/lib/docker $ sudo btrfs filesystem balance /var/lib/docker
注意:雖然可以在Docker運(yùn)行時(shí)執(zhí)行這些操作,但性能會(huì)受到影響。計(jì)劃停機(jī)窗口以平衡Btrfs文件系統(tǒng)可能是最好的。
btrfs
存儲(chǔ)驅(qū)動(dòng)程序作品btrfs
存儲(chǔ)驅(qū)動(dòng)器從工作方式不同devicemapper
在您的整個(gè)或其他存儲(chǔ)驅(qū)動(dòng)程序/var/lib/docker/
目錄存儲(chǔ)在增加了Btrfs卷上。
有關(guān)圖像圖層和可寫(xiě)容器圖層的信息存儲(chǔ)在/var/lib/docker/btrfs/subvolumes/
。該子目錄包含每個(gè)圖像或容器層的一個(gè)目錄,統(tǒng)一文件系統(tǒng)是從一個(gè)圖層加上所有其父圖層構(gòu)建的。子卷本質(zhì)上是寫(xiě)入時(shí)復(fù)制,并具有從底層存儲(chǔ)池按需分配的空間。它們也可以嵌套和快照。下圖顯示了4個(gè)子卷。'Subvolume 2'和'Subvolume 3'是嵌套的,而'Subvolume 4'則顯示它自己的內(nèi)部目錄樹(shù)。
只有圖像的基礎(chǔ)層被存儲(chǔ)為真正的子卷。所有其他圖層都存儲(chǔ)為快照,只包含該圖層中引入的差異。您可以創(chuàng)建快照快照,如下圖所示。
在磁盤(pán)上,快照的外觀與子卷相似,但實(shí)際上它們更小巧,更節(jié)省空間。寫(xiě)時(shí)復(fù)制用于最大限度地提高存儲(chǔ)效率并最小化層大小,并且容器的可寫(xiě)層中的寫(xiě)入在塊級(jí)進(jìn)行管理。下圖顯示了一個(gè)子卷及其快照共享數(shù)據(jù)。
為了獲得最大效率,當(dāng)容器需要更多空間時(shí),它將以大小約1 GB的塊分配。
Docker的btrfs
存儲(chǔ)驅(qū)動(dòng)程序?qū)⒚總€(gè)圖像層和容器存儲(chǔ)在其自己的Btrfs子卷或快照中。圖像的基礎(chǔ)層存儲(chǔ)為子卷,而子圖像層和容器存儲(chǔ)為快照。這在下圖中顯示。
在運(yùn)行btrfs
驅(qū)動(dòng)程序的Docker主機(jī)上創(chuàng)建映像和容器的高級(jí)過(guò)程如下所示:
圖像的基礎(chǔ)層存儲(chǔ)在Btrfs 子卷下/var/lib/docker/btrfs/subvolumes
。
2. 隨后的圖像層被存儲(chǔ)為增加了Btrfs 快照父層的子體積或快照的,但與此層中引入的變化。這些差異存儲(chǔ)在塊級(jí)別。
3. 容器的可寫(xiě)圖層是最終圖像層的Btrfs快照,運(yùn)行容器引入了差異。這些差異存儲(chǔ)在塊級(jí)別。容器如何讀取和寫(xiě)入btrfs
閱讀文件的工作容器是圖像的空間高效快照。快照中的元數(shù)據(jù)指向存儲(chǔ)池中的實(shí)際數(shù)據(jù)塊。這與子卷相同。因此,針對(duì)快照?qǐng)?zhí)行的讀取基本上與針對(duì)子卷執(zhí)行的讀取相同。
編寫(xiě)新文件:將新文件寫(xiě)入容器會(huì)調(diào)用按需分配操作以將新數(shù)據(jù)塊分配給容器的快照。該文件然后被寫(xiě)入這個(gè)新的空間。按需分配操作對(duì)于使用Btrfs進(jìn)行的所有寫(xiě)入都是原生的,并且與將新數(shù)據(jù)寫(xiě)入子卷相同。因此,將新文件寫(xiě)入容器的快照以本地Btrfs速度運(yùn)行。
修改現(xiàn)有文件:更新容器中的現(xiàn)有文件是寫(xiě)時(shí)復(fù)制操作(redirect-on-write是Btrfs術(shù)語(yǔ))。原始數(shù)據(jù)是從文件當(dāng)前存在的層讀取的,只有修改后的塊才寫(xiě)入容器的可寫(xiě)層。接下來(lái),Btrfs驅(qū)動(dòng)程序更新快照中的文件系統(tǒng)元數(shù)據(jù)以指向這個(gè)新數(shù)據(jù)。這種行為的開(kāi)銷很小。
刪除文件或目錄:如果容器刪除存在于較低層的文件或目錄,則Btrfs會(huì)掩蓋較低層中文件或目錄的存在。如果一個(gè)容器創(chuàng)建一個(gè)文件然后將其刪除,則此操作在Btrfs文件系統(tǒng)中執(zhí)行,并且空間被回收。
使用Btrfs時(shí),編寫(xiě)和更新大量小文件可能會(huì)導(dǎo)致性能下降。
影響Docker在btrfs
存儲(chǔ)驅(qū)動(dòng)程序下的性能有幾個(gè)因素。
注意:通過(guò)將Docker卷用于寫(xiě)入繁重的工作負(fù)載,而不是依賴將數(shù)據(jù)存儲(chǔ)在容器的可寫(xiě)層中,可以緩解這些因素中的許多因素。然而,在增加了Btrfs的情況下,多克爾量仍將從這些畫(huà)中后衛(wèi)吃虧,除非
/var/lib/docker/volumes/
是不通過(guò)增加了Btrfs支持。
頁(yè)面緩存。Btrfs不支持頁(yè)面緩存共享。這意味著訪問(wèn)相同文件的每個(gè)進(jìn)程都將文件復(fù)制到Docker主機(jī)的內(nèi)存中。因此,btrfs
驅(qū)動(dòng)程序可能不是PaaS等高密度用例的最佳選擇。
小寫(xiě)。執(zhí)行大量小寫(xiě)操作的容器(此使用模式與在短時(shí)間內(nèi)啟動(dòng)和停止很多容器時(shí)發(fā)生的情況相匹配)可能導(dǎo)致Btrfs塊的使用不當(dāng)。這可能會(huì)過(guò)早地填充Btrfs文件系統(tǒng)并導(dǎo)致Docker主機(jī)出現(xiàn)空間不足的情況。使用btrfs filesys show
您必須密切監(jiān)控增加了Btrfs設(shè)備上的可用空間量。
順序?qū)懭?/strong>。寫(xiě)入磁盤(pán)時(shí),Btrfs使用日志記錄技術(shù)。這會(huì)影響順序?qū)懭氲男阅?,最多可將性能降?0%。
碎片化。碎片是Btrfs等寫(xiě)入時(shí)復(fù)制文件系統(tǒng)的自然副產(chǎn)品。許多小型隨機(jī)寫(xiě)入可能會(huì)增加此問(wèn)題。碎片化可能表現(xiàn)為使用SSD時(shí)的CPU峰值或使用旋轉(zhuǎn)磁盤(pán)時(shí)的磁頭顛簸。這些問(wèn)題都會(huì)損害性能。
如果您的Linux內(nèi)核版本為3.9或更高版本,則可以autodefrag
在安裝Btrfs卷時(shí)啟用該功能。在將其部署到生產(chǎn)環(huán)境之前,請(qǐng)先在自己的工作負(fù)載上測(cè)試此功能,因?yàn)橛行y(cè)試顯示對(duì)性能有負(fù)面影響。
SSD性能:Btrfs包含SSD介質(zhì)的本機(jī)優(yōu)化。要啟用這些功能,請(qǐng)使用-o ssd
安裝選項(xiàng)安裝Btrfs文件系統(tǒng)。這些優(yōu)化包括通過(guò)避免優(yōu)化(例如不適用于固態(tài)介質(zhì)的搜索優(yōu)化)來(lái)增強(qiáng)SSD寫(xiě)入性能。
平衡Btrfs文件系統(tǒng)經(jīng)常:使用操作系統(tǒng)實(shí)用程序(如cron
作業(yè))在非高峰時(shí)段定期平衡Btrfs文件系統(tǒng)。這回收未分配的塊,并有助于防止文件系統(tǒng)不必要的填滿。除非將其他物理塊設(shè)備添加到文件系統(tǒng),否則無(wú)法重新平衡完全完整的Btrfs文件系統(tǒng)。查看BTRFS Wiki。
使用快速存儲(chǔ):固態(tài)硬盤(pán)(SSD)比旋轉(zhuǎn)磁盤(pán)提供更快的讀取和寫(xiě)入速度。
將卷用于寫(xiě)入繁重的工作負(fù)載:卷為寫(xiě)入繁重的工作負(fù)載提供最佳和最可預(yù)測(cè)的性能。這是因?yàn)樗鼈兝@過(guò)了存儲(chǔ)驅(qū)動(dòng)程序,并且不會(huì)產(chǎn)生精簡(jiǎn)配置和寫(xiě)入時(shí)復(fù)制引入的任何潛在開(kāi)銷。卷還有其他好處,例如允許您在容器之間共享數(shù)據(jù),并且即使在沒(méi)有正在運(yùn)行的容器正在使用它們時(shí)也會(huì)持久存在。
了解圖像,容器和存儲(chǔ)驅(qū)動(dòng)程序
選擇存儲(chǔ)驅(qū)動(dòng)程序
AUFS存儲(chǔ)驅(qū)動(dòng)程序在實(shí)踐中
設(shè)備Mapper存儲(chǔ)驅(qū)動(dòng)程序在實(shí)踐中的應(yīng)用