Data Volume 之 bind mount - 每天5分鐘玩轉 Docker 容器技術(39)
storage driver 和 data volume 是容器存放數據的兩種方式,上一節我們學習了 storage driver,本節開始討論 Data Volume。
Data Volume 本質上是 Docker Host 文件系統中的目錄或文件,能夠直接被 mount 到容器的文件系統中。Data Volume 有以下特點:
-
Data Volume 是目錄或文件,而非沒有格式化的磁盤(塊設備)。
-
容器可以讀寫 volume 中的數據。
-
volume 數據可以被永久的保存,即使使用它的容器已經銷毀。
好,現在我們有數據層(鏡像層和容器層)和 volume 都可以用來存放數據,具體使用的時候要怎樣選擇呢?考慮下面幾個場景:
-
Database 軟件 vs Database 數據
-
Web 應用 vs 應用產生的日誌
-
數據分析軟件 vs input/output 數據
-
Apache Server vs 靜態 HTML 文件
相信大家會做出這樣的選擇:
-
前者放在數據層中。因為這部分內容是無狀態的,應該作為鏡像的一部分。
-
後者放在 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)