網站首頁 編程語言 正文
volumes是Docker數據持久化機制。bind mounts依賴主機目錄結構,volumes完全由Docker管理。Volumes有以下優點:
- Volumes更容易備份和移植。
- 可以通過Docker CLI或API進行管理
- Volumes可以無區別的工作中Windows和Linux下。
- 多個容器共享Volumes更安全。
- Volume驅動可以允許你把數據存儲到遠程主機或者云端,并且加密數據內容,以及添加額外功能。
- 一個新的數據內容可以由容器預填充。
而且,volumes不會增加容器的大小,生命周期獨立與容器。
如果你的容器產生不需要持久化數據,請使用tmpfs mount方式,可以避免容器的寫入層數據寫入。
Volumes use? rprivate ?bind propagation, and bind propagation is not configurable for volumes.(不理解什么意思)
選擇使用 -v還是—mount
起初,-v或者—volume用于獨立容器,--mount用于 swarm services。然而,從 Docker 17.06開始,也可是使用 --mount用于獨立容器。—mount命令更精準詳細。-v將選項進行了合并。使用—mount。
如果你需要制定volume驅動選項,你必須使用?—mount。
- -v或者--volume:由3部分參數組成,使用“:”間隔。順序不能顛倒。
- 第一個部分是volumes名字,在宿主機上具有唯一性。匿名卷名字系統給出。
- 第二部分是掛載到容器里的文件或文件夾路徑。
- 第三部分是可選項列表分隔符,例如“or”,這些可選項在下面會討論。
- ? ??—mount:由多個鍵值對組成,<key>=<value>。—mount要比-v或者--volume命令更長,但是更容易理解。
- type,可以是bind,volume或者tmpfs。這篇文章主要討論volumes,所以type一直使用volume.
- source,volumes的名字,匿名volume可以省略。source可縮寫為src.
- destination,掛載到容器中的文件或目錄路徑。可也縮寫為dst或者使用target。
- readonly,指定掛載在容器中為只讀。
- volume-opt,可選屬性,可以多次使用。
下面是—mount和-v的例子。
-v和—mount的不同行為
與bind mounts不同,對于—mount和-v所有的選項都可以使用。
當使用volumes服務時,只支持—mount.
創建和管理volumes
不像bind mount,你可以在容器外創建和管理volumes。
創建一個volume:
$ docker volume create my-vol
顯示所有volumes
$ docker volume ls
local my-vol
查看volumes
$ docker volume inspect my-vol
[
{
"Driver" : "local" ,
"Labels" : {} ,
"Mountpoint" : "/var/lib/docker/volumes/my-vol/_data" ,
"Name" : "my-vol" ,
"Options" : {} ,
"Scope" : "local"
}
]
刪除一個volume:
$ docker volume rm my-vol
啟動一個帶volume的容器
如果你啟動一個帶有volume容器,volume還沒有創建,Docker會為你創建。下面的例子掛載myvol2到容器中的/app/下。
下面的例子-v和—mount結果是一樣的。
—mount:
$ docker run -d \
--name devtest \
--mount source = myvol2,target = /app \
nginx:latest
-v:
$ ?docker run ?-d? ?\
?--name? devtest ?\
?-v? myvol2:/app ?\
? nginx:latest
使用inspect查看掛載是否正確,查看Mounts部分:
"Mounts"?:? ?[
?{
?"Type"?:? ?"volume"?,
?"Name"?:? ?"myvol2"?,
?"Source"?:? ?"/var/lib/docker/volumes/myvol2/_data"?,
?"Destination"?:? ?"/app"?,
?"Driver"?:? ?"local"?,
?"Mode"?:? ?""?,
?"RW"?:? ?true?,
?"Propagation"?:? ?""
?}
],
可以看出掛載正確,并且是可讀寫的。
停止容器然后刪除volume
$ ?docker container stop devtest
$ ?docker container rm devtest
$ ?docker volume rm myvol2
啟動一個帶有volumes服務
當你啟動服務定義一個volume,每個服務可以使用自己本地人volume.如果你使用local volume,容器不能分享數據,但是一些volume驅動支持分享存儲。?Docker for AWS and Docker for Azure使用?Cloudstor插件?都支持持久化存儲。
下面的例子啟動4份nginx服務,每個使用一個本地存儲myvol2。
$ ?docker service create ?-d? ?\
?--replicas?=?4 ?\
?--name? devtest-service ?\
?--mount? ?source?=?myvol2,target?=?/app ?\
? nginx:latest
使用?docker service ps devtest-service??查看服務是否運行:
$ ?docker service ps devtest-service
ID????????????????? NAME??????????????? IMAGE?????????????? NODE??????????????? DESIRED STATE?????? CURRENT STATE??????????? ERROR?????????????? PORTS
4d7oz1j85wwn??????? devtest-service.1?? nginx:latest??????? moby??????????????? Running???????????? Running 14 seconds ago??
刪除服務
$ ?docker service rm devtest-service
服務標識的不同
??docker service create??命令不支持-v或者—volume。必須使用—mount。
使用容器加載一個volume
和上面一樣,如果你啟動一個容器創建一個新的volume,在容器被掛載的目錄(/app/)中有文件或者文件夾,這個目錄中的內容會被拷貝到volume中。然后容器掛載使用volume,其他容器使用這個volume也可以訪問預加載內容。
為了說明這個,這個例子啟動一個nginx容器并且加載一個新volume nginx-vol,里面包括容器中?/usr/share/nginx/html??目錄中的內容,里面存儲的是nginx默認的HTML內容。
—mount and -v具有相同結果
—mount:
$ ?docker run ?-d? ?\
?--name?=?nginxtest ?\
?--mount? ?source?=?nginx-vol,destination?=?/usr/share/nginx/html ?\
? nginx:latest
-v
$ ?docker run ?-d? ?\
?--name?=?nginxtest ?\
?-v? nginx-vol:/usr/share/nginx/html ?\
? nginx:latest
以下是運行后清理命令
$ ?docker container stop nginxtest
$ ?docker container rm nginxtest
$ ?docker volume rm nginx-vol
使用只讀volume
對于一些開發應用,容器需要回寫數據到Docker主機。但有時容器只需要讀數據。請記住多個容器可以掛載相同volume,一個掛載讀寫容器,也可以掛載只讀容器,還可以兩種同時掛載。
這個例子修改上面的例子,但是掛載的是只讀容器,使用’or’分隔符處理選項列表,
—mount and -v具有相同結果
—mount
$ ?docker run ?-d? ?\
?--name?=?nginxtest ?\
?--mount? ?source?=?nginx-vol,destination?=?/usr/share/nginx/html,readonly ?\
? nginx:latest
-v
$ ?docker run ?-d? ?\
?--name?=?nginxtest ?\
?-v? nginx-vol:/usr/share/nginx/html:ro ?\
? nginx:latest
使用??docker inspect nginxtest?命令查看是否掛載正確,查看Mounts部分
"Mounts"?:? ?[
?{
?"Type"?:? ?"volume"?,
?"Name"?:? ?"nginx-vol"?,
?"Source"?:? ?"/var/lib/docker/volumes/nginx-vol/_data"?,
?"Destination"?:? ?"/usr/share/nginx/html"?,
?"Driver"?:? ?"local"?,
?"Mode"?:? ?""?,
?"RW"?:? ?false?,
?"Propagation"?:? ?""
?}
],
清理命令
$ ?docker container stop nginxtest
$ ?docker container rm nginxtest
$ ?docker volume rm nginx-vol
機器間共享數據
當構建高可用應用程序,你需要配置多個相同的服務訪問相同文件。
有幾種方法可以達到這種效果。一種是在你的應用中添加對云存儲文件的訪問,如 Amazon S3。另一種是使用支持外服存儲驅動(NFS,? Amazon S3 )的volume。
Volume驅動允許你在應用中抽象下層的存儲系統。例如,如果你的服務使用NFS驅動volume,你可以使用不同的驅動更新服務,就像存儲在云中的數據,不需要修改應用邏輯。
使用volume驅動
當你使用docker volume create創建一個volume,或者當你啟動一個帶有沒創建volume的容器,你可以指定volume驅動。下面例子使用?vieux/sshfs volume驅動?,首先創建一個獨立的volume,然后啟動一個創建新volume的容器。
初始化設置
這個例子假設你有兩個節點,第一個是Docker主機而且可以連接到第二個的ssh.
在Docker主機中安裝vieux/sshfs插件:
$ ?docker plugin install ?--grant-all-permissions? vieux/sshfs
使用volume驅動創建volume
這個樣例指定一個SSH密碼,但是如果兩個主機共享keys配置,你可以省略密碼。每個volume驅動可以沒有或者更多配置選項,可以使用-o標識。
$ ?docker volume create ?--driver? vieux/sshfs ?\
?-o? ?sshcmd?=?test?@node2:/home/test ?\
?-o? ?password?=?testpassword ?\
? sshvolume
test?@node2:/home/test 為遠程主機掛載點
啟動一個帶有使用volume驅動創建volume的容器
這個樣例指定一個SSH密碼,但是如果兩個主機共享keys配置,你可以省略密碼。每個volume驅動可以沒有或者更多配置選項。如果volume驅動要穿可選參數,你必須使用—mount。
$ ?docker run ?-d? ?\
?--name? sshfs-container ?\
?--volume-driver? vieux/sshfs ?\
?--mount? ?src?=?sshvolume,target?=?/app,volume-opt?=?sshcmd?=?test?@node2:/home/test,volume-opt?=?password?=?testpassword ?\
? nginx:latest
參考: https://docs.docker.com/storage/volumes/
總結
原文鏈接:https://blog.csdn.net/weixin_42028353/article/details/80018028
相關推薦
- 2022-04-11 C語言實現貪吃蛇游戲代碼_C 語言
- 2022-10-17 python中list列表復制的幾種方法(賦值、切片、copy(),deepcopy())_pyth
- 2022-12-23 swift指針及內存管理內存綁定實例詳解_Swift
- 2022-07-09 設置滾動條默認樣式 谷歌瀏覽器
- 2022-06-18 Android自定義彈框Dialog效果_Android
- 2022-03-21 C語言楊輝三角兩種實現方法_C 語言
- 2022-11-18 關于python中第三方庫交叉編譯的問題_python
- 2022-06-01 AndriodStudio利用ListView和數據庫實現簡單學生管理_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支