天天看點

Docker底層:聯合檔案系統

  我們知道,docker 主要是基于 namespace、cgroups 和聯合檔案系統這三大核心技術實作的。

  聯合檔案系統(union file system,unionfs)是一種分層的輕量級檔案系統,它可以把多個目錄内容聯合挂載到同一目錄下,進而形成一個單一的檔案系統,這種特性可以讓使用者像是使用一個目錄一樣使用聯合檔案系統。

  那聯合檔案系統對于 docker 是一個怎樣的存在呢?它可以說是 docker 鏡像和容器的基礎,因為它可以使 docker 可以把鏡像做成分層的結構,進而使得鏡像的每一層可以被共享。例如兩個業務鏡像都是基于 centos 7 鏡像建構的,那麼這兩個業務鏡像在實體機上隻需要存儲一次 centos 7 這個基礎鏡像即可,進而節省大量存儲空間。

  聯合檔案系統在主機上使用多層目錄存儲,但最終呈現給使用者的則是一個普通單層的檔案系統,我們把多層以單一層的方式呈現出來的過程叫作聯合挂載。

  說到這兒,你有沒有發現,聯合檔案系統隻是一個概念,真正實作聯合檔案系統才是關鍵,那如何實作呢?其實實作方案有很多,docker 中最常用的聯合檔案系統有三種:aufs、devicemapper 和 overlayfs。

  aufs 目前并未被合并到 linux 核心主線,是以隻有 ubuntu 和 debian 等少數作業系統支援 aufs。它在主機上使用多層目錄存儲。

  相比對檔案系統加鎖的機制,devicemapper 工作在塊級别,是以可以實作同時修改和讀寫層中的多個塊裝置,比aufs檔案系統效率更高。

  通常情況下, overlay2 會比 aufs 和 devicemapper 性能更好,而且更加穩定,因為 overlay2 在 inode 優化上更加高效。是以在生産環境中推薦使用 overlay2 作為 docker 的檔案驅動。

繼續閱讀