亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

docker 數據卷之進階篇

2024-09-01 13:54:03
字體:
來源:轉載
供稿:網友

筆者在《Docker 基礎 : 數據管理》一文中介紹了 docker 數據卷(volume) 的基本用法。隨著使用的深入,筆者對 docker 數據卷的理解與認識也在不斷的增強。本文將在前文的基礎上介紹 docker 數據卷的原理及一些高級用法。如果您想先了解 docker 數據卷的基本概念與用法,請先移步這里。

為什么需要數據卷?

這得從 docker 容器的文件系統說起。出于效率等一系列原因,docker 容器的文件系統在宿主機上存在的方式很復雜,這會帶來下面幾個問題:

  1. 不能在宿主機上很方便地訪問容器中的文件。
  2. 無法在多個容器之間共享數據。
  3. 當容器刪除時,容器中產生的數據將丟失。

為了解決這些問題,docker 引入了數據卷(volume) 機制。數據卷是存在于一個或多個容器中的特定文件或文件夾,這個文件或文件夾以獨立于 docker 文件系統的形式存在于宿主機中。數據卷的最大特定是:其生存周期獨立于容器的生存周期。

使用數據卷的最佳場景

  1. 在多個容器之間共享數據,多個容器可以同時以只讀或者讀寫的方式掛載同一個數據卷,從而共享數據卷中的數據。
  2. 當宿主機不能保證一定存在某個目錄或一些固定路徑的文件時,使用數據卷可以規避這種限制帶來的問題。
  3. 當你想把容器中的數據存儲在宿主機之外的地方時,比如遠程主機上或云存儲上。
  4. 當你需要把容器數據在不同的宿主機之間備份、恢復或遷移時,數據卷是很好的選擇。

docker volume 子命令

docker 專門提供了 volume 子命令來操作數據卷:
create 創建數據卷
inspect 顯示數據卷的詳細信息
ls 列出所有的數據卷
prune 刪除所有未使用的 volumes,并且有 -f 選項
rm 刪除一個或多個未使用的 volumes,并且有 -f 選項

先創建一個名稱為 hello 的數據卷并通過 ls 命令進行查看:

docker,數據卷

然后可以使用 inspect 命令看看數據卷 hello 的詳細信息:

docker,數據卷

在這里我們可以看到創建數據卷的時間;該數據卷使用的驅動程序為默認的 "local",表示數據卷使用宿主機的本地存儲;數據卷的掛載點,默認是本機 /var/lib/docker/volumes 下的一個目錄。

最后我們可以使用 rm 或 prune 命令刪除數據卷,后面筆者會介紹一些實際使用中與數據卷的刪除有關的一些實踐。

使用 mount 語法掛載數據卷

之前我們使用 --volume(-v) 選項來掛載數據卷,現在 docker 提供了更強大的 --mount 選項來管理數據卷。mount 選項可以通過逗號分隔的多個鍵值對一次提供多個配置項,因此 mount 選項可以提供比 volume 選項更詳細的配置。使用 mount 選項的常用

配置如下:

  1. type 指定掛載方式,我們這里用到的是 volume,其實還可以有 bind 和 tmpfs。
  2. volume-driver 指定掛載數據卷的驅動程序,默認值是 local。
  3. source 指定掛載的源,對于一個命名的數據卷,這里應該指定這個數據卷的名稱。在使用時可以寫 source,也可以簡寫為 src。
  4. destination 指定掛載的數據在容器中的路徑。在使用時可以寫 destination,也可以簡寫為 dst 或 target。
  5. readonly 指定掛載的數據為只讀。
  6. volume-opt 可以指定多次,用來提高更多的 mount 相關的配置。

下面我們看個具體的例子:

$ docker volume create hello$ docker run -id --mount type=volume,source=hello,target=/world ubuntu /bin/bash

我們創建了名稱為 hello 的數據卷,然后把它掛在到容器中的 /world 目錄。通過 inspect 命令查看容器的詳情中的 "Mounts" 信息可以驗證實際的數據卷掛載結果 :

docker,數據卷

使用 volume driver 把數據存儲到其它地方

除了默認的把數據卷中的數據存儲在宿主機,docker 還允許我們通過指定 volume driver 的方式把數據卷中的數據存儲在其它的地方,比如 Azrue Storge 或 AWS 的 S3。

簡單起見,我們接下來的 demo 演示如何通過 vieux/sshfs 驅動把數據卷的存儲在其它的主機上。

docker 默認是不安裝 vieux/sshfs 插件的,我們可以通過下面的命令進行安裝:

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

然后通過 vieux/sshfs 驅動創建數據卷,并指定遠程主機的登錄用戶名、密碼和數據存放目錄:

docker volume create --driver vieux/sshfs / -o sshcmd=nick@10.32.2.134:/home/nick/sshvolume / -o password=yourpassword / mysshvolume

注意,請確保你指定的遠程主機上的掛載點目錄是存在的(demo 中是 /home/nick/sshvolume 目錄),否則在啟動容器時會報錯。
最后在啟動容器時指定掛載這個數據卷:

docker run -id / --name testcon / --mount type=volume,volume-driver=vieux/sshfs,source=mysshvolume,target=/world / ubuntu /bin/bash

這就搞定了,你在容器中 /world 目錄下操作的文件都存儲在遠程主機的 /home/nick/sshvolume 目錄中。進入容器 testcon 然后在 /world 目錄中創建一個文件,然后打開遠程主機的 /home/nick/sshvolume 目錄進行查看,你新建的文件是不是已經出現在那里了!

數據卷原理

下圖描述了 docker 容器掛載數據的三種方式:

docker,數據卷

數據卷是完全被 docker 管理的,就像上圖中的黃色區域描述的一樣,docker 在宿主機的文件系統中找了個文件管理數據卷相關的數據。因此你可能根本不需要知道數據卷文件在宿主機上的存儲位置(事實上抱著刨根問底的精神我們還是很想搞清楚它背后的工作原理!)。

docker 數據卷的本質是容器中的一個特殊目錄。在容器創建的過程中,docker 會將宿主機上的指定目錄(一個以數據卷 ID 為名稱的目錄)掛載到容器中指定的目錄上。這里使用的掛載方式為綁定掛載(bind mount),所以掛載完成后的宿主機目錄和容器內的目標目錄表現一致。

比如我們執行下面的命令創建數據卷 hello,并掛載到容器 testcon 的 /world 目錄:

$ docker volume create hello$ docker run -id --name testcon --mount type=volume,source=hello,target=/world ubuntu /bin/bash

實際上在容器的創建過程中,類似于在容器中執行了下面的代碼:

// 將數據卷 hello 在宿主機上的目錄綁定掛載到 rootfs 中指定的掛載點 /world 上mount("/var/lib/docker/volumes/hello/_data", "rootfs/world", "none", MS_BIND, NULL)

在處理完所有的 mount 操作之后(真正需要 docker 容器掛載的除了數據卷目錄還包括 rootfs,init-layer 里的內容,/proc 設備等),docker 只需要通過 chdir 和 pivot_root 切換進程的根目錄到 rootfs 中,這樣容器內部進程就只能看見以 rootfs 為根的文件系統以及被 mount 到 rootfs 之下的各項目錄了。例如我們啟動的 testcon 中的文件系統為:

docker,數據卷

下面我們介紹幾個數據卷在使用中比較常見的問題。

數據的覆蓋問題

  1. 如果掛載一個空的數據卷到容器中的一個非空目錄中,那么這個目錄下的文件會被復制到數據卷中。
  2. 如果掛載一個非空的數據卷到容器中的一個目錄中,那么容器中的目錄中會顯示數據卷中的數據。如果原來容器中的目錄中有數據,那么這些原始數據會被隱藏掉。

這兩個規則都非常重要,靈活利用第一個規則可以幫助我們初始化數據卷中的內容。掌握第二個規則可以保證掛載數據卷后的數據總是你期望的結果。

在 Dockerfile 中添加數據卷

在 Dockerfile 中我們可以使用 VOLUME 指令向容器添加數據卷:

VOLUME /data

在使用 docker build 命令生成鏡像并且以該鏡像啟動容器時會掛載一個數據卷到 /data 目錄。根據我們已知的數據覆蓋規則,如果鏡像中存在 /data 目錄,這個目錄中的內容將全部被復制到宿主機中對應的目錄中,并且根據容器中的文件設置合適的權限和所有者。

注意,VOLUME 指令不能掛載主機中指定的目錄。這是為了保證 Dockerfile 的可一致性,因為不能保證所有的宿主機都有對應的目錄。

在實際的使用中,這里還有一個陷阱需要大家注意:在 Dockerfile 中使用 VOLUME 指令之后的代碼,如果嘗試對這個數據卷進行修改,這些修改都不會生效!下面是一個這樣的例子:

FROM ubuntuRUN useradd nickVOLUME /dataRUN touch /data/test.txtRUN chown -R nick:nick /data

通過這個 Dockerfile 創建鏡像并啟動容器后,該容器中存在用戶 nick,并且能夠看到 /data 目錄掛載的數據卷。但是 /data 目錄內并沒有文件 test.txt,更別說 test.txt 文件的所有者屬性了。要解釋這個現象需要我們了解通過 Dockerfile 創建鏡像的過程:

Dockerfile 中除了 FROM 指令的每一行都是基于上一行生成的臨時鏡像運行一個容器,執行一條指令并執行類似 docker commit 的命令得到一個新的鏡像。這條類似 docker commit 的命令不會對掛載的數據卷進行保存。

所以上面的 Dockerfile 最后兩行執行時,都會在一個臨時的容器上掛載 /data,并對這個臨時的數據卷進行操作,但是這一行指令執行并提交后,這個臨時的數據卷并沒有被保存。因而我們最終通過鏡像創建的容器所掛載的數據卷是沒有被最后兩條指令操作過的。我們姑且叫它 "Dockerfile 中數據卷的初始化問題"。

下面的寫法可以解決 Dockerfile 中數據卷的初始化問題:

FROM ubuntuRUN useradd nickRUN mkdir /data && touch /data/test.txtRUN chown -R nick:nick /dataVOLUME /data

通過這個 Dockerfile 創建鏡像并啟動容器后,數據卷的初始化是符合預期的。這是由于在掛載數據卷時,/data 已經存在,/data 中的文件以及它們的權限和所有者設置會被復制到數據卷中。

還有另外一種方法可以解決 Dockerfile 中數據卷的初始化問題。就是利用 CMD 指令和 ENTRYPOINT 指令的執行特點:與 RUN 指令在鏡像構建過程中執行不同,CMD 指令和 ENTRYPOINT 指令是在容器啟動時執行。因此使用下面的 Dockerfile 也可以達到對數據卷的初始化目的:

FROM ubuntuRUN useradd nickVOLUME /dataCMD touch /data/test.txt && chown -R nick:nick /data && /bin/bash

總結

數據卷解決了用戶數據的持久化問題,能夠讓用戶在容器中產生的數據超出容器自身的生命周期。因此對于容器技術來說掌握數據卷的使用非常必要。希望本文能夠幫助您理解數據卷相關的內容。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到服務器教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产噜噜噜噜久久久久久久久| 国产日韩精品视频| 欧美国产亚洲视频| 国产在线观看精品一区二区三区| 一区二区成人精品| 日本国产高清不卡| 国产精品免费电影| 九九视频直播综合网| 亚洲精品日产aⅴ| 91国内在线视频| 欧美一区二区.| 欧美精品久久久久| 久久激情视频久久| 中文字幕最新精品| 日本午夜人人精品| 久久久成人的性感天堂| 欧美成在线视频| 久久久久久网站| 亚洲成人教育av| 色偷偷偷亚洲综合网另类| 久久精品久久久久久| 中文字幕亚洲欧美日韩在线不卡| 最好看的2019年中文视频| 欧美性猛交xxxx乱大交| 欧美老女人www| 国产日韩在线亚洲字幕中文| 亚洲iv一区二区三区| 亚洲色图18p| 日韩在线视频一区| 岛国av一区二区三区| 国内精品模特av私拍在线观看| 日韩中文字幕亚洲| 日韩欧美999| 琪琪亚洲精品午夜在线| 欧美激情区在线播放| 日韩欧美国产高清91| 国产精品久久久久一区二区| 国产精品久久久久久久久久小说| 久久久精品在线观看| 国产精品美女主播| 日韩av电影手机在线| 自拍偷拍亚洲区| 亚洲精品日韩av| 韩国视频理论视频久久| 亚洲欧洲午夜一线一品| 国产日韩在线播放| 性欧美在线看片a免费观看| 国产精品久久一区主播| 777精品视频| 综合av色偷偷网| 最新国产精品拍自在线播放| 日韩在线视频二区| 91最新在线免费观看| 亚洲精品视频在线播放| 国产精欧美一区二区三区| 亚洲第一黄色网| 琪琪亚洲精品午夜在线| 亚洲天堂网站在线观看视频| 久久精品视频一| 久久99久国产精品黄毛片入口| 精品久久久久久久久久久久| 国产免费观看久久黄| 538国产精品一区二区免费视频| 日本sm极度另类视频| 伊人久久综合97精品| 国产亚洲欧美一区| 亚洲免费av电影| 日韩在线观看网站| 在线日韩日本国产亚洲| 国产精品美女久久| 国产精品永久免费在线| 国产精品第1页| 国产精品视频久久久| 亚洲2020天天堂在线观看| 久久久精品影院| 欧美成人亚洲成人日韩成人| 高清欧美性猛交xxxx| 亚洲精品日韩激情在线电影| 欧美在线免费观看| 亚洲自拍偷拍福利| 国产精品久久久久久久久久| 中文字幕日韩免费视频| 亚洲精品福利在线| 91国产中文字幕| 国产在线a不卡| 久久亚洲精品小早川怜子66| 国产欧美一区二区| 疯狂欧美牲乱大交777| 欧美激情第三页| 亚洲一区二区精品| 国产精品美女在线| 美女福利视频一区| 亚洲黄色成人网| 91日本视频在线| 午夜欧美大片免费观看| 亚洲一级黄色av| 亚洲视频电影图片偷拍一区| 一区二区在线视频| 国产综合久久久久久| 欧美午夜精品伦理| 在线成人中文字幕| 亚洲成色999久久网站| 97精品一区二区三区| 91在线国产电影| 亚洲一区美女视频在线观看免费| 欧美国产日韩视频| 欧美日韩999| 国产不卡在线观看| 久久久久久久久久久亚洲| 日韩免费观看视频| 久久精品国产成人| 国产91精品久久久久| 成人av在线网址| 亚洲欧美日韩国产中文| 色琪琪综合男人的天堂aⅴ视频| 国产亚洲欧美视频| 热99在线视频| 国产欧美精品va在线观看| 国产精品老女人视频| 91免费视频国产| 91沈先生作品| 日韩精品欧美激情| 一区二区三区国产在线观看| 精品视频—区二区三区免费| 国产欧美韩国高清| 亚洲福利在线视频| 欧美午夜久久久| 亚洲香蕉av在线一区二区三区| 亚洲欧美色婷婷| 日韩一级裸体免费视频| 久久久久久久国产精品| 精品久久久久国产| 国产69精品久久久久9| 亚洲精品美女免费| 久久精品视频中文字幕| 午夜精品久久久久久久99热| 综合网日日天干夜夜久久| 日本伊人精品一区二区三区介绍| 日本一欧美一欧美一亚洲视频| 国产免费一区二区三区在线能观看| 97视频在线观看视频免费视频| 欧美高清在线观看| 丁香五六月婷婷久久激情| 日韩电视剧免费观看网站| 国产精品久久久久久久久久久久| 日韩av在线播放资源| 日韩少妇与小伙激情| 日韩中文在线中文网三级| 欧美有码在线观看视频| 久久天天躁日日躁| 国产精品嫩草影院一区二区| 欧美大片第1页| 日韩日本欧美亚洲| 91网站在线看| 亚洲欧美日韩精品久久奇米色影视| 欧美肥老太性生活视频| 国产国语videosex另类| 欧美老妇交乱视频| 日韩成人av在线| 97热在线精品视频在线观看| 国产伦精品一区二区三区精品视频| www.亚洲成人| 一夜七次郎国产精品亚洲| 国产精品成人国产乱一区|