Docker容器中數(shù)據(jù)卷volumes的使用
volumes是Docker數(shù)據(jù)持久化機(jī)制。bind mounts依賴(lài)主機(jī)目錄結(jié)構(gòu),volumes完全由Docker管理。Volumes有以下優(yōu)點(diǎn):
- Volumes更容易備份和移植。
- 可以通過(guò)Docker CLI或API進(jìn)行管理
- Volumes可以無(wú)區(qū)別的工作中Windows和Linux下。
- 多個(gè)容器共享Volumes更安全。
- Volume驅(qū)動(dòng)可以允許你把數(shù)據(jù)存儲(chǔ)到遠(yuǎn)程主機(jī)或者云端,并且加密數(shù)據(jù)內(nèi)容,以及添加額外功能。
- 一個(gè)新的數(shù)據(jù)內(nèi)容可以由容器預(yù)填充。
而且,volumes不會(huì)增加容器的大小,生命周期獨(dú)立與容器。
如果你的容器產(chǎn)生不需要持久化數(shù)據(jù),請(qǐng)使用tmpfs mount方式,可以避免容器的寫(xiě)入層數(shù)據(jù)寫(xiě)入。
Volumes use rprivate bind propagation, and bind propagation is not configurable for volumes.(不理解什么意思)
選擇使用 -v還是—mount
起初,-v或者—volume用于獨(dú)立容器,--mount用于 swarm services。然而,從 Docker 17.06開(kāi)始,也可是使用 --mount用于獨(dú)立容器。—mount命令更精準(zhǔn)詳細(xì)。-v將選項(xiàng)進(jìn)行了合并。使用—mount。
如果你需要制定volume驅(qū)動(dòng)選項(xiàng),你必須使用 —mount。
- -v或者--volume:由3部分參數(shù)組成,使用“:”間隔。順序不能顛倒。
- 第一個(gè)部分是volumes名字,在宿主機(jī)上具有唯一性。匿名卷名字系統(tǒng)給出。
- 第二部分是掛載到容器里的文件或文件夾路徑。
- 第三部分是可選項(xiàng)列表分隔符,例如“or”,這些可選項(xiàng)在下面會(huì)討論。
- —mount:由多個(gè)鍵值對(duì)組成,<key>=<value>。—mount要比-v或者--volume命令更長(zhǎng),但是更容易理解。
- type,可以是bind,volume或者tmpfs。這篇文章主要討論volumes,所以type一直使用volume.
- source,volumes的名字,匿名volume可以省略。source可縮寫(xiě)為src.
- destination,掛載到容器中的文件或目錄路徑??梢部s寫(xiě)為dst或者使用target。
- readonly,指定掛載在容器中為只讀。
- volume-opt,可選屬性,可以多次使用。
下面是—mount和-v的例子。
-v和—mount的不同行為
與bind mounts不同,對(duì)于—mount和-v所有的選項(xiàng)都可以使用。
當(dāng)使用volumes服務(wù)時(shí),只支持—mount.
創(chuàng)建和管理volumes
不像bind mount,你可以在容器外創(chuàng)建和管理volumes。
創(chuàng)建一個(gè)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" } ]
刪除一個(gè)volume:
$ docker volume rm my-vol
啟動(dòng)一個(gè)帶volume的容器
如果你啟動(dòng)一個(gè)帶有volume容器,volume還沒(méi)有創(chuàng)建,Docker會(huì)為你創(chuàng)建。下面的例子掛載myvol2到容器中的/app/下。
下面的例子-v和—mount結(jié)果是一樣的。
—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"?:? ?"" ?} ],
可以看出掛載正確,并且是可讀寫(xiě)的。
停止容器然后刪除volume
$ ?docker container stop devtest $ ?docker container rm devtest $ ?docker volume rm myvol2
啟動(dòng)一個(gè)帶有volumes服務(wù)
當(dāng)你啟動(dòng)服務(wù)定義一個(gè)volume,每個(gè)服務(wù)可以使用自己本地人volume.如果你使用local volume,容器不能分享數(shù)據(jù),但是一些volume驅(qū)動(dòng)支持分享存儲(chǔ)。 Docker for AWS and Docker for Azure使用 Cloudstor插件 都支持持久化存儲(chǔ)。
下面的例子啟動(dòng)4份nginx服務(wù),每個(gè)使用一個(gè)本地存儲(chǔ)myvol2。
$ ?docker service create ?-d? ?\ ?--replicas?=?4 ?\ ?--name? devtest-service ?\ ?--mount? ?source?=?myvol2,target?=?/app ?\ ? nginx:latest
使用 docker service ps devtest-service 查看服務(wù)是否運(yùn)行:
$ ?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??
刪除服務(wù)
$ ?docker service rm devtest-service
服務(wù)標(biāo)識(shí)的不同
docker service create 命令不支持-v或者—volume。必須使用—mount。
使用容器加載一個(gè)volume
和上面一樣,如果你啟動(dòng)一個(gè)容器創(chuàng)建一個(gè)新的volume,在容器被掛載的目錄(/app/)中有文件或者文件夾,這個(gè)目錄中的內(nèi)容會(huì)被拷貝到volume中。然后容器掛載使用volume,其他容器使用這個(gè)volume也可以訪(fǎng)問(wèn)預(yù)加載內(nèi)容。
為了說(shuō)明這個(gè),這個(gè)例子啟動(dòng)一個(gè)nginx容器并且加載一個(gè)新volume nginx-vol,里面包括容器中 /usr/share/nginx/html 目錄中的內(nèi)容,里面存儲(chǔ)的是nginx默認(rèn)的HTML內(nèi)容。
—mount and -v具有相同結(jié)果
—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
以下是運(yùn)行后清理命令
$ ?docker container stop nginxtest $ ?docker container rm nginxtest $ ?docker volume rm nginx-vol
使用只讀volume
對(duì)于一些開(kāi)發(fā)應(yīng)用,容器需要回寫(xiě)數(shù)據(jù)到Docker主機(jī)。但有時(shí)容器只需要讀數(shù)據(jù)。請(qǐng)記住多個(gè)容器可以?huà)燧d相同volume,一個(gè)掛載讀寫(xiě)容器,也可以?huà)燧d只讀容器,還可以?xún)煞N同時(shí)掛載。
這個(gè)例子修改上面的例子,但是掛載的是只讀容器,使用’or’分隔符處理選項(xiàng)列表,
—mount and -v具有相同結(jié)果
—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
機(jī)器間共享數(shù)據(jù)
當(dāng)構(gòu)建高可用應(yīng)用程序,你需要配置多個(gè)相同的服務(wù)訪(fǎng)問(wèn)相同文件。
有幾種方法可以達(dá)到這種效果。一種是在你的應(yīng)用中添加對(duì)云存儲(chǔ)文件的訪(fǎng)問(wèn),如 Amazon S3。另一種是使用支持外服存儲(chǔ)驅(qū)動(dòng)(NFS, Amazon S3 )的volume。
Volume驅(qū)動(dòng)允許你在應(yīng)用中抽象下層的存儲(chǔ)系統(tǒng)。例如,如果你的服務(wù)使用NFS驅(qū)動(dòng)volume,你可以使用不同的驅(qū)動(dòng)更新服務(wù),就像存儲(chǔ)在云中的數(shù)據(jù),不需要修改應(yīng)用邏輯。
使用volume驅(qū)動(dòng)
當(dāng)你使用docker volume create創(chuàng)建一個(gè)volume,或者當(dāng)你啟動(dòng)一個(gè)帶有沒(méi)創(chuàng)建volume的容器,你可以指定volume驅(qū)動(dòng)。下面例子使用 vieux/sshfs volume驅(qū)動(dòng) ,首先創(chuàng)建一個(gè)獨(dú)立的volume,然后啟動(dòng)一個(gè)創(chuàng)建新volume的容器。
初始化設(shè)置
這個(gè)例子假設(shè)你有兩個(gè)節(jié)點(diǎn),第一個(gè)是Docker主機(jī)而且可以連接到第二個(gè)的ssh.
在Docker主機(jī)中安裝vieux/sshfs插件:
$ ?docker plugin install ?--grant-all-permissions? vieux/sshfs
使用volume驅(qū)動(dòng)創(chuàng)建volume
這個(gè)樣例指定一個(gè)SSH密碼,但是如果兩個(gè)主機(jī)共享keys配置,你可以省略密碼。每個(gè)volume驅(qū)動(dòng)可以沒(méi)有或者更多配置選項(xiàng),可以使用-o標(biāo)識(shí)。
$ ?docker volume create ?--driver? vieux/sshfs ?\ ?-o? ?sshcmd?=?test?@node2:/home/test ?\ ?-o? ?password?=?testpassword ?\ ? sshvolume
test @node2:/home/test 為遠(yuǎn)程主機(jī)掛載點(diǎn)
啟動(dòng)一個(gè)帶有使用volume驅(qū)動(dòng)創(chuàng)建volume的容器
這個(gè)樣例指定一個(gè)SSH密碼,但是如果兩個(gè)主機(jī)共享keys配置,你可以省略密碼。每個(gè)volume驅(qū)動(dòng)可以沒(méi)有或者更多配置選項(xiàng)。如果volume驅(qū)動(dòng)要穿可選參數(shù),你必須使用—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/
總結(jié)
到此這篇關(guān)于Docker容器中數(shù)據(jù)卷volumes使用的文章就介紹到這了,更多相關(guān)Docker volumes使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- docker 啟動(dòng)elasticsearch鏡像,掛載目錄后報(bào)錯(cuò)的解決
- docker-修改容器掛載目錄的3種方法小結(jié)
- docker 查看容器的掛載目錄操作
- docker中容器數(shù)據(jù)卷volume介紹
- Docker容器數(shù)據(jù)卷介紹及操作示例
- Docker容器數(shù)據(jù)卷技術(shù)介紹
- Docker數(shù)據(jù)卷掛載命令volume(-v)與mount的使用總結(jié)
- Docker容器數(shù)據(jù)卷的使用教程
- Docker中容器數(shù)據(jù)卷詳解
- docker如何對(duì)已經(jīng)啟動(dòng)的容器添加目錄映射(掛載目錄)
- Docker數(shù)據(jù)卷和掛載目錄的使用
相關(guān)文章
Docker部署及使用壓測(cè)神器sysbench的方法
sysbench 是一個(gè)開(kāi)源跨平臺(tái)的多線(xiàn)程性能測(cè)試工具,這篇文章主要介紹了Docker部署及使用壓測(cè)神器sysbench的相關(guān)知識(shí),需要的朋友可以參考下2022-08-08Docker buildx構(gòu)建多平臺(tái)鏡像并推送到私有倉(cāng)庫(kù)的方法
這篇文章主要介紹了Docker buildx構(gòu)建多平臺(tái)鏡像并推送到私有倉(cāng)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01淺談docker運(yùn)行nginx為什么要使用daemon off
這篇文章主要介紹了淺談docker運(yùn)行nginx為什么要使用daemon off,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01本地Docker安裝Postgres 12 + pgadmin的方法 (支持Apple M1)
這篇文章主要介紹了本地Docker安裝Postgres 12 + pgadmin的方法 (支持Apple M1),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03解決docker容器啟動(dòng)后馬上退出的問(wèn)題
這篇文章主要介紹了解決docker容器啟動(dòng)后馬上退出的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11Navicat 連接服務(wù)器端中的docker數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Navicat 連接服務(wù)器端中的docker數(shù)據(jù)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03docker?部署?gitlab-ce?16.9.1的詳細(xì)過(guò)程
Docker是一個(gè)開(kāi)源的應(yīng)用容器引擎,它允許開(kāi)發(fā)者將應(yīng)用及其依賴(lài)打包到一個(gè)可移植的容器中,然后發(fā)布到任何支持Docker的Linux或Windows操作系統(tǒng)上,這篇文章主要介紹了docker?部署gitlab-ce?16.9.1的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-04-04