1. 程式人生 > >關於Docker聯合檔案系統Union File System

關於Docker聯合檔案系統Union File System

Union File System

Union File System, 簡稱UnionFS,是一種為Linux,FreeBSD,和NetBSD作業系統設計的把其他檔案系統聯合掛載到一個掛載點的檔案系統服務。

它通過使用branch把不同檔案系統的檔案和目錄覆蓋,形成一個一致的檔案系統。這些branch是隻讀或者只寫的。當對檔案進行寫操作時候,才會真正的複製
檔案進行寫操作。實際上本身沒有對原來的檔案進行修改,可以看做是共享了原來的檔案。在寫的時候進行修改用到了一種資源管理技術成為寫時複製。

寫時複製(copy-on write,CoW),也叫作隱式共享,如果一個資源是重複的,那我們沒有必要去在拷貝一份。只需要將唯一的一份共享給不同的物件。當某一個物件
需要去修改這個資源時,再去重新複製一份對新複製的進行修改。通過資源共享,可以減少未修改資源複製帶來的消耗。在mapbit的垃圾回收演算法中也會用到。

AUFS

AUFS ,英文全稱是 Advanced Multi-Layered Unification Filesystem ,曾經也叫Acronym Multi-Layered Unification Filesystem 、 Another Multi-Layered Unification Filesystem 。
AUFS 完全重寫了早期的 UnionFS 1 .x ,其主要目的是為了可靠性和效能 , 井且引入了 一 些新的功能,比如可寫分支的負載均衡 。 AUFS的一些實現已經被納入UnionFS 2.x 版本。

Docker是如何使用AUFS的

AUFS是docker的第一種儲存驅動。AUFS具有快速啟動容器、高速利用儲存和記憶體的優點。

image layer 和 AUFS (docker版本不同可能會有區別,我的是在/var/lib/docker下的其他資料夾中)

每一個Docker image都是由一系列read-only layer組成的。image layer的內容都儲存在Docker hosts filesystem的/var/lib/docker/aufs/diff目錄下.
而/var/lib/docker/aufs/layers目錄,則儲存著image layer如何堆找這些layer的metadata 。

在裝有Docker的機器上執行如下命令

[email protected]:/var/lib/docker/overlay2#

什麼都沒有

拉取映象後,可以看到在docker pull中的結果顯示 : l5.04映象一共有4個layer,在
執行命令的結果中也有4個對應的儲存檔案目錄。

container layer 和AUFS(docker版本不同可能會有區別,我的是在/var/lib/docker下的其他資料夾中)

docker使用寫時複製,就是說每一點小小的修改都會被複制。但是docker是有很多layer的,修改的只是layer(對以前的layer進行遮蔽,並沒有刪除)。
這樣就避免了複製大檔案。對於一個容器而言每個image layer最多隻需要複製一次。後續的改動都會在第一次拷貝的 container layer上進行 。

如果要刪除file時,AUFS會在container的read-write層生成一個.wh.file檔案來隱藏所有 read-only層的file檔案。

可以看到新產生的資料夾。裡面有各種各樣樣的配置檔案。

寫一個AUFS

  1. 建立檔案目錄,在aufs目錄下建立mnt(掛載點),container-layer,以及4個image-layer【x】(x是1-4)。

  2. 將其他檔案掛載到剛才建立的mnt上。在mount aufs命令中,沒有指定待掛在的5個資料夾的許可權,預設的行為是dirs指定的左邊第一個目錄是
    read-write許可權,後續都是read-only許可權。

查詢檔案的許可權

可以看到第一個是rw 其他都是ro。

  1. 修改檔案
  • 檢視mnt 下的image-layer1.txt和 資料夾image-layer1下的該檔案。

    兩者是一樣的。
  • 我們對mnt下的某一個檔案進行修改(image-layer1.txt)

  • 對比修改後兩個檔案的狀態

    兩者是不一樣的。

由此可以看出,對mnt 裡的的檔案修改並不影響對原檔案的修改,那麼修改後的檔案到底去哪裡了呢?

第一個container-layer檔案的許可權是rw。我們去裡面看看.

果然在裡面。這就清楚多了。當要修改檔案的時候,將檔案複製一份
放到container下面即可,之後我們就不是共享原來的檔案了,而是擁有了自己的檔案。

以上就是AUSF的部分內容。