容器(六)docker managed volume【35】

(三)docker managed volume

​ docker managed volume 與 bind mount 在使用上的最大區別是不須要指定 mount 源,指明 mount point 就好了。仍是以 httpd 容器爲例:html

root@cuiyongchao:~# docker run -d -p 84:80 -v /usr/local/apache2/htdocs/ httpd
ddc068dfa02cf824ab67ad9abbedc71addbbc7563ec548917c46003fa961abb8

咱們經過 -v 告訴 docker 須要一個 data volume,並將其 mount 到 /usr/local/apache2/htdocs。那麼這個 data volume 具體在哪兒呢?docker

這個答案能夠在容器的配置信息中找到,執行 docker inspect 命令:apache

root@cuiyongchao:~# docker exec -it ddc068dfa02c /bin/bash
root@ddc068dfa02c:/usr/local/apache2# cat htdocs/index.html 
<html><body><h1>It works!</h1></body></html>
root@ddc068dfa02c:/usr/local/apache2# exit
exit
root@cuiyongchao:~# docker inspect ddc068dfa02c

      "Mounts": [
            {
                "Type": "volume",
                "Name": "c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7",
                "Source": "/var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data",
                "Destination": "/usr/local/apache2/htdocs",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

docker inspect 的輸出不少,咱們感興趣的是 Mounts 這部分,這裏會顯示容器當前使用的全部 data volume,包括 bind mount 和 docker managed volume。bash

Source 就是該 volume 在 host 上的目錄。curl

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

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

root@cuiyongchao:~# cat /var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data/index.html <html><body><h1>It works!</h1></body></html>
root@cuiyongchao:~#

volume 的內容跟容器原有 /usr/local/apache2/htdocs 徹底同樣,這是怎麼回事呢?這是由於:若是 mount point 指向的是已有目錄,原有數據會被複制到 volume 中。url

但要明確一點:此時的 /usr/local/apache2/htdocs 已經再也不是由 storage driver 管理的層數據了,它已是一個 data volume。咱們能夠像 bind mount 同樣對數據進行操做,例如更新數據:code

root@cuiyongchao:~# echo "update volume from host">/var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data/index.html
root@cuiyongchao:~# curl 10.0.0.20:84
update volume from host
root@cuiyongchao:~#

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

  1. 容器啓動時,簡單的告訴 docker "我須要一個 volume 存放數據,幫我 mount 到目錄 /abc"。
  2. docker 在 /var/lib/docker/volumes 中生成一個隨機目錄做爲 mount 源。
  3. 若是 /abc 已經存在,則將數據複製到 mount 源,
  4. 將 volume mount 到 /abc

除了經過 docker inspect 查看 volume,咱們也能夠用 docker volume 命令:

root@cuiyongchao:~# docker volume ls
DRIVER              VOLUME NAME
local               c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7
root@cuiyongchao:~# docker volume inspect c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7
[
    {
        "CreatedAt": "2020-11-02T04:00:43Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data",
        "Name": "c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7",
        "Options": null,
        "Scope": "local"
    }
]
root@cuiyongchao:~#

​ 目前,docker volume 只能查看 docker managed volume,還看不到 bind mount;同時也沒法知道 volume 對應的容器,這些信息還得靠docker inspect

咱們已經學習了兩種 data volume 的原理和基本使用方法,下面作個對比:

  1. 相同點:二者都是 host 文件系統中的某個路徑。

  2. 不一樣點:

    bind mount docker managed volume
    volume 位置 可任意指定 /var/lib/docker/volumes/...
    對已有mount point 影響 隱藏並替換爲 volume 原有數據複製到 volume
    是否支持單個文件 支持 不支持,只能是目錄
    權限控制 可設置爲只讀,默認爲讀寫權限 無控制,均爲讀寫權限
    移植性 移植性弱,與 host path 綁定 移植性強,無需指定 host 目錄

    下節討論如何經過 data volume 實現容器與 host,容器與容器共享數據。

相關文章
相關標籤/搜索