?
This document uses PHP Chinese website manual Release
可以將數(shù)據(jù)存儲(chǔ)在容器的可寫(xiě)層中,但有一些缺點(diǎn):
當(dāng)容器不再運(yùn)行時(shí),數(shù)據(jù)將不會(huì)持續(xù)存在,并且如果其他進(jìn)程需要數(shù)據(jù),則很難從容器中獲取數(shù)據(jù)。
容器的可寫(xiě)層緊密耦合到容器運(yùn)行的主機(jī)。您無(wú)法輕松地將數(shù)據(jù)移到其他地方。
寫(xiě)入容器的可寫(xiě)層需要存儲(chǔ)驅(qū)動(dòng)程序來(lái)管理文件系統(tǒng)。存儲(chǔ)驅(qū)動(dòng)程序使用Linux內(nèi)核提供聯(lián)合文件系統(tǒng)。與使用數(shù)據(jù)體積直接寫(xiě)入主機(jī)文件系統(tǒng)。
Docker提供了三種不同的方式將數(shù)據(jù)從Docker主機(jī)裝載到容器中:卷,綁定掛載或tmpfs
卷。如有疑問(wèn),卷幾乎總是正確的選擇。請(qǐng)繼續(xù)閱讀以獲取更多關(guān)于將數(shù)據(jù)安裝到容器中的機(jī)制的信息。
無(wú)論您選擇使用哪種類型的掛載,容器中的數(shù)據(jù)看起來(lái)都是一樣的。它被公開(kāi)為容器文件系統(tǒng)中的目錄或單個(gè)文件。
一個(gè)簡(jiǎn)單的方法來(lái)顯示卷之間的差異,綁定掛載和tmpfs
掛載是考慮數(shù)據(jù)在Docker主機(jī)上的位置。
Volumes存儲(chǔ)在由Docker管理的主機(jī)文件系統(tǒng)的一部分中(/var/lib/docker/volumes/
在Linux上)。非Docker進(jìn)程不應(yīng)該修改這部分文件系統(tǒng)。卷是在Docker中保留數(shù)據(jù)的最佳方式。
綁定安裝可以存儲(chǔ)在主機(jī)系統(tǒng)的任何位置。他們甚至可能是重要的系統(tǒng)文件或目錄。Docker主機(jī)或Docker容器上的非Docker進(jìn)程可以隨時(shí)修改它們。
tmpfs
裝載僅存儲(chǔ)在主機(jī)系統(tǒng)的內(nèi)存中,而不會(huì)寫(xiě)入主機(jī)系統(tǒng)的文件系統(tǒng)。有關(guān)裝載類型的更多詳細(xì)信息
Volumes:由Docker創(chuàng)建和管理。您可以使用該docker volume create
命令顯式創(chuàng)建一個(gè)卷,或者在創(chuàng)建容器或服務(wù)期間Docker可以創(chuàng)建一個(gè)卷。
創(chuàng)建卷時(shí),它將存儲(chǔ)在Docker主機(jī)的一個(gè)目錄中。將卷裝入容器時(shí),此目錄是裝入容器的內(nèi)容。這與綁定掛載的工作方式類似,區(qū)別在于卷由Docker管理,并與主機(jī)的核心功能隔離。
給定的體積可以同時(shí)安裝到多個(gè)容器中。當(dāng)沒(méi)有正在運(yùn)行的容器正在使用卷時(shí),該卷仍然可用于Docker,并且不會(huì)自動(dòng)刪除。您可以使用docker volume prune
刪除未使用的卷。
在安裝卷時(shí),可能會(huì)命名或匿名。首次將匿名卷掛載到容器時(shí),匿名卷沒(méi)有被賦予明確的名稱,因此Docker會(huì)為它們提供一個(gè)隨機(jī)名稱,該名稱在給定的Docker主機(jī)中保證是唯一的。除名稱外,命名和匿名卷的行為方式相同。
卷還支持使用卷驅(qū)動(dòng)程序,這些卷驅(qū)動(dòng)程序可讓您將數(shù)據(jù)存儲(chǔ)在遠(yuǎn)程主機(jī)或云提供程序中,以及其他可能性。
綁定裝載:自Docker早期開(kāi)始提供。與卷相比,綁定安裝具有有限的功能。當(dāng)您使用綁定掛載時(shí),主機(jī)上的文件或目錄被掛載到容器中。文件或目錄由主機(jī)上的完整路徑引用。該文件或目錄不需要已經(jīng)存在于Docker主機(jī)上。如果它尚不存在,它會(huì)根據(jù)需求創(chuàng)建。綁定掛載非常高效,但它們依賴于具有特定目錄結(jié)構(gòu)的主機(jī)的文件系統(tǒng)。如果您正在開(kāi)發(fā)新的Docker應(yīng)用程序,請(qǐng)考慮使用命名卷。您不能使用Docker CLI命令直接管理綁定掛載。 警告:無(wú)論好壞,使用綁定掛載的一個(gè)副作用是您可以通過(guò)容器中運(yùn)行的進(jìn)程更改主機(jī)文件系統(tǒng),包括創(chuàng)建,修改或刪除重要的系統(tǒng)文件或目錄。這是一個(gè)強(qiáng)大的能力,可能會(huì)對(duì)安全產(chǎn)生影響,包括影響主機(jī)系統(tǒng)上的非Docker進(jìn)程。
tmpfs掛載:tmpfs
在Docker主機(jī)上或容器中,掛載不會(huì)永久保存在磁盤(pán)上。它可以在容器的生命周期內(nèi)由容器使用,以存儲(chǔ)非持久狀態(tài)或敏感信息。例如,在內(nèi)部,群集服務(wù)使用tmpfs
掛載將秘密裝入服務(wù)的容器中。
使用-v
or --volume
標(biāo)志可將綁定掛載和卷掛載到容器中,但每種語(yǔ)法的語(yǔ)法稍有不同。對(duì)于tmpfs
坐騎,您可以使用該--tmpfs
標(biāo)志。但是,在Docker 17.06及更高版本中,我們建議將--mount
容器和服務(wù)的標(biāo)志用于綁定掛載,卷或tmpfs
掛載,因?yàn)檎Z(yǔ)法更清晰。
volumes是在Docker容器和服務(wù)中保持?jǐn)?shù)據(jù)的首選方式。volumes
的一些用例包括:
在多個(gè)運(yùn)行容器之間共享數(shù)據(jù)。如果您沒(méi)有明確創(chuàng)建它,則會(huì)在第一次將其裝入容器時(shí)創(chuàng)建volumes。當(dāng)該容器停止或被移除時(shí),該volumes仍然存在。多個(gè)容器可以同時(shí)安裝相同的卷,無(wú)論是讀寫(xiě)還是只讀。僅當(dāng)您明確刪除volumes時(shí)才會(huì)刪除volumes。
當(dāng)不能保證Docker主機(jī)具有給定的目錄或文件結(jié)構(gòu)時(shí)。卷幫助您將Docker主機(jī)的配置與容器運(yùn)行時(shí)分離開(kāi)來(lái)。
當(dāng)您想要將容器的數(shù)據(jù)存儲(chǔ)在遠(yuǎn)程主機(jī)或云提供商上而不是本地時(shí)。
當(dāng)需要備份,還原或?qū)?shù)據(jù)從一臺(tái)Docker主機(jī)遷移到另一臺(tái)時(shí),卷是更好的選擇。您可以使用卷停止容器,然后備份卷的目錄(如/var/lib/docker/volumes/<volume-name>
)。
通常,您應(yīng)該在可能的情況下使用volumes。綁定掛載適用于以下類型的用例:
將配置文件從主機(jī)共享到容器。這就是Docker默認(rèn)情況下通過(guò)掛載向容器提供dns解析的方式。/etc/resolv.conf
從主機(jī)進(jìn)入每個(gè)容器。
在Docker主機(jī)上的開(kāi)發(fā)環(huán)境和容器之間共享源代碼或構(gòu)建構(gòu)件。例如,您可以掛載一個(gè)Maventarget/
目錄到容器中,每次在Docker主機(jī)上構(gòu)建Maven項(xiàng)目時(shí),容器都可以訪問(wèn)重建的工件。
如果您以這種方式使用Docker進(jìn)行開(kāi)發(fā),那么生產(chǎn)Dockerfile將直接將生產(chǎn)準(zhǔn)備好的工件復(fù)制到映像中,而不是依賴綁定掛載。
當(dāng)Docker主機(jī)的文件或目錄結(jié)構(gòu)保證與容器需要的綁定安裝一致tmpfs
時(shí)。對(duì)于不希望數(shù)據(jù)保存在主機(jī)上的情況,最好使用tmpfs安裝掛載的良好用例,或者在容器內(nèi)。這可能出于安全原因,或者在應(yīng)用程序需要編寫(xiě)大量非持久狀態(tài)數(shù)據(jù)時(shí)保護(hù)容器的性能。使用綁定掛載或卷的提示如果使用綁定掛載或卷,請(qǐng)記住以下幾點(diǎn):
如果容器的映像在裝入點(diǎn)包含數(shù)據(jù),則該數(shù)據(jù)將傳播到綁定裝入或卷。這是預(yù)先填充Docker主機(jī)需要的數(shù)據(jù)(在綁定掛載的情況下)或另一個(gè)容器需要(對(duì)于卷的情況)的好方法。
如果您將綁定掛載或卷掛載到已經(jīng)寫(xiě)入文件或目錄的容器中的某個(gè)目錄中,則這些文件或目錄會(huì)被掛載遮擋,就像您將文件保存到/mnt
Linux主機(jī)中一樣,然后掛載USB開(kāi)車(chē)進(jìn)入/mnt
。/mnt
在USB驅(qū)動(dòng)器卸下之前,內(nèi)容將被USB驅(qū)動(dòng)器的內(nèi)容遮蓋。接下來(lái)的步驟為
詳細(xì)了解volumes。
了解有關(guān)綁定掛載的更多信息。
了解關(guān)于tmpfs裝載的更多信息。
了解更多關(guān)于存儲(chǔ)驅(qū)動(dòng)程序,它們與綁定掛載或卷無(wú)關(guān),但允許您將數(shù)據(jù)存儲(chǔ)在容器的可寫(xiě)層中。