docker文件系統分層存儲原理

前言
衆所周知,docker鏡像技術的基礎是聯合文件系統(UnionFS),其文件系統是分層的,那它的分層機制是什麼樣的呢?共分爲幾種層呢?又是怎麼工做的呢?
目前docker支持的聯合文件系統有不少種,包括:AUFS、overlay、overlay二、DeviceMapper、VSF等
 
Linux 中各發行版實現的 UnionFS 各不相同,因此docker在不一樣 linux 發行版中使用的也不一樣。經過docker info 命令能夠查看當前系統所使用哪一種 UnionFS,常見的幾種發行版使用以下:
CentOS, Storage Driver: overlay二、overlay
debain, Storage Driver: aufs
RedHat, Storage Driver: devicemapper

 

介紹
下面咱們就以Centos發行版的overlay2文件系統進行介紹,其實不論是什麼發行版,其原理都一模一樣。
先來看張圖:

從上述圖中能夠看到三個層結構,即lowerdir、upperdir、merged層
對應的,使用docker inspect [容器ID]就能夠看到這幾個層所在的位置

"GraphDriver": { "Name": "overlay2", "Data": { "LowerDir": "/var/lib/docker/overlay2/45abab78c6fd022d9ce132a0fb995f9e91bc0a807ccc73e2461fce6c9b68b250/root", "MergedDir": "/var/lib/docker/overlay2/dc838cbc7d903a4bfd6bd0280a6910c063f2d1f03439e917ebc773fccc377402/merged", "UpperDir": "/var/lib/docker/overlay2/dc838cbc7d903a4bfd6bd0280a6910c063f2d1f03439e917ebc773fccc377402/upper", "WorkDir": "/var/lib/docker/overlay2/dc838cbc7d903a4bfd6bd0280a6910c063f2d1f03439e917ebc773fccc377402/work" } },
 
一、lowerdir層:
其中lowerdir是隻讀的鏡像層(image layer),其中就包含bootfs/rootfs層,bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引導加載kernel,當boot成功 kernel 被加載到內存中,bootfs就被umount了,rootfs(root file system)包含的就是典型Linux系統中的/dev、/proc、/bin、/etc等標準目錄。
lowerdir是能夠分不少層的,除了bootfs/rootfs層之外,還能夠經過Dockerfile創建不少image層,構建過程以下:

Dockerfile中每個指令都會生成一個新的image層,如上圖所示。
當FROM時就已經生成了bootfs/rootfs層,也就是kernel和base層。

 
二、upperdir層
upperdir層是lowerdir的上一層,只有這一層可讀可寫的,其實就是Container層,在啓動一個容器的時候會在最後的image層的上一層自動建立,全部對容器數據的更改都會發生在這一層。
 
三、merged層
merged層就是聯合掛載層,也就是給用戶暴露的統一視覺,將image層和container層結合,就如最上邊的圖中描述一致,同一文件,在此層會展現離它最近的層級裏的文件內容,或者能夠理解爲,只要container層中有此文件,便展現container層中的文件內容,若container層中沒有,則展現image層中的。
 
聯合掛載系統的工做原理
一、讀:
若是文件在upperdir(容器)層,直接讀取文件;
若是文件不在upperdir(容器)層,則從鏡像層(lowerdir)讀取;
 
二、寫:
首次寫入:若是upperdir中不存在,overlay和overlay2執行copy_up操做,把文件從lowdir拷貝到upperdir中,因爲overlayfs是文件級別的(即便只有不多的一點修改,也會產生copy_up的動做),後續對同一文件的再次寫入操做將對已經複製到容器層的文件副本進行修改,這也就是嚐嚐說的寫時複製(copy-on-write)。
 
刪除文件或目錄:當文件被刪除時,在容器層(upperdir)建立whiteout文件,鏡像層(lowerdir)的文件是不會被刪除的,由於它們是隻讀的,但without文件會阻止它們顯示,當目錄被刪除時,在容器層(upperdir)一個不透明的目錄,這個和上邊的whiteout的原理同樣,組織用戶繼續訪問,image層不會發生改變
 
三、注意事項
  1. copy_up操做只發生在文件首次寫入,之後都是隻修改副本,
  2. overlayfs只適用兩層目錄,,相比於比AUFS,查找搜索都更快。
  3. 容器層的文件刪除只是一個「障眼法」,是靠whiteout文件將其遮擋,image層並無刪除,這也就是爲何使用docker commit 提交保存的鏡像會愈來愈大,不管在容器層怎麼刪除數據,image層都不會改變。 
 
四、容器總體構成圖

此圖中沒有展示聯合掛載層

 

對比
帶着問題看事物,docker容器爲何啓動這麼快呢???
先來看一張docker與VM的對比圖:

能夠清楚的看到,VM比docker多了Hypervisor 和 Guest OS的過程,也正是省略了這些過程使docker技高一籌,問題又來了,爲何docker能夠省略這些過程呢?
  • Hypervisor:主要做用是實現硬件資源虛擬化;由於docker容器上程序直接使用的都是物理機的硬件資源,因此不須要資源虛擬化的過程,也所以在CPU、內存利用率上docker將會在效率上明顯提升
  • Guest OS:主要做用加載操做系統內核;由於docker利用的是宿主機的內核,因此在啓動一個容器時,不須要像VM同樣從新加載一個操做系統內核,也所以大大節約了啓動時間。
 
如下是官網提供的容器啓動過程圖:

 

相關文章
相關標籤/搜索