Docker爲什麼選擇了AUFS?

1.AUFS

  • AUFS本質上仍是堆棧式的聯合文件系統
  • 從功能上講,AUFS可以將分佈在不同地方的目錄掛載到同一個虛擬文件系統當中
    (1)首先我們將思路切換到 Linux啓動階段。、
    典型的 Linux啓動時,首先加載 bootfs(Boot File System)目錄。這個目錄裏面包括 Bootloader和kerenl。Bootloader用來加載啓動 kerenl。當kerenl成功加載到內存中後, bootfs就會釋放掉, kerenl隨之開始加載rootfs。
    (2)rootfs(Root FileSystem)包含的是 Linux系統中標準的 /dev、/proc、/bin、/etc等文件。
    因爲 rootfs是後續kerenl啓動的基礎,對於 kerenl來說異常重要,因此此時 kerenl將 Rootfs加鎖—設爲 readonly。在只讀權限下, kerenl進行一系列的檢查操作。當kerenl確認 rootfs包含的文件正確無誤後,將 readonly改爲readwrite(可讀可寫),以後用戶就可以按照正確的權限對這些目錄進行操作了。
    (3)說到這裏,就輪到到 AUFS登場了。
    當 Docker利用 LXC虛擬化出來一個容器之後,就相當於購買了一臺裸機,有內存、CPU、硬盤,但沒有操作系統。
    Docker參考 Linux的啓動過程,將一個readonly權限的 bootfs掛載到容器文件系統中,然後通過 AUFS,再將readonly權限的 rootfs添加到 bootfs之上,當rootfs檢查完畢之後,再將用戶所要使用的文件內容掛載到 rootfs之上,同樣是readonly權限。
    每次掛載一個 FS文件層,並且每層之間只會掛載增量(在這裏大家可以藉助於 SVN進行理解,相當每個 FS層都是 SVN提交上去的數據增量)。
  • 這些文件層就是堆棧式文件系統中所保存的數據。
    將不同的文件層掛載到同一個文件系統中的文件系統,就是聯合文件系統
    而AUFS就是用來管理、使用這些文件層的文件系統,因此也稱之爲高級多層次統一文件系統( Advanced Multi Layered Unification Filesystem)。

2.但是每個 FS層都是 readonly權限,那麼容器內部如何向這些文件寫入數據呢?

  • 其實當 Docker利用 AUFS加載完昀高一層之後,會在更上面再添加一個 FS層,而這個層是 readwrite權限。
    容器內部的應用,對當前文件系統所有的寫操作(包括刪除)都會保存在這個 FS層當中,而當容器向 Docker發出 commit命令後,Docker會將這個 FS層中的數據作爲單獨一個文件層保存到 AUFS之中

  • 而一個鏡像( image)就可以理解爲:特定 FS層的集合。
    所以可以看出鏡像的層次關係,處於下層的 image是上層 image的父類,而沒有父類 image的就是baseimage。因此需要從 image啓動 container時,Docker會依次加載 baseimage和父類 image,而用戶所有的操作就都保存在更高層的readwrite的 layer中。

  • Docker如何利用AUFS特性,解決容器初始化和寫時複製問題?
    (1)通過將鏡像“分隔”爲 AUFS的文件層,使得所有容器都可以共享文件層,且不會發生寫衝突。
    (2)但在 Docker中,所有的鏡像都是隻讀的,所有的鏡像也都不保存用戶信息,只會用於新建和複製。
    (3)而對於容器而言,其所看到的所有文件都是可讀寫的,只不過所有的寫操作都被保存在更上層的文件層當中

  • 參考:Docker的前世今生

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章