Linux 的 Namespace、CGroups 和 UnionFS 三大技術支撐了 Docker 的實現。
一、為什么需要聯合文件系統?
在傳統操作系統中,每個文件系統都是獨立的孤島。但當我們需要:
合并多個目錄的內容
保持基礎系統不變的同時進行修改
高效共享重復文件內容
UnionFS應運而生!它通過文件系統堆疊技術,將多個目錄(通常是只讀的)合并成一個統一的視圖。
二、UnionFS的核心魔法原理
接下來我們用一個例子理解下UnionFS文件系統
創建以下目錄

注意,layer1 和 layer2 目錄中各有一個文件 file1,但文件內容不同。
layer1
?和?layer2
:模擬?Docker鏡像的只讀層(類似刻錄的光盤,內容不可變)
upperlayer
:模擬?容器的可寫層(像透明便利貼,記錄修改)
mountedfs
:聯合掛載點(展示"合并后的世界")
使用基本語法掛載文件系統:

說明:-t aufs:指定文件系統類型為 aufs。
-o br:upperlayer:layer1:layer2:-o 用于指定掛載選項。br 是 aufs 的選項,表示指定分支(branches)。upperlayer:layer1:layer2 是分支的具體路徑,upperlayer 是上層目錄,通常是可寫
層。layer1 和 layer2 是只讀層,通常是基礎鏡像層或依賴層。多個分支用冒號:分隔。
none:表示沒有實際的設備文件,因為 aufs 是一個虛擬文件系統。
mountedfs:掛載點目錄,即文件系統掛載的目標路徑。
檢查掛載點 mountedfs,可以看到其內容就是 layer1 和 layer2 的并集,注意 file1 的內容:
可以看到,掛載點目錄的 file1 顯示的是 layer1 中 file1 的內容,而沒有顯示 layer2 中 file1 的內容。 這是由在設置 AUFS 文件系統的分支(即層)的時候 upperlayer:layer1:layer2 選項所決定的,layer1 在前,AUFS 的優先級是從左到右的,這就意味著,如果一個文件存在于兩個層中,則 AUFS 文件 系統中顯示的版本將是最左側層的版本,理解這一點非常重要。
接下來,我們在掛載點目錄創建一個內容為"new content for file4"的新文件 file4:
file4 實際是創建在了 upperlayer 這一可寫層的。
繼續,如果刪除掛載點目錄文件 file1,會發生什么情況呢?
刪除file1,掛載點mountedfs中的file1盡管被刪除了,實際在 upperlayer 生成 隱藏標記文件( .wh.file1)(告訴系統:雖然底層有file1,但請假裝看不見),layer1/file1 和 layer2/file1 完好無損。這樣,file1 文件不會顯示在最終掛載的文件系統中。
如果我們在掛載點目錄重新創建 file1 時(注意文件內容和前面刪除的并不一樣),那么
這個控制文件會被移除掉,新的 file1 所在目錄是在 upperlayer 中。

三、總結
當運行容器時:
在只讀鏡像層之上添加可寫層
所有運行時修改發生在可寫層
容器刪除 → 可寫層消失 → 鏡像保持純凈
UnionFS的核心優勢其實圍繞三個關鍵詞:共享、隔離、效率。具體體現在:
1 分層機制節省存儲空間(多個容器共享基礎鏡像層)
2 寫時復制保證安全性(原始鏡像永不修改)
3 聯合掛載實現高效部署(無需復制完整文件系統)