?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
綁定掛載從 Docker 早期開(kāi)始就已經(jīng)存在。與卷相比,綁定安裝具有有限的功能。當(dāng)您使用綁定掛載時(shí),主機(jī)上的文件或目錄被掛載到容器中。文件或目錄由主機(jī)上的完整路徑或相對(duì)路徑引用。相比之下,當(dāng)您使用卷時(shí),會(huì)在主機(jī)上的 Docker 存儲(chǔ)目錄中創(chuàng)建一個(gè)新目錄,并且 Docker 會(huì)管理該目錄的內(nèi)容。
文件或目錄不需要已經(jīng)存在于 Docker 主機(jī)上。如果它尚不存在,它會(huì)根據(jù)需求創(chuàng)建。綁定掛載非常高效,但它們依賴(lài)于具有特定目錄結(jié)構(gòu)的主機(jī)的文件系統(tǒng)。如果您正在開(kāi)發(fā)新的 Docker 應(yīng)用程序,請(qǐng)考慮使用命名卷。您不能使用 Docker CLI 命令直接管理綁定掛載。
最初,-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ǔ)法比較。
提示:新用戶應(yīng)使用
--mount
語(yǔ)法。有經(jīng)驗(yàn)的用戶可能更熟悉這個(gè)語(yǔ)法-v
或--volume
語(yǔ)法,但鼓勵(lì)使用--mount
,因?yàn)檠芯勘砻魉子谑褂谩?/p>
-v
或者 --volume
:由三個(gè)由冒號(hào)(:
)分隔的字段組成。這些字段必須按正確的順序排列,每個(gè)字段的含義并不明顯。
在綁定掛載的情況下,第一個(gè)字段是主機(jī)上文件或目錄的路徑。
第二個(gè)字段是文件或目錄將被安裝在容器中的路徑。
第三個(gè)字段是可選的,并且是用逗號(hào)分隔的選項(xiàng),諸如列表ro
,consistent
,delegated
,cached
,z
,和Z
。這些選項(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)型將始終如此bind
。
source
安裝的。對(duì)于綁定掛載,這是 Docker 守護(hù)程序主機(jī)上文件或目錄的路徑??赡鼙恢付?code>source或src
。
destination
作為其值,其中的文件或目錄將被安裝在容器的路徑??梢灾付?code>destination,dst
或target
。
readonly
選項(xiàng)(如果存在)將導(dǎo)致綁定掛載以只讀方式掛載到容器中。
bind-propagation
選項(xiàng)(如果存在)會(huì)更改綁定傳播??梢允且粋€(gè)rprivate
,private
,rshared
,shared
,rslave
,slave
。
consistency
選項(xiàng),如果存在,可以是一種consistent
,delegated
或cached
。此設(shè)置僅適用于 Docker for Mac,并在所有其他平臺(tái)上被忽略。
--mount
標(biāo)志不支持z
或Z
修改 selinux 標(biāo)簽的選項(xiàng)。
以下示例在可能的地方顯示了語(yǔ)法--mount
和-v
語(yǔ)法,并且--mount
首先給出。
-v
與--mount
行為之間的差異由于-v
和--volume
標(biāo)志長(zhǎng)期以來(lái)一直是 Docker 的一部分,它們的行為不能改變。這意味著-v
和** --mount
之間有一個(gè)不同的行為 。
如果您使用-v
或--volume
綁定 Docker 主機(jī)上尚不存在的文件或目錄,-v
將為您創(chuàng)建端點(diǎn)。它始終創(chuàng)建為一個(gè)目錄。
如果您使用--mount
綁定貼裝Docker主機(jī)上尚不存在的文件或目錄,Docker也不會(huì)自動(dòng)為您創(chuàng)建它,但會(huì)產(chǎn)生一個(gè)錯(cuò)誤。
考慮一個(gè)你有source
目錄的情況,并且當(dāng)你構(gòu)建源代碼時(shí),工件被保存到另一個(gè)目錄中source/target/
。您希望工件對(duì)容器可用/app/
,并且您希望容器每次在開(kāi)發(fā)主機(jī)上構(gòu)建源時(shí)都可以訪問(wèn)新的構(gòu)建。使用以下命令將target/
目錄綁定到您的容器中/app/
。從source
目錄內(nèi)運(yùn)行命令。$(pwd)
子命令將擴(kuò)展到 Linux 或者 MacOS 主機(jī)的當(dāng)前工作目錄。
--mount
和-v
以下實(shí)施例產(chǎn)生相同的結(jié)果。除非在運(yùn)行第一個(gè)容器后移除devtest
容器,否則無(wú)法運(yùn)行它們。
--mount
-v
$ docker run -d \ -it \ --name devtest \ --mount type=bind,source="$(pwd)"/target,target=/app \ nginx:latest
$ docker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app \ nginx:latest
使用docker inspect devtest
驗(yàn)證綁定安裝正確創(chuàng)建。尋找Mounts
部分:
"Mounts": [ { "Type": "bind", "Source": "/tmp/source/target", "Destination": "/app", "Mode": "", "RW": true, "Propagation": "rprivate" }],
這表明掛載是一個(gè)bind
掛載,它顯示了正確的源和目標(biāo),它顯示掛載是可讀寫(xiě)的,并且傳播設(shè)置為rprivate
。
停止容器:
$ docker container stop devtest $ docker container rm devtest
如果將綁定掛載到容器上的非空目錄中,則該目錄的現(xiàn)有內(nèi)容將被綁定掛載隱藏。這可能是有益的,例如,當(dāng)您想要測(cè)試新版本的應(yīng)用程序而無(wú)需構(gòu)建新映像時(shí)。然而,這也可能令人驚訝,并且這種行為不同于docker卷的行為。
這個(gè)例子被認(rèn)為是極端的,但會(huì)將容器/usr/
目錄的內(nèi)容替換/tmp/
為主機(jī)上的/tmp/
目錄。在大多數(shù)情況下,這會(huì)導(dǎo)致無(wú)法正常工作的容器。
--mount
和-v
的示例,最后的結(jié)果是一樣的。
--mount
-v
$ docker run -d \ -it \ --name broken-container \ --mount type=bind,source=/tmp,target=/usr \ nginx:latest docker: Error response from daemon: oci runtime error: container_linux.go:262:starting container process caused "exec: \"nginx\": executable file not found in $PATH".
$ docker run -d \ -it \ --name broken-container \ -v /tmp:/usr \ nginx:latest docker: Error response from daemon: oci runtime error: container_linux.go:262:starting container process caused "exec: \"nginx\": executable file not found in $PATH".
該容器已創(chuàng)建但未啟動(dòng)。去掉它:
$ docker container rm broken-container
對(duì)于某些開(kāi)發(fā)應(yīng)用程序,容器能夠?qū)懭虢壎ò惭b非常有用,以便將更改傳播回 Docker 主機(jī)。在其他時(shí)候,容器應(yīng)該只能讀取數(shù)據(jù)而不能修改它。
此示例修改上面的示例,但通過(guò)在容器中的裝入點(diǎn)之后添加ro
選項(xiàng)列表(默認(rèn)為空),將目錄裝載為只讀綁定裝入。如果存在多個(gè)選項(xiàng),請(qǐng)用逗號(hào)分隔它們。
--mount
和-v
的實(shí)例有同樣的結(jié)果。
--mount
-v
$ docker run -d \ -it \ --name devtest \ --mount type=bind,source="$(pwd)"/target,target=/app,readonly \ nginx:latest
$ docker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app:ro \ nginx:latest
使用docker inspect devtest
驗(yàn)證綁定安裝正確創(chuàng)建。尋找Mounts
部分:
"Mounts": [ { "Type": "bind", "Source": "/tmp/source/target", "Destination": "/app", "Mode": "ro", "RW": false, "Propagation": "rprivate" }],
停止容器:
$ docker container stop devtest $ docker container rm devtest
綁定傳播默認(rèn)rprivate
為綁定安裝和卷。它只能配置綁定掛載,并且只能在 Linux 主機(jī)上配置。綁定傳播是一個(gè)高級(jí)話題,許多用戶從不需要配置它。
綁定傳播是指在給定的綁定掛載或命名卷中創(chuàng)建的掛載是否可以傳播到該掛載的副本??紤]一個(gè)掛載點(diǎn)/mnt
,它也被掛載/tmp
。傳播設(shè)置控制是否掛載/tmp/a
也可用/mnt/a
。每個(gè)傳播設(shè)置都有一個(gè)遞歸對(duì)應(yīng)點(diǎn)。在遞歸的情況下,考慮/tmp/a
也被掛載為/foo
。傳播設(shè)置控制是否/mnt/a
和/或/tmp/a
將存在。
傳播設(shè)置 | 描述 |
---|---|
shared | 原始安裝的子安裝會(huì)暴露給副本安裝,并且副安裝的子安裝也會(huì)傳播到原始安裝。 |
slave | 類(lèi)似于共享安裝,但僅限于一個(gè)方向。如果原始安裝展示了一個(gè)子安裝,則副本安裝可以看到它。但是,如果副本安裝公開(kāi)了子安裝,則原始安裝無(wú)法看到它。 |
private | 該掛載是私人的。其中的子安裝不會(huì)暴露給副本安裝,并且副安裝的子安裝不會(huì)暴露給原始安裝。 |
rshared | 與共享相同,但傳播也擴(kuò)展到嵌套在任何原始或副本裝入點(diǎn)內(nèi)的掛載點(diǎn)。 |
rslave | 與從屬設(shè)備相同,但傳播還擴(kuò)展到嵌套在任何原始或副本安裝點(diǎn)內(nèi)的掛載點(diǎn)。 |
rprivate | 默認(rèn)值。與私有相同,這意味著原始或副本安裝點(diǎn)內(nèi)的任何位置的安裝點(diǎn)都不會(huì)沿任一方向傳播。 |
在可以在安裝點(diǎn)上設(shè)置綁定傳播之前,主機(jī)文件系統(tǒng)需要已經(jīng)支持綁定傳播。
有關(guān)綁定傳播的更多信息,請(qǐng)參閱共享子樹(shù)的 Linux 內(nèi)核文檔。
以下示例將target/
目錄裝入容器兩次,第二個(gè)裝入設(shè)置ro
選項(xiàng)和rslave
綁定傳播選項(xiàng)。
--mount
和-v
實(shí)例有同樣的結(jié)果。
--mount
-v
$ docker run -d \ -it \ --name devtest \ --mount type=bind,source="$(pwd)"/target,target=/app \ --mount type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave \ nginx:latest
$ docker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app \ -v "$(pwd)"/target:/app2:ro,rslave \ nginx:latest
現(xiàn)在如果你創(chuàng)建/app/foo/
,/app2/foo/
也會(huì)存在。
如果您使用selinux
,您可以添加z
或Z
選項(xiàng)來(lái)修改正在裝入容器的主機(jī)文件或目錄的 selinux 標(biāo)簽。這會(huì)影響主機(jī)本身的文件或目錄,并可能導(dǎo)致 Docker 范圍之外的后果。
該z
選項(xiàng)指示綁定安裝內(nèi)容在多個(gè)容器之間共享。
該Z
選項(xiàng)指示綁定安裝內(nèi)容是私有的和未共享的。
使用極端謹(jǐn)慎使用這些選項(xiàng)。綁定系統(tǒng)目錄(例如/home
或/usr
帶有Z
選項(xiàng))會(huì)導(dǎo)致主機(jī)無(wú)法操作,您可能需要手動(dòng)重新標(biāo)記主機(jī)文件。
此示例設(shè)置z
選項(xiàng)以指定多個(gè)容器可以共享綁定掛載的內(nèi)容:
使用--mount
標(biāo)志不可能修改 selinux 標(biāo)簽。
$ docker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app:z \ nginx:latest
Docker for Mac 用于osxfs
將從macOS共享的目錄和文件傳播到 Linux VM。這種傳播使這些目錄和文件可用于在 Docker for Mac 上運(yùn)行的 Docker 容器。
默認(rèn)情況下,這些共享是完全一致的,這意味著每次在 macOS 主機(jī)上發(fā)生寫(xiě)入或通過(guò)容器中的掛載時(shí),都會(huì)將更改刷新到磁盤(pán),以便共享中的所有參與者都具有完全一致的視圖。在某些情況下,完全一致可能會(huì)嚴(yán)重影響性能。Docker 17.05 和更高版本引入了選項(xiàng)來(lái)調(diào)整每個(gè)安裝,每個(gè)容器的一致性設(shè)置。以下選項(xiàng)可用:
consistent
或者default
:完全一致的默認(rèn)設(shè)置,如上所述。
delegated
:容器運(yùn)行時(shí)的掛載視圖是權(quán)威的。在容器中進(jìn)行的更新在主機(jī)上可見(jiàn)之前可能會(huì)有延遲。
cached
:macOS 主機(jī)的掛載視圖是權(quán)威的。在主機(jī)上進(jìn)行的更新在容器內(nèi)可見(jiàn)之前可能會(huì)有延遲。
這些選項(xiàng)在除 macOS 之外的所有主機(jī)操作系統(tǒng)上完全忽略。
--mount
和-v
實(shí)例有同樣的結(jié)果。
--mount
-v
$ docker run -d \ -it \ --name devtest \ --mount type=bind,source="$(pwd)"/target,destination=/app,consistency=cached \ nginx:latest
$ docker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app:cached \ nginx:latest
了解卷。
了解 tmpfs mounts。
了解存儲(chǔ)驅(qū)動(dòng)程序。