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