Docker 數據持久化的三種方案

容器中的數據可以存儲在容器層。但是將數據存放在容器層存在以下問題:

  • 數據不是持久化。意思是如果容器刪除了,這些數據也就沒了

  • 主機上的其它進程不方便訪問這些數據

  • 對這些數據的I/O會經過存儲驅動,然后到達主機,引入了一層間接層,因此性能會有所下降

Docker 提供了3種持久化數據的方式:

  1. volumes:存于主機文件系統中的某個區域,由Docker管理(/var/lib/docker/volumes/ on linux)。非Docker進程不應該修改這些數據。卷是Docker中持久化數據的最好方式

  2. bind mount:存于主機文件系統中的任意位置。非Docker進程可以修改這些數據

  3. tmpfs mount(Linux中):存于內存中(注意,并不是持久化到磁盤)。在容器的生命周期中,它能被容器用來存放非持久化的狀態或敏感信息

    ?

圖片

volumes

如果沒有顯式創建,一個卷會在最開始掛載時被創建。當容器停止時,卷仍然存在。多個容器可以通過read-write或read-only的方式使用同一個卷。

只有在顯式刪除時,卷才會被刪除。如果將一個空卷掛載到容器中一個存有文件或目錄的目錄中,這些文件或目錄會被拷貝到空卷中;如果將一個非空卷掛載到容器中一個存有文件或目錄的目錄中,這些文件或目錄會被隱藏。

使用

  • 創建:docker volume create

  • 刪除某個卷:docker volume rm 卷名

  • 刪除所有未使用的卷:docker volume prune

  • 列出所有卷:docker volume ls

  • 查看某個卷的信息:docker volume inspect 卷名

  • 掛載到容器:-v--volume。如果是Docker17.06或更高:推薦使用--mount。(同 bind mount)

    • 掛載類型:key為type,value為bind、volume或tmpfs

    • 掛載源:key為source或src,對于命名卷,value為卷名,對于匿名卷,則忽略

    • 容器中的掛載點:key為destination、dst或target,value為容器中的路徑

    • 讀寫類型:value為readonly,沒有key

    • volume-opt選項,可以出現多次。比如volume-driver=local,volume-opt=type=nfs,…

    • 第一個域:對于命名卷,為卷名;匿名卷,則忽略,此時會創建匿名卷

    • 第二個域:容器中的掛載點

    • 第三個域:可選參數,由','隔開,如ro

    • -v或—volume:由3個域組成,’:’分隔

    • —mount:由多個’,’隔開的鍵值對

      =組成:

當使用docker service create?啟動Docker服務時,只支持--mount,不支持-v--volume。并且每個服務容器使用它們各自的本地卷,因此如果使用本地(local)卷驅動,容器無法通過卷共享數據,但是一些卷驅動支持共享存儲。Docker for AWS和Doocker for Azure都使用Cloundstor plugin支持持久存儲

?

場景

  • 多個運行容器間共享數據

  • 當Docker主機不確保具有給定的目錄或文件時。卷可以將容器運行時與Docker主機的配置解耦合

  • 備份、恢復、或將數據從一個Docker主機遷移到另一個Docker主機時

bind mount

主機中的文件或目錄通過全路徑被引用。在使用綁定掛載時,這些目錄或文件不一定要已經存在。

如果使用這種方式將一個目錄掛載到容器中一個存有文件或目錄的目錄中,這些文件或目錄會被隱藏;如果主機中的文件或目錄不存在,當使用--mount掛載時,Docker會報錯,當使用-v--volume時,會在主機上創建目錄

使用

掛載到容器:-v或—volume。如果是Docker17.06或更高:推薦使用—mount。(同 volumes)

  • -v--volume:由3個域組成,':'分隔

    • 第一個域:對于命名卷,為卷名;匿名卷,則忽略,此時會創建匿名卷

    • 第二個域:容器中的掛載點

    • 第三個域:可選參數,由','隔開,如ro

  • --mount:由多個','隔開的鍵值對<key>=<value>組成:

    • 掛載類型:key為type,value為bind、volume或tmpfs

    • 掛載源:key為source或src,value為主機中文件或目錄的路徑

    • 容器中的掛載點:key為destination、dst或target,value為容器中的路徑

    • 讀寫類型:value為readonly,沒有key

    • bind-propagation選項:key為bind-propagation,value為rprivate、private、rshared、shared、rslave或slave

    • 一致性選項:value為consistent、delegated、cached。這個選項僅僅適用于Docker for Mac

    • --mount不支持z和Z(這個不同于-v和—volume)

場景

大體上來說,只要可能,最好使用volumes

  • 主機與容器共享配置文件(Docker默認情況下通過這種方式為容器提供DNS解析,通過將/etc/resolv.conf掛載到容器中)

  • 共享源代碼或build artifacts(比如將Maven的target/目錄掛載到容器中,每次在Docker主機中build Maven工程時,容器能夠訪問到那些rebuilt artifacts)

  • 當 docker主機中的文件或目錄結構和容器需要的一致時

bind propagation

對于bind mount和volumes,默認都是rprivate。只有在使用bind mount時可配置,且必須在linux下。bind propagation是個超前主題,對于大多數用戶來說,并不需要配置

對于一個掛載點/mnt,假設它同時也被掛載到/tmp。bind propagation控制 whether a mount on /tmp/a would also be available on?/mnt/a

圖片

在設置bind propagation之前,主機文件系統需要支持bind propagation

下面的例子將主機中的target/掛載到容器中2次:

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

此時如果創建/app/foo//app2/foo也會存在

selinux label

你能添加zZ選項來修改掛載到容器中的主機文件或目錄的selinux label:

  • z選項指明bind mount的內容在多個容器間是共享的

  • Z選項指明bind mount的內容是私有不共享的

要特別小心的使用這兩個選項。”Bind-mounting a system directory such as?/home?or?/usr?with the?Z?option renders your host machine inoperable and you may need to relabel the host machine files by hand”

tmpfs mount

只在linux中支持

相對于volumes和bind mount,tmpfs mount是臨時的,只在主機內存中持久化。當容器停止,tmpfs mount會被移除。對于臨時存放敏感文件很有用

不同于volumes和bind mount,多個容器無法共享tmpfs mount

使用

  • 掛載到容器:—tmpfs。如果是Docker17.06或更高:推薦使用—mount

    • 掛載類型:key為type,value為bind、volume或tmpfs

    • 容器中的掛載點:key為destination、dst或target,value為容器中的路徑

    • tmpfs-size和tmpfs-mode選項

    • —tmpfs:直接指定容器中的掛載點。不允許指定任何配置選項

    • —mount:由多個’,’隔開的鍵值對

      =組成:

圖片

場景

  • 最好的使用場景是你既不想將數據存于主機,又不想存于容器中時。這可以是出于安全的考慮,或當應用需要寫大量非持久性的狀態數據時為了保護容器的性能

volume drivers

機器間共享數據

當構建錯誤容忍應用時,可能需要配置同一個服務的多個副本來訪問相同的文件:

圖片

有多種方法來實現這個目的:

  • 為應用添加邏輯,將文件存儲到一個云對象存儲系統(如Amazon S3)中

  • 使用一個支持將文件寫入外部存儲系統(如NFS或Amazon S3)的driver來創建卷

volume drivers可以將底層存儲系統從應用邏輯中抽象出來。比如,如果你的服務使用一個具有NFS driver的卷,你能更新你的服務使用不同的driver,作為在云中存儲數據的示例,而不更改應用程序邏輯

使用

在使用docker volume create或驅動容器創建匿名卷時,可以指定一個volume drivers。下面的例子使用vieux/sshfs作為volume drivers

假設有2個節點,第一個節點是Docker主機,它能SSH到第二個節點

1、在Docker主機中,安裝vieux/sshfs插件

docker plugin install --grant-all-permissions vieux/sshfs

2、使用卷驅動創建卷
1)創建命名卷

docker volume create --driver vieux/sshfs \-o sshcmd=test@node2:/home/test \-o password=testpassword \sshvolume

2)啟動容器時使用卷驅動創建匿名卷

docker run -d \--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

3、備份、恢復、遷移數據卷
1)備份一個容器

docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
  • 啟動一個新容器,掛載dbstore容器中的卷

  • 掛載一個本地主機目錄到容器/backup

  • 使用tar將dbdata卷中的數據打包成backup.tar

2)用備份恢復容器
使用剛剛創建的備份來恢復容器:

docker run -v /dbdata --name dbstore2 ubuntu /bin/bash

然后,在新創建的容器的卷中使用tar解包備份的數據:

docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535425.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535425.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535425.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Git 存儲原理及相關實現

Git 是目前最流行的版本控制系統&#xff0c;從本地開發到生產部署&#xff0c;我們每天都在使用 Git 進行我們的版本控制&#xff0c;除了日常使用的命令之外&#xff0c;如果想要對 Git 有更深一步的了解&#xff0c;那么研究下 Git 的底層存儲原理將會對理解 Git 及其使用非…

Git內部原理

Git有什么特點&#xff1f; fast&#xff0c;scalable&#xff0c;distributed revision control system&#xff08;快速&#xff0c;可擴展的分布式版本控制系統&#xff09; 幾乎所有操作都是本地執行 每一個clone都是整個生命周期的完整副本 the stupid content tracker&a…

git存儲原理

四種數據類型 實際上Git基于數據類型的不同&#xff0c;把對象分為四種&#xff1a;數據對象、樹對象、提交對象、標簽對象。Git文件系統的設計思路與linux文件系統相似&#xff0c;即將文件的內容與文件的屬性分開存儲&#xff0c;文件內容以“裝滿字節的袋子”存儲在文件系統…

詳解設計模式:中介者模式

中介者模式&#xff08;Mediator Pattern&#xff09;也被稱為調停者模式&#xff0c;是在 GoF 23 種設計模式中定義了的行為型模式。 中介者模式 是用來降低多個對象和類之間的通信復雜性。這種模式提供了一個中介類&#xff0c;該類通常處理不同類之間的通信&#xff0c;并支…

rebase參數以及注意事項

可以根據需要將pick參數&#xff0c;改變為下面代表不同作用的參數&#xff1b;這樣就可以對節點C和D進行不同的操作了。比如&#xff1a; pick&#xff1a;默認參數&#xff0c;表示不對提交節點進行任何操作&#xff0c;直接應用原提交節點。不創建新提交&#xff1b; rewor…

RPC 服務 與 HTTP 服務的區別

1、什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;—遠程過程調用&#xff0c;它是一種通過網絡從遠程計算機程序上請求服務&#xff0c;而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在&#xff0c;如TCP或UDP&#xff0c;為通信程序之間攜帶信…

Docker 網絡命名空間

Docker 用戶可以通過與 CNM 的 Object 以及 API 的交互來管理對應容器的網絡&#xff0c;下面是一個典型的容器網絡生命周期&#xff1a; 1、Driver要向NetworkController注冊。內置的Driver在Libnetwork內注冊&#xff0c;遠程的Driver則通過Plugin mechanism注冊。每一個Driv…

緩存雪崩、擊穿、穿透解決方案

用戶的數據一般都是存儲于數據庫&#xff0c;數據庫的數據是落在磁盤上的&#xff0c;磁盤的讀寫速度可以說是計算機里最慢的硬件了。 當用戶的請求&#xff0c;都訪問數據庫的話&#xff0c;請求數量一上來&#xff0c;數據庫很容易就奔潰的了&#xff0c;所以為了避免用戶直…

Ansible中的playbook詳解

首先簡單說明一下playbook&#xff0c;playbook是什么呢&#xff1f; 根本上說playbook和shell腳本沒有任何的區別&#xff0c;playbook就像shell一樣&#xff0c;也是把一堆的命令組合起來&#xff0c;然后加入對應條件判斷等等&#xff0c;在shell腳本中是一條一條的命令&am…

【Docker】容器鏡像有哪些特性

首先解釋一下什么是Docker鏡像&#xff1f; Docker鏡像它其實是一個模板&#xff0c;擁有這個模板我們才能創建我們的Docker容器&#xff0c;鏡像里含有啟動 docker 容器所需的文件系統結構及其內容&#xff0c;因此是啟動一個 docker 容器的基礎。docker 鏡像的文件內容以及一…

nginx中的location指令

1、location 介紹 location是Nginx中的塊級指令(block directive)&#xff0c;location指令的功能是用來匹配不同的url請求&#xff0c;進而對請求做不同的處理和響應&#xff0c;這其中較難理解的是多個location的匹配順序&#xff0c;本文會作為重點來解釋和說明。 開始之前…

容器底層實現技術Namespace/Cgroup

Docker容器實現原理 Docker容器在實現上是通過namespace技術來進行進程隔離&#xff0c;通過cgroup技術實現容器進程可用資源的限制&#xff0c;當docker啟動一個容器時&#xff0c;實際是創建了多了namespace參數的進程。 Namespace Namespace&#xff1a;命名空間 作用&#…

身體原因 斷更一周

由于眾所周知的原因&#xff0c;博主最近具有發熱、全身乏力、酸痛、干咳等癥狀&#xff0c;已嚴重影響日常的工作學習和博客編寫&#xff0c;所以斷更我將一周&#xff0c;由下周三&#xff08;即2022年12月21日&#xff09;恢復更新 更多往期內容可以參考&#xff1a;全網最…

異方差與多重共線性對回歸問題的影響

異方差的檢驗 1.異方差的畫圖觀察 2.異方差的假設檢驗&#xff0c;假設檢驗有兩種&#xff0c;一般用懷特檢驗使用方法在ppt中&#xff0c;課程中也有實驗&#xff0c;是一段代碼。 異方差的解決辦法 多重共線性 多重共線性可能帶來的影響&#xff1a; 多重共線性的檢驗 多重…

如何修改Docker的鏡像源

改或新增/etc/docker/daemon.json 文件 vi/etc/docker/daemon.json 添加需要修改的國內鏡像源鏡像源 { "registry-mirrors":["http://hub-mirror.c.163.com"] } 重啟Docker服務 Systemctl restart docker.service 方法二 修改或新增 /etc/sysconfig…

nginx 的 rewrite 模塊

ngxhttprewrite_module 模塊用來使用正則表達式&#xff08;PCRE&#xff09;改變請求的 URI&#xff0c;返回重定向&#xff0c;并有條件地選擇配置。 指令執行順序 首先順序執行 server 塊中的 rewrite 模塊指令&#xff0c;得到 rewrite 后的請求 URI 然后循環執行如下指令…

所有的Python庫

庫名稱簡介 Chardet字符編碼探測器&#xff0c;可以自動檢測文本、網頁、xml的編碼。 colorama主要用來給文本添加各種顏色&#xff0c;并且非常簡單易用。 Prettytable主要用于在終端或瀏覽器端構建格式化的輸出。 difflib&#xff0c;[Python]標準庫&#xff0c;計算文本…

Oracle行轉列語法總結大全

一、decode語法 SELECT deptno, nvl(SUM(decode(job, MANAGER, sal)), 0) s_MANAGER, nvl(SUM(decode(job, ANALYST, sal)), 0) s_ANALYST, nvl(SUM(decode(job, CLERK, sal)), 0) s_CLERK, nvl(SUM(decode(job, PRESIDENT, sal)), 0) s_PRESIDENT, …

Shell 各種符號 之 含義

#!&#xff1a;符號能夠被內核識別成是一個腳本的開始&#xff0c;這一行必須位于腳本的首行 $0&#xff1a;當前腳本的名字 $#&#xff1a;輸入<調用>參數(腳本或函數的位置參數) 的個數&#xff0c;如 NumArg$#&#xff1b;echo"\$#: $#;\$NumArg: $NumArg"…

Nginx的11個執行流程

1 Nginx簡介 Web服務器市場份額 Nginx [engine x] 最初由 Lgor Sysoev 編寫。根據 Netcraft 的數據&#xff0c;到2020年9月&#xff0c;Nginx 服務或代理了25.76&#xff05;站點&#xff0c;市場份額占到了約34.03&#xff05;。 Nginx 被廣泛用作&#xff1a; HTTP服務器…