咱們從本章開始討論 Docker 存儲。docker
Docker 爲容器提供了兩種存放數據的資源:架構
由 storage driver 管理的鏡像層和容器層。app
Data Volume。工具
咱們會詳細討論它們的原理和特性。學習
在前面鏡像章節咱們學習到 Docker 鏡像的分層結構,簡單回顧一下。測試
容器由最上面一個可寫的容器層,以及若干只讀的鏡像層組成,容器的數據就存放在這些層中。這樣的分層結構最大的特性是 Copy-on-Write:spa
新數據會直接存放在最上面的容器層。code
修改現有數據會先從鏡像層將數據複製到容器層,修改後的數據直接保存在容器層中,鏡像層保持不變。htm
若是多個層中有命名相同的文件,用戶只能看到最上面那層中的文件。資源
分層結構使鏡像和容器的建立、共享以及分發變得很是高效,而這些都要歸功於 Docker storage driver。正是 storage driver 實現了多層數據的堆疊併爲用戶提供一個單一的合併以後的統一視圖。
Docker 支持多種 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它們都能實現分層的架構,同時又有各自的特性。對於 Docker 用戶來講,具體選擇使用哪一個 storage driver 是一個難題,由於:
沒有哪一個 driver 可以適應全部的場景。
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 瞭解詳情。