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

