?
本文檔使用 PHP中文網(wǎng)手冊(cè) 發(fā)布
卷是持久化由 Docker 容器生成和使用的數(shù)據(jù)的首選機(jī)制。雖然綁定掛載依賴(lài)于主機(jī)的目錄結(jié)構(gòu),但卷由 Docker 完全管理。與綁定安裝相比,卷有幾個(gè)優(yōu)點(diǎn):
與綁定掛載相比,卷更容易備份或遷移。
您可以使用 Docker CLI 命令或 Docker API 管理卷。
卷在 Linux 和 Windows 容器上均可使用。
卷可以在多個(gè)容器之間更安全地共享。
卷驅(qū)動(dòng)程序允許您在遠(yuǎn)程主機(jī)或云提供程序上存儲(chǔ)卷,加密卷的內(nèi)容或添加其他功能。
新卷的內(nèi)容可以由容器預(yù)先填充。
另外,與使容器的可寫(xiě)入層中的數(shù)據(jù)持久化相比,卷通常是更好的選擇,因?yàn)槭褂镁聿粫?huì)增加使用容器的容器的大小,并且容器的內(nèi)容存在于給定容器的生命周期之外。
如果您的容器生成非持久狀態(tài)數(shù)據(jù),請(qǐng)考慮使用 tmpfs 掛載以避免將數(shù)據(jù)永久存儲(chǔ)在任何地方,并通過(guò)避免寫(xiě)入容器的可寫(xiě)層來(lái)提高容器的性能。
卷使用rprivate
綁定傳播,并且卷的傳播不可配置。
最初,-v
或--volume
用標(biāo)志獨(dú)立的容器和--mount
用于群服務(wù)標(biāo)志。但是,從 Docker 17.06 開(kāi)始,您也可以使用--mount
獨(dú)立容器。一般來(lái)說(shuō),--mount
更明確和詳細(xì)。最大的區(qū)別在于,-v
語(yǔ)法將所有選項(xiàng)組合在一個(gè)字段中,而--mount
語(yǔ)法將它們分開(kāi)。這是每個(gè)標(biāo)志的語(yǔ)法比較。
提示:新用戶(hù)應(yīng)使用
--mount
語(yǔ)法。有經(jīng)驗(yàn)的用戶(hù)可能更熟悉這個(gè)語(yǔ)法-v
或--volume
語(yǔ)法,但鼓勵(lì)使用--mount
,因?yàn)檠芯勘砻魉子谑褂谩?/p>
如果您需要指定音量驅(qū)動(dòng)程序選項(xiàng),則必須使用--mount
。
-v
或者 --volume
:由三個(gè)由冒號(hào)(:
)分隔的字段組成。這些字段必須按正確的順序排列,每個(gè)字段的含義并不明顯。
對(duì)于命名卷,第一個(gè)字段是卷的名稱(chēng),并且在給定主機(jī)上是唯一的。對(duì)于匿名卷,第一個(gè)字段被省略。
第二個(gè)字段是文件或目錄將被安裝在容器中的路徑。
第三個(gè)字段是可選的,并且是逗號(hào)分隔的選項(xiàng)列表,例如ro
。這些選項(xiàng)在下面討論。
--mount
:由多個(gè)鍵值對(duì)組成,由逗號(hào)分隔,每個(gè)由一個(gè)<key>=<value>
元組組成。該--mount
語(yǔ)法比更詳細(xì)的-v
或--volume
,但按鍵的順序并不顯著,并且標(biāo)志的價(jià)值更容易理解。
該type
安裝件,其可以是bind
,volume
,或tmpfs
。本主題討論卷,所以類(lèi)型將始終如此volume
。
該source
安裝的。對(duì)于命名卷,這是卷的名稱(chēng)。對(duì)于匿名卷,該字段被省略。可能被指定為source
或src
。
的destination
作為其值,其中的文件或目錄將被安裝在容器的路徑??梢灾付?code>destination,dst
或target
。
該readonly
選項(xiàng)(如果存在)將導(dǎo)致綁定掛載以只讀方式掛載到容器中。
volume-opt
可以多次指定的選項(xiàng)采用由選項(xiàng)名稱(chēng)和值組成的鍵值對(duì)。
以下示例在可能的地方顯示了語(yǔ)法--mount
和-v
語(yǔ)法,并--mount
首先給出。
-v
與--mount
行為之間的差異與綁定掛載相反,卷的所有選項(xiàng)都可用于標(biāo)志--mount
和-v
標(biāo)志。
將卷與服務(wù)一起使用時(shí),僅--mount
支持。
與綁定掛載不同,您可以創(chuàng)建和管理任何容器范圍之外的卷。
創(chuàng)建一個(gè)卷:
$ docker volume create my-vol
清單卷:
$ docker volume ls local my-vol
檢查卷:
$ docker volume inspect my-vol[ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": {}, "Scope": "local" }]
刪除卷:
$ docker volume rm my-vol
如果您啟動(dòng)的卷尚未存在的容器,Docker 將為您創(chuàng)建卷。以下示例將卷myvol2
裝入/app/
容器中。
所述-v
和--mount
以下實(shí)施例產(chǎn)生相同的結(jié)果。除非在運(yùn)行第一個(gè)devtest
容器和容器myvol2
之后移除容器和容量,否則無(wú)法運(yùn)行它們。
--mount
-v
$ docker run -d \ -it \ --name devtest \ --mount source=myvol2,target=/app \ nginx:latest
$ docker run -d \ -it \ --name devtest \ -v myvol2:/app \ nginx:latest
使用docker inspect devtest
驗(yàn)證創(chuàng)建卷并安裝正確。尋找Mounts
部分:
"Mounts": [ { "Type": "volume", "Name": "myvol2", "Source": "/var/lib/docker/volumes/myvol2/_data", "Destination": "/app", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }],
這表明掛載是一個(gè)卷,它顯示正確的源和目標(biāo),并且掛載是可讀寫(xiě)的。
停止容器并移除卷。
$ docker container stop devtest $ docker container rm devtest $ docker volume rm myvol2
當(dāng)您啟動(dòng)服務(wù)并定義一個(gè)卷時(shí),每個(gè)服務(wù)容器將使用其自己的本地卷。如果使用local
卷驅(qū)動(dòng)程序,則任何容器都不能共享此數(shù)據(jù),但某些卷驅(qū)動(dòng)程序確實(shí)支持共享存儲(chǔ)。AWS 的 Docker 和 Azure 的 Docker 都使用 Cloudstor 插件支持持久存儲(chǔ)。
以下示例啟動(dòng)一個(gè)nginx
具有四個(gè)副本的服務(wù),每個(gè)副本使用一個(gè)稱(chēng)為的本地卷myvol2
。
$ docker service create -d \ --name devtest-service \ --mount source=myvol2,target=/app \ nginx:latest
使用docker service ps devtest-service
驗(yàn)證服務(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ù)的服務(wù):
$ docker service rm devtest-service
docker service create
命令不支持-v
或--volume
標(biāo)志。將卷安裝到服務(wù)的容器中時(shí),必須使用該--mount
標(biāo)志。
如果您啟動(dòng)一個(gè)創(chuàng)建新卷的容器(如上所述),并且容器在要裝載的目錄中具有文件或目錄(/app/
如上所述),則該目錄的內(nèi)容將被復(fù)制到卷中。然后容器將安裝并使用該卷,并且使用該卷的其他容器也將有權(quán)訪(fǎng)問(wèn)預(yù)填充的內(nèi)容。
為了說(shuō)明這一點(diǎn),這個(gè)例子啟動(dòng)一個(gè)nginx
容器,并nginx-vol
用容器/usr/share/nginx/html
目錄的內(nèi)容填充新卷,這是 Nginx 存儲(chǔ)其默認(rèn) HTML 內(nèi)容的地方。
這個(gè)例子--mount
和-v
最后的結(jié)果是一樣的。
--mount
-v
$ docker run -d \ -it \ --name=nginxtest \ --mount source=nginx-vol,destination=/usr/share/nginx/html \ nginx:latest
$ docker run -d \ -it \ --name=nginxtest \ -v nginx-vol:/usr/share/nginx/html \ nginx:latest
運(yùn)行這些示例之一后,運(yùn)行以下命令來(lái)清理容器和卷。
$ docker container stop nginxtest $ docker container rm nginxtest $ docker volume rm nginx-vol
對(duì)于某些開(kāi)發(fā)應(yīng)用程序,容器能夠?qū)懭虢壎ò惭b非常有用,以便將更改傳播回Docker主機(jī)。在其他時(shí)候,容器應(yīng)該只能讀取數(shù)據(jù)而不能修改它。請(qǐng)記住,多個(gè)容器可以安裝相同的卷,并且可以同時(shí)對(duì)它們中的某些容器進(jìn)行讀寫(xiě)安裝,也可以對(duì)其他容器進(jìn)行只讀。
這個(gè)例子修改了上面的例子,但是通過(guò)ro
在容器中的掛載點(diǎn)之后添加選項(xiàng)列表(默認(rèn)為空),將目錄掛載為只讀卷。如果存在多個(gè)選項(xiàng),請(qǐng)用逗號(hào)分隔它們。
在--mount
和-v
實(shí)例有同樣的結(jié)果。
--mount
-v
$ docker run -d \ -it \ --name=nginxtest \ --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \ nginx:latest
$ docker run -d \ -it \ --name=nginxtest \ -v nginx-vol:/usr/share/nginx/html:ro \ nginx:latest
使用docker inspect nginxtest
驗(yàn)證綁定安裝正確創(chuàng)建。尋找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
當(dāng)您使用創(chuàng)建卷docker volume create
或啟動(dòng)使用尚未創(chuàng)建的卷的容器時(shí),可以指定卷驅(qū)動(dòng)程序。以下示例vieux/sshfs
首先在創(chuàng)建獨(dú)立卷時(shí)使用卷驅(qū)動(dòng)程序,然后在啟動(dòng)將創(chuàng)建新卷的容器時(shí)使用卷驅(qū)動(dòng)程序。
此示例假定您有兩個(gè)節(jié)點(diǎn),其中第一個(gè)是 Docker 主機(jī),可以使用 SSH 連接到第二個(gè)節(jié)點(diǎn)。
在 Docker 主機(jī)上安裝vieux/sshfs
插件:
$ docker plugin install --grant-all-permissions vieux/sshfs
本示例指定了一個(gè) SSH 密碼,但如果兩臺(tái)主機(jī)配置了共享密鑰,則可以省略該密碼。每個(gè)卷驅(qū)動(dòng)器可能有零個(gè)或多個(gè)可配置選項(xiàng),每個(gè)選項(xiàng)都使用一個(gè)-o
標(biāo)志來(lái)指定。
$ docker volume create --driver vieux/sshfs \ -o sshcmd=test@node2:/home/test \ -o password=testpassword \ sshvolume
本示例指定了一個(gè) SSH 密碼,但如果兩臺(tái)主機(jī)配置了共享密鑰,則可以省略該密碼。每個(gè)卷驅(qū)動(dòng)可能有零個(gè)或多個(gè)可配置選項(xiàng)。如果卷驅(qū)動(dòng)程序要求您傳遞選項(xiàng),則必須使用此--mount
標(biāo)志掛載卷,而不是-v
**。**
$ docker run -d \ --it \ --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
了解綁定掛載。
了解 tmpfs 掛載。
了解存儲(chǔ)驅(qū)動(dòng)程序。