Union FS(聯合文件系統)
Union File System 是一種分層、輕量級并且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下。
UnionFS 是一種為 Linux,FreeBSD 和 NetBSD 操作系統設計的把其他文件系統聯合到一個聯合掛載點的文件系統服務。它使用 branch 把不同文件系統的文件和目錄“透明地”覆蓋,形成一個單一一致的文件系統。這些 branches 或者是 read-only 或者是 read-write 的,所以當對這個虛擬后的聯合文件系統進行寫操作的時候,系統是真正寫到了一個新的文件中。看起來這個虛擬后的聯合文件系統是可以對任何文件進行操作的,但是其實它并沒有改變原來的文件,這是因為 unionfs 用到了一個重要的資管管理技術叫寫時復制。
寫時復制(copy-on-write,下文簡稱 CoW),也叫隱式共享,是一種對可修改資源實現高效復制的資源管理技術。它的思想是,如果一個資源是重復的,但沒有任何修改,這時候并不需要立即創建一個新的資源;這個資源可以被新舊實例共享。創建新資源發生在第一次寫操作,也就是對資源進行修改的時候。通過這種資源共享的方式,可以顯著地減少未修改資源復制帶來的消耗。
Docker 分層存儲實現原理
image 里面是一層層文件系統 Union FS。聯合文件系統,可以將幾層目錄掛載到一起,形成一個虛擬文件系統。虛擬文件系統的目錄結構就像普通 linux 的目錄結構一樣,docker 通過這些文件再加上宿主機的內核提供了一個 linux 的虛擬環境。
每一層文件系統我們叫做一層 layer,聯合文件系統可以對每一層文件系統設置三種權限,只讀(readonly)、讀寫(readwrite)和寫出(whiteout-able),但是 docker 鏡像中每一層文件系統都是只讀的。
docker 鏡像由多個只讀層疊加面成,啟動容器時,docker 會加載只讀鏡像層并在鏡像棧頂部加一個讀寫層。構建鏡像的時候,從一個最基本的操作系統開始,每個構建的操作都相當于做一層的修改,增加了一層文件系統。一層層往上疊加,上層的修改會覆蓋底層該位置的可見性,這也很容易理解,就像上層把底層遮住了一樣。

可以看到鏡像分層結構有以下特性:
- 鏡像共享宿主機的 kernel
- base 鏡像是 linux 的最小發行版,同一個 docker 主機支持不同的 Linux 發行版
- 采用分層結構,可以上層引用下層,最大化的共享資源
- 容器層位于可寫層,采用 cow 技術進行修改,該層僅僅保持變化的部分,并不修改鏡像下面的部分
- 容器層以下都是只讀層
- docker 從上到下找文件