(三)docker managed volume
? docker managed volume 與 bind mount 在使用上的最大區別是不需要指定 mount 源,指明 mount point 就行了,還是以 httpd 容器為例:
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 inspect 命令:
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,
Source 就是該 volume 在 host 上的目錄,
原來,每當容器申請 mount docker manged volume 時,docker 都會在/var/lib/docker/volumes 下生成一個目錄(例子中是 "/var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data),這個目錄就是 mount 源,
下面繼續研究這個 volume,看看里面有些什么東西:
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 中,
但要明確一點:此時的 /usr/local/apache2/htdocs 已經不再是由 storage driver 管理的層資料了,它已經是一個 data volume,我們可以像 bind mount 一樣對資料進行操作,例如更新資料:
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 的創建程序:
- 容器啟動時,簡單的告訴 docker "我需要一個 volume 存放資料,幫我 mount 到目錄 /abc",
- docker 在 /var/lib/docker/volumes 中生成一個隨機目錄作為 mount 源,
- 如果 /abc 已經存在,則將資料復制到 mount 源,
- 將 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 的原理和基本使用方法,下面做個對比:
-
相同點:兩者都是 host 檔案系統中的某個路徑,
-
不同點:
bind mount docker managed volume volume 位置 可任意指定 /var/lib/docker/volumes/... 對已有mount point 影響 隱藏并替換為 volume 原有資料復制到 volume 是否支持單個檔案 支持 不支持,只能是目錄 權限控制 可設定為只讀,默認為讀寫權限 無控制,均為讀寫權限 移植性 移植性弱,與 host path 系結 移植性強,無需指定 host 目錄 下節討論如何通過 data volume 實作容器與 host,容器與容器共享資料,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/228754.html
標籤:其他
上一篇:容器(六)Data Volume 之 bind mount【34】
下一篇:什么是集群、分布式和微服務?
