1. 程式人生 > >Docker 的兩類存儲資源 - 每天5分鐘玩轉 Docker 容器技術(38)

Docker 的兩類存儲資源 - 每天5分鐘玩轉 Docker 容器技術(38)

docker 教程 容器

我們從本章開始討論 Docker 存儲。

Docker 為容器提供了兩種存放數據的資源:

  1. 由 storage driver 管理的鏡像層和容器層。

  2. Data Volume。

我們會詳細討論它們的原理和特性。

storage driver

在前面鏡像章節我們學習到 Docker 鏡像的分層結構,簡單回顧一下。

技術分享

容器由最上面一個可寫的容器層,以及若幹只讀的鏡像層組成,容器的數據就存放在這些層中。這樣的分層結構最大的特性是 Copy-on-Write:

  1. 新數據會直接存放在最上面的容器層。

  2. 修改現有數據會先從鏡像層將數據復制到容器層,修改後的數據直接保存在容器層中,鏡像層保持不變。

  3. 如果多個層中有命名相同的文件,用戶只能看到最上面那層中的文件。

分層結構使鏡像和容器的創建、共享以及分發變得非常高效,而這些都要歸功於 Docker storage driver。正是 storage driver 實現了多層數據的堆疊並為用戶提供一個單一的合並之後的統一視圖。

Docker 支持多種 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它們都能實現分層的架構,同時又有各自的特性。對於 Docker 用戶來說,具體選擇使用哪個 storage driver 是一個難題,因為:

  1. 沒有哪個 driver 能夠適應所有的場景。

  2. driver 本身在快速發展和叠代。

不過 Docker 官方給出了一個簡單的答案:
優先使用 Linux 發行版默認的 storage driver

Docker 安裝時會根據當前系統的配置選擇默認的 driver。默認 driver 具有最好的穩定性,因為默認 driver 在發行版上經過了嚴格的測試。

運行docker info查看 Ubuntu 的默認 driver:

技術分享

Ubuntu 用的 AUFS,底層文件系統是 extfs,各層數據存放在 /var/lib/docker/aufs。

Redhat/CentOS 的默認 driver 是 Device Mapper,SUSE 則是 Btrfs。

對於某些容器,直接將數據放在由 storage driver 維護的層中是很好的選擇,比如那些無狀態的應用。無狀態意味著容器沒有需要持久化的數據,隨時可以從鏡像直接創建。

比如 busybox,它是一個工具箱,我們啟動 busybox 是為了執行諸如 wget,ping 之類的命令,不需要保存數據供以後使用,使用完直接退出,容器刪除時存放在容器層中的工作數據也一起被刪除,這沒問題,下次再啟動新容器即可。

但對於另一類應用這種方式就不合適了,它們有持久化數據的需求,容器啟動時需要加載已有的數據,容器銷毀時希望保留產生的新數據,也就是說,這類容器是有狀態的。

這就要用到 Docker 的另一種存儲機制:Data Volume,下一節我們討論。

有個好消息:出版社現在搞促銷,《每天5分鐘玩轉OpenStack》直降26元,全網最低價銷售,有興趣的同學可以訪問 https://detail.tmall.com/item.htm?id=543416839771 了解詳情。

技術分享

Docker 的兩類存儲資源 - 每天5分鐘玩轉 Docker 容器技術(38)