Docker中的容器數(shù)據(jù)持久化問題
Docker容器數(shù)據(jù)持久化
參考:https://docs.docker.com/storage/
默認(rèn)情況下,container內(nèi)部新創(chuàng)建文件或者修改文件,結(jié)果會(huì)保存在container的可讀寫層中,這意味著:
- 當(dāng)container消失時(shí),與container一體的可讀寫層也一并消失,數(shù)據(jù)并沒有持久化。并且,當(dāng)一個(gè)container需要其它c(diǎn)ontainer中可讀寫層的數(shù)據(jù)時(shí),取出操作非常困難。
- container的可讀寫層與宿主機(jī)的文件系統(tǒng)緊密結(jié)合,很難將它從一臺(tái)宿主機(jī)遷移到其它宿主機(jī)。
- container的可讀寫層,低下需要一個(gè)實(shí)現(xiàn)聯(lián)合文件系統(tǒng)的storage driver,與直接在宿主機(jī)文件系統(tǒng)中讀寫數(shù)據(jù)相比效率要低。
如果打算將數(shù)據(jù)持久化在宿主機(jī)的文件系統(tǒng)中,docker提供至少兩個(gè)選項(xiàng):volumes與bind mounts,如果docker運(yùn)行在Linux操作系統(tǒng)中,還可以使用tmpfs .mount。
選擇正確的mount類型
無論你選擇那種mount類型,從container內(nèi)部看沒有區(qū)別,它們都是目錄或者文件。數(shù)據(jù)都是寄存在宿主機(jī)上,只不過具體位置有所區(qū)別,如下:
- bind mount:將宿主機(jī)中的文件、目錄mount到容器上。其上的數(shù)據(jù)可以被宿主機(jī)讀寫,可以被mount它的所有容器讀寫。
- volume:volume由docker管理,比如創(chuàng)建、刪除什么的。默認(rèn)情況下,volume的存儲(chǔ)空間來自于宿主機(jī)文件系統(tǒng)中的某個(gè)目錄,如/var/lib/docker/volumes/,docker系統(tǒng)這外的程序不應(yīng)該修改其中的數(shù)據(jù)。volume是官方推薦的持久化方案。
- tmpfs mount:tmpfs類型文件與普通文件的區(qū)別是只存在于宿主機(jī)內(nèi)存中,不會(huì)持久化。
有關(guān)掛載類型的更多詳細(xì)信息
volumes:由docker負(fù)責(zé)創(chuàng)建、管理。用戶可以顯式的調(diào)用命令docker volume create創(chuàng)建volume,也可以通過container、service的啟動(dòng)隱式創(chuàng)建。
- 默認(rèn)情況下創(chuàng)建的volume本質(zhì)上還是宿主機(jī)文件系統(tǒng)中的一個(gè)目錄,與普通目錄無本質(zhì)區(qū)別。一個(gè)volume可以同時(shí)供多個(gè)container使用,如果沒有container使用volume,它不會(huì)自動(dòng)刪除,用戶需運(yùn)行docker volume prune明確刪除它。
- 如果用戶顯式創(chuàng)建volume則需要給它指定一個(gè)名稱,如果是隱式創(chuàng)建volume則docker會(huì)自動(dòng)為它分配一個(gè)在宿主機(jī)范圍內(nèi)唯一的名字。
- 通過使用第三方提供的volume driver,用戶可以將數(shù)據(jù)持久到遠(yuǎn)程主機(jī)或者云存儲(chǔ)中,也就是說存儲(chǔ)空間可以不由宿主機(jī)提供。
bind mount:本質(zhì)上是宿主機(jī)、container之間共享宿主機(jī)文件系統(tǒng)。這種持久化方法更導(dǎo)致container與宿主機(jī)的耦合過于緊密,所以不推薦使用。
tmpfs mount:有特定的應(yīng)用場(chǎng)景。比如docker可將用戶名與密碼等敏感數(shù)據(jù)保存在某個(gè)數(shù)據(jù)庫中,當(dāng)啟動(dòng)需要訪問這些敏感數(shù)據(jù)的container或者service時(shí),docker會(huì)在宿主機(jī)上創(chuàng)建一個(gè)tmpfs,然后將敏感數(shù)據(jù)從數(shù)據(jù)庫讀出寫到tmpfs中,再將tmpfs mount到container中,安樣能保證數(shù)據(jù)安全。當(dāng)容器停止運(yùn)行時(shí),則相應(yīng)的tmpfs也從系統(tǒng)中刪除。
在創(chuàng)建容器時(shí),bind mount與volume兩種方式使用的選項(xiàng)相同,都是-v或者--volume,而實(shí)際上在語法上有明顯的區(qū)別。tmpfs通過--tmpfs選項(xiàng)實(shí)現(xiàn)??傊谂f版本的docker中,這一塊的語法有點(diǎn)混亂,從docker17.0.6開始,推薦使用新選項(xiàng)--mount,它要清晰的多。
volume適用場(chǎng)景
- 多個(gè)容器這間共享數(shù)據(jù)
- 宿主機(jī)不保證存在固定的目錄結(jié)構(gòu)
- 持久化數(shù)據(jù)到遠(yuǎn)程主機(jī)或者云存儲(chǔ)而非本地
- 需要備份、遷移、合并數(shù)據(jù)時(shí)。停止container,將volume整體復(fù)制,用于備份、遷移、合并等。
bind mount適用場(chǎng)景
- container共享宿主機(jī)配置文件。比如docker會(huì)將宿主機(jī)文件/etc/resov.conf文件bind mount到容器上,兩者會(huì)使用相同的DNS服務(wù)器。
- 開發(fā)環(huán)境中宿主機(jī)與container之間共享源代碼、構(gòu)建構(gòu)件等。比如將整個(gè)build過程container化,將宿主機(jī)上的源代碼文件夾bind mount到build container中。修改代碼后,運(yùn)行build container的build命令,build container則將build結(jié)構(gòu)寫入另一個(gè)bind mount的文件夾中。
- 一些監(jiān)控類container,通過讀取宿主機(jī)固定文件中的數(shù)據(jù)實(shí)現(xiàn)監(jiān)控等。
使用bind mount與volume的提示
- 如果將空volume掛載到container上的某個(gè)目錄,此目錄下原來的文件與子目錄會(huì)復(fù)制到空volume中。
- 如果bind mount一個(gè)非空目錄或者文件,或者非空volume,則container目錄中的原始內(nèi)容將被遮蔽,當(dāng)解決掛載時(shí)則自動(dòng)恢復(fù)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker daemon 無法啟動(dòng): does not match with stored UUID錯(cuò)誤解決辦法
這篇文章主要介紹了Docker daemon 無法啟動(dòng): does not match with stored UUID錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2016-11-11
詳解Docker 容器跨主機(jī)多網(wǎng)段通信解決方案
這篇文章主要介紹了Docker 容器跨主機(jī)多網(wǎng)段通信解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
docker啟動(dòng)容器服務(wù)后訪問失敗的解決方案
初學(xué)Docker容器的基本操作,拉取了tomcat鏡像,輸入運(yùn)行容器命令運(yùn)行容器一系列操作都沒有問題,但是在瀏覽器訪問端口時(shí)卻訪問不到,下面這篇文章主要給大家介紹了關(guān)于docker啟動(dòng)容器服務(wù)后訪問失敗的解決方案,需要的朋友可以參考下2023-05-05
云原生使用Docker部署mysql數(shù)據(jù)庫的詳細(xì)過程
使用docker部署mysql,可以省去mysql的安裝配置過程,而且不限制數(shù)量,即起即用,下面這篇文章主要給大家介紹了關(guān)于云原生使用Docker部署mysql數(shù)據(jù)庫的詳細(xì)過程,需要的朋友可以參考下2023-03-03
Linux/Docker 中使用 System.Drawing.Common 踩坑記錄分享
這篇文章主要介紹了Linux/Docker 中使用 System.Drawing.Common 踩坑記錄,本文通過兩種方案給大家詳細(xì)介紹,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Docker容器名稱沖突錯(cuò)誤的原因分析和有效解決方案
這篇文章主要介紹了Docker容器名稱沖突的問題,分析了錯(cuò)誤發(fā)生的原因,并提供了幾種解決方案:刪除現(xiàn)有容器、重命名容器、使用不同名稱創(chuàng)建新容器,以及更新現(xiàn)有容器的重啟策略,文章還推薦了預(yù)防措施,需要的朋友可以參考下2025-10-10

