1. 程式人生 > >Data Volume 之 bind mount - 每天5分鐘玩轉 Docker 容器技術(39)

Data Volume 之 bind mount - 每天5分鐘玩轉 Docker 容器技術(39)

ott 讀寫 storage base none mount space 讀寫權限 tle

storage driver 和 data volume 是容器存放數據的兩種方式,上一節我們學習了 storage driver,本節開始討論 Data Volume

Data Volume 本質上是 Docker Host 文件系統中的目錄或文件,能夠直接被 mount 到容器的文件系統中。Data Volume 有以下特點:

  1. Data Volume 是目錄或文件,而非沒有格式化的磁盤(塊設備)。

  2. 容器可以讀寫 volume 中的數據。

  3. volume 數據可以被永久的保存,即使使用它的容器已經銷毀。

好,現在我們有數據層(鏡像層和容器層)和 volume 都可以用來存放數據,具體使用的時候要怎樣選擇呢?考慮下面幾個場景:

  1. Database 軟件 vs Database 數據

  2. Web 應用 vs 應用產生的日誌

  3. 數據分析軟件 vs input/output 數據

  4. Apache Server vs 靜態 HTML 文件

相信大家會做出這樣的選擇:

  1. 前者放在數據層中。因為這部分內容是無狀態的,應該作為鏡像的一部分。

  2. 後者放在 Data Volume 中。這是需要持久化的數據,並且應該與鏡像分開存放。

還有個大家可能會關心的問題:如何設置 voluem 的容量?

因為 volume 實際上是 docker host 文件系統的一部分,所以 volume 的容量取決於文件系統當前未使用的空間,目前還沒有方法設置 volume 的容量。

在具體的使用上,docker 提供了兩種類型的 volume:bind mount 和 docker managed volume。

bind mount

bind mount 是將 host 上已存在的目錄或文件 mount 到容器。

例如 docker host 上有目錄 $HOME/htdocs:

技術分享

通過 -v 將其 mount 到 httpd 容器:

技術分享

-v 的格式為 <host path>:<container path>。/usr/local/apache2/htdocs 就是 apache server 存放靜態文件的地方。由於 /usr/local/apache2/htdocs 已經存在,原有數據會被隱藏起來,取而代之的是 host $HOME/htdocs/ 中的數據,這與 linux mount 命令的行為是一致的。

技術分享

curl 顯示當前主頁確實是 $HOME/htdocs/index.html 中的內容。更新一下,看是否能生效:

技術分享

host 中的修改確實生效了,bind mount 可以讓 host 與容器共享數據。這在管理上是非常方便的。

下面我們將容器銷毀,看看對 bind mount 有什麽影響:

技術分享

可見,即使容器沒有了,bind mount 也還在。這也合理,bind mount 是 host 文件系統中的數據,只是借給容器用用,哪能隨便就刪了啊。

另外,bind mount 時還可以指定數據的讀寫權限,默認是可讀可寫,可指定為只讀:

技術分享

ro 設置了只讀權限,在容器中是無法對 bind mount 數據進行修改的。只有 host 有權修改數據,提高了安全性。

除了 bind mount 目錄,還可以單獨指定一個文件:

技術分享

使用 bind mount 單個文件的場景是:只需要向容器添加文件,不希望覆蓋整個目錄。在上面的例子中,我們將 html 文件加到 apache 中,同時也保留了容器原有的數據。

使用單一文件有一點要註意:host 中的源文件必須要存在,不然會當作一個新目錄 bind mount 給容器。

mount point 有很多應用場景,比如我們可以將源代碼目錄 mount 到容器中,在 host 中修改代碼就能看到應用的實時效果。再比如將 mysql 容器的數據放在 bind mount 裏,這樣 host 可以方便地備份和遷移數據。

bind mount 的使用直觀高效,易於理解,但它也有不足的地方:bind mount 需要指定 host 文件系統的特定路徑,這就限制了容器的可移植性,當需要將容器遷移到其他 host,而該 host 沒有要 mount 的數據或者數據不在相同的路徑時,操作會失敗。

移植性更好的方式是 docker managed volume,下一節我們討論。

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

技術分享

Data Volume 之 bind mount - 每天5分鐘玩轉 Docker 容器技術(39)