上一篇:Docker的那些事兒—Docker使用的核心底層技術(6)
Union file systems
前面介紹了Namespace和Cgroups,這兩項技術都是與容器相關五辽。Docker的一大創(chuàng)新之處采用了——Union file systems(聯合文件系統(tǒng)洒闸,UnionFS)技術。它是實現Docker鏡像的技術基礎,是一種輕量級的高性能分層文件系統(tǒng)抡医,支持對文件系統(tǒng)中的修改作為一次提交來一層層的疊加呼渣,這個特性使得鏡像可以通過分層實現和繼承。Docker鏡像分為基礎鏡像和父鏡像晌区,沒有父鏡像的鏡像被稱為基礎鏡像摩骨。用戶可以基于基礎鏡像來制作各種不同的應用鏡像。這些應用鏡像共享同一個基礎鏡像層朗若,提高了存儲效率恼五。同時UnionFS支持將不同目錄掛載到同一個虛擬文件系統(tǒng)下。
Docker目前支持的UnionFS種類包括AUFS,btrfs,vfs和 DeviceMapper哭懈。
AUFS是一種 Union FS, 簡單來說就是“支持將不同目錄掛載到同一個虛擬文件系統(tǒng)下的文件系統(tǒng)”, AUFS支持為每一個成員目錄設定只讀(Rreadonly)灾馒、讀寫(Readwrite)和寫(Whiteout-able)權限。
典型的Linux啟動時運行需要兩個文件系統(tǒng):bootfs 和rootfs遣总。
bootfs主要包含BootLoader和Kernel, BootLoader主要是引導加載Kernel, 當Boot成功后睬罗,Kernel被加載到內存中,然后bootfs就被Umount掉了彤避。rootfs包含Linux系統(tǒng)中的/dev傅物、/proc、/bin琉预、/etc等標準目錄和文件董饰。
在Docker中,不同的Linux發(fā)行版可以共享bootfs,這是因為bootfs基本是一致的, 只是rootfs存在差別卒暂。例如下圖中的Debian和BusyBox(一種嵌入式Linux)
Linux在啟動后啄栓,首先將rootfs置為 Readonly,進行一系列檢查后將其切換為Readwrite供用戶使用也祠。在Docker中昙楚,也是利用該技術,然后利用Union Mount在Readonly的rootfs文件系統(tǒng)之上掛載Readwrite文件系統(tǒng)诈嘿。并且向上疊加, 使得一組Readonly和一個Readwrite的結構構成一個容器的運行目錄堪旧、每一個被稱作一個文件系統(tǒng)Layer。
AUFS的特性, 使得每一個對Readonly層文件/目錄的修改都只會存在于上層的Writeable層中奖亚。這樣使得多個容器可以共享Readonly文件系統(tǒng)層淳梦。在Docker中,將Readonly的層稱作image昔字,將Writeable層稱作container爆袍。對于容器整體而言,整個rootfs變得是read-write的作郭,但事實上所有的修改都寫入最上層的container中陨囊,image不保存用戶狀態(tài),可以用于模板夹攒、重建和復制蜘醋。
在Docker中,上層的image依賴下層的image芹助, 因此Docker中把下層的image稱作父image堂湖,沒有父image的image稱作Base image。比如上圖中Debian就是Base image状土,執(zhí)行add emacs后生成的image就是執(zhí)行add Apache后生成的image的父image无蜂。因此,當想要從一個image啟動一個容器蒙谓,Docker會先逐次加載其父image直到Base image斥季,用戶的進程運行在Writeable的文件系統(tǒng)層中。這一點累驮,我們在后面講解Docker image時會著重講解酣倾。
下一章節(jié),我們進入Docker鏡像部分學習