docker文件系統分層存儲原理


前言
眾所周知,docker鏡像技術的基礎是聯合文件系統(UnionFS),其文件系統是分層的,那它的分層機制是什么樣的呢?共分為幾種層呢?又是怎么工作的呢?
目前docker支持的聯合文件系統有很多種,包括:AUFS、overlay、overlay2、DeviceMapper、VSF等
 
Linux 中各發行版實現的 UnionFS 各不相同,所以docker在不同 linux 發行版中使用的也不同。通過docker info 命令可以查看當前系統所使用哪種 UnionFS,常見的幾種發行版使用如下:
CentOS, Storage Driver: overlay2、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" } },
 
1、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層。

 
2、upperdir層
upperdir層是lowerdir的上一層,只有這一層可讀可寫的,其實就是Container層,在啟動一個容器的時候會在最后的image層的上一層自動創建,所有對容器數據的更改都會發生在這一層。
 
3、merged層
merged層就是聯合掛載層,也就是給用戶暴露的統一視覺,將image層和container層結合,就如最上邊的圖中描述一致,同一文件,在此層會展示離它最近的層級里的文件內容,或者可以理解為,只要container層中有此文件,便展示container層中的文件內容,若container層中沒有,則展示image層中的。
 
聯合掛載系統的工作原理
1、讀:
如果文件在upperdir(容器)層,直接讀取文件;
如果文件不在upperdir(容器)層,則從鏡像層(lowerdir)讀取;
 
2、寫:
首次寫入:如果upperdir中不存在,overlay和overlay2執行copy_up操作,把文件從lowdir拷貝到upperdir中,由於overlayfs是文件級別的(即使只有很少的一點修改,也會產生copy_up的動作),后續對同一文件的再次寫入操作將對已經復制到容器層的文件副本進行修改,這也就是嘗嘗說的寫時復制(copy-on-write)。
 
刪除文件或目錄:當文件被刪除時,在容器層(upperdir)創建whiteout文件,鏡像層(lowerdir)的文件是不會被刪除的,因為它們是只讀的,但without文件會阻止它們顯示,當目錄被刪除時,在容器層(upperdir)一個不透明的目錄,這個和上邊的whiteout的原理一樣,組織用戶繼續訪問,image層不會發生改變
 
3、注意事項
  1. copy_up操作只發生在文件首次寫入,以后都是只修改副本,
  2. overlayfs只適用兩層目錄,,相比於比AUFS,查找搜索都更快。
  3. 容器層的文件刪除只是一個“障眼法”,是靠whiteout文件將其遮擋,image層並沒有刪除,這也就是為什么使用docker commit 提交保存的鏡像會越來越大,無論在容器層怎么刪除數據,image層都不會改變。 
 
4、容器整體構成圖

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

 

對比
帶着問題看事物,docker容器為什么啟動這么快呢???
先來看一張docker與VM的對比圖:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM