天天看點

docker managed volume - 每天5分鐘玩轉 Docker 容器技術(40)

docker managed volume 與 bind mount 在使用上的最大差別是不需要指定 mount 源,指明 mount point 就行了。還是以 httpd 容器為例:

docker managed volume - 每天5分鐘玩轉 Docker 容器技術(40)

我們通過 <code>-v</code> 告訴 docker 需要一個 data volume,并将其 mount 到 /usr/local/apache2/htdocs。那麼這個 data volume 具體在哪兒呢?

這個答案可以在容器的配置資訊中找到,執行 <code>docker inspect</code> 指令:

docker inspect 21accc2ca072

......

"Mounts": [

    {

        "Name": "f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340",

        "Source": "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data",

        "Destination": "/usr/local/apache2/htdocs",

        "Driver": "local",

        "Mode": "",

        "RW": true,

        "Propagation": ""

    }

],

<code>docker inspect</code> 的輸出很多,我們感興趣的是 <code>Mounts</code> 這部分,這裡會顯示容器目前使用的所有 data volume,包括 bind mount 和 docker managed volume。

<code>Source</code> 就是該 volume 在 host 上的目錄。

原來,每當容器申請 mount docker manged volume 時,docker 都會在<code>/var/lib/docker/volumes</code> 下生成一個目錄(例子中是 "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data ),這個目錄就是 mount 源。

下面繼續研究這個 volume,看看裡面有些什麼東西:

docker managed volume - 每天5分鐘玩轉 Docker 容器技術(40)

volume 的内容跟容器原有 /usr/local/apache2/htdocs 完全一樣,這是怎麼回事呢?

這是因為:如果 mount point 指向的是已有目錄,原有資料會被複制到 volume 中。

但要明确一點:此時的 /usr/local/apache2/htdocs 已經不再是由 storage driver 管理的層資料了,它已經是一個 data volume。我們可以像 bind mount 一樣對資料進行操作,例如更新資料:

docker managed volume - 每天5分鐘玩轉 Docker 容器技術(40)

簡單回顧一下 docker managed volume 的建立過程:

容器啟動時,簡單的告訴 docker "我需要一個 volume 存放資料,幫我 mount 到目錄 /abc"。

docker 在 /var/lib/docker/volumes 中生成一個随機目錄作為 mount 源。

如果 /abc 已經存在,則将資料複制到 mount 源,

将 volume mount 到 /abc

除了通過 <code>docker inspect</code> 檢視 volume,我們也可以用 <code>docker volume</code> 指令:

docker managed volume - 每天5分鐘玩轉 Docker 容器技術(40)

目前,<code>docker volume</code> 隻能檢視 docker managed volume,還看不到 bind mount;同時也無法知道 volume 對應的容器,這些資訊還得靠<code>docker inspect</code>。

我們已經學習了兩種 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)