ZFS是下一代的文件系統(tǒng),支持了很多存儲高級特性,如卷管理、快照、和校驗(yàn)、壓縮和重復(fù)刪除技術(shù)、拷貝等。
ZFS由Sun公司創(chuàng)建,現(xiàn)屬于Oracle,ZFS是開源的,并基于CDDL license。因?yàn)镃DDL和GPL不兼容,ZFS不能加入Linux kernel主線。然而,ZFS On Linux(ZoL)項(xiàng)目提供kernel模塊和用戶空間程序,這些都可以單獨(dú)的安裝。
ZFS on Linux(ZoL)是一項(xiàng)成熟的技術(shù),但是,現(xiàn)在卻不建議在產(chǎn)品中使用zfs存儲驅(qū)動,當(dāng)然,除非你對ZoL有著豐富的經(jīng)驗(yàn)。
注意:在Linux平臺上,有ZFS的FUSE實(shí)現(xiàn),它可以和Docker結(jié)合起來使用,但是卻不推薦這樣使用。原生的ZFS驅(qū)動(ZoL)被測試得更多,更有效率,也更廣泛地被使用。下面的內(nèi)容也指的是原生的ZFS驅(qū)動。
鏡像分層和共享
Docker的zfs存儲驅(qū)動使用了ZFS驅(qū)動的三個組件:
●文件系統(tǒng)
●快照
●克隆
ZFS系統(tǒng)提供超配特性,通過按需分配操作從ZFS池(zpool)分配空間??煺蘸涂寺∈荶FS系統(tǒng)某個時間點(diǎn)的拷貝,較節(jié)省空間??煺帐侵蛔x的,而克隆是讀寫的,克隆只能通過快照來創(chuàng)建。下圖顯示了它們之間這種簡單地關(guān)系。
圖中的實(shí)線顯示了創(chuàng)建了克隆的過程。第一步創(chuàng)建了一個文件系統(tǒng)的快照,第二步通過快照創(chuàng)建了一份克隆。虛線顯示了克隆、文件系統(tǒng)和快照之間的關(guān)系。這三個ZFS組件都從同一個下層的zpool申請空間。
在Docker host上使用zfs存儲驅(qū)動。鏡像的基礎(chǔ)層就是一個ZFS文件系統(tǒng),每個子層都是底層ZFS快照的一個ZFS克隆,容器就是一個ZFS克隆,它基于其鏡像最頂層的ZFS快照。所有的ZFS組件都從同一個zpool分配空間。下圖顯示了一個基于兩層鏡像的容器是如何使用這些ZFS組件的。
結(jié)合上圖,下面的過程解釋了鏡像是如何分層的,容器是如何創(chuàng)建的。
?在Docker host中,鏡像的基礎(chǔ)層是一個ZFS文件系統(tǒng)。
文件系統(tǒng)從zpool中消耗空間。
?附加的鏡像層是其下層鏡像的克隆。
圖中,“Layer 1”是通過創(chuàng)建基礎(chǔ)鏡像的ZFS快照,然后再通過快照創(chuàng)建克隆來實(shí)現(xiàn)的??寺∈强勺x寫的,并且從zpool按需分配空間;而快照是只讀的。
?當(dāng)容器啟動時,就會在鏡像層上附加一個可讀寫層。
上圖中,制造了一個鏡像頂層的快照,然后再基于快照創(chuàng)建了一份克隆,而這份克隆就是容器的可讀寫層。
如果需要改變?nèi)萜?,那么久會從zpool按需分配空間給容器,ZFS默認(rèn)會分配128K大小的塊。
這種從只讀快照創(chuàng)建子層和容器的方法,使得鏡像作為不可變對象來維護(hù)。