docker managed volume - 每天5分鐘玩轉 Docker 容器技術(40)
docker managed volume 與 bind mount 在使用上的最大區別是不需要指定 mount 源,指明 mount point 就行了。還是以 httpd 容器為例:
我們通過 -v
告訴 docker 需要一個 data volume,並將其 mount 到 /usr/local/apache2/htdocs。那麽這個 data volume 具體在哪兒呢?
這個答案可以在容器的配置信息中找到,執行 docker inspect
命令:
docker inspect 21accc2ca072
......
"Mounts": [
{
"Name": "f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340",
"Source": "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data",
"Destination": "/usr/local/apache2/htdocs",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
......
docker inspect
的輸出很多,我們感興趣的是 Mounts
這部分,這裏會顯示容器當前使用的所有 data volume,包括 bind mount 和 docker managed volume。
Source
就是該 volume 在 host 上的目錄。
原來,每當容器申請 mount docker manged volume 時,docker 都會在/var/lib/docker/volumes
下生成一個目錄(例子中是 "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data ),這個目錄就是 mount 源。
下面繼續研究這個 volume,看看裏面有些什麽東西:
volume 的內容跟容器原有 /usr/local/apache2/htdocs 完全一樣,這是怎麽回事呢?
這是因為:如果 mount point 指向的是已有目錄,原有數據會被復制到 volume 中。
但要明確一點:此時的 /usr/local/apache2/htdocs 已經不再是由 storage driver 管理的層數據了,它已經是一個 data volume。我們可以像 bind mount 一樣對數據進行操作,例如更新數據:
簡單回顧一下 docker managed volume 的創建過程:
容器啟動時,簡單的告訴 docker "我需要一個 volume 存放數據,幫我 mount 到目錄 /abc"。
docker 在 /var/lib/docker/volumes 中生成一個隨機目錄作為 mount 源。
如果 /abc 已經存在,則將數據復制到 mount 源,
將 volume mount 到 /abc
除了通過 docker inspect
查看 volume,我們也可以用 docker volume
命令:
目前,docker volume
只能查看 docker managed volume,還看不到 bind mount;同時也無法知道 volume 對應的容器,這些信息還得靠docker inspect
。
我們已經學習了兩種 data volume 的原理和基本使用方法,下面做個對比:
相同點:兩者都是 host 文件系統中的某個路徑。
不同點:
bind mount | docker managed volume | |
---|---|---|
volume 位置 | 可任意指定 | /var/lib/docker/volumes/... |
對已有mount point 影響 | 隱藏並替換為 volume | 原有數據復制到 volume |
是否支持單個文件 | 支持 | 不支持,只能是目錄 |
權限控制 | 可設置為只讀,默認為讀寫權限 | 無控制,均為讀寫權限 |
移植性 | 移植性弱,與 host path 綁定 | 移植性強,無需指定 host 目錄 |
下節討論如何通過 data volume 實現容器與 host,容器與容器共享數據。
有個好消息:出版社現在搞促銷,《每天5分鐘玩轉OpenStack》全網最低價銷售,有興趣的同學可以訪問 https://detail.tmall.com/item.htm?id=543416839771 了解詳情 。
docker managed volume - 每天5分鐘玩轉 Docker 容器技術(40)