1. 程式人生 > >Docker 容器資料卷

Docker 容器資料卷

  • 前提

Docker容器產生的資料,如果不通過docker commit生成新的映象,使資料做為映象的一部分儲存下來,那麼當容器刪除後,資料自然也就沒有了。

為了能儲存資料在docker中我們使用卷。目的就是為了讓容器內的資料吃持久化.

  • 資料卷的介紹

卷就是目錄或檔案,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合檔案系統,因此能夠繞過Union File System提供一些用於持續儲存或共享資料的特性:卷的設計目的就是資料的持久化,完全獨立於容器的生存週期,因此Docker不會在容器刪除時刪除其掛載的資料卷

特點:

  1. 資料卷可在容器之間共享或重用資料
  2. 卷中的更改可以直接生效
  3. 資料卷中的更改不會包含在映象的更新中
  4. 資料卷的生命週期一直持續到沒有容器使用它為止
  • 容器內新增資料卷

方法一: 使用 -v 命令

# 雙向讀寫許可權
docker run -it -v /宿主機目錄:/容器內目錄 映象名稱
# 宿主機可讀寫,容器只讀
docker run -it -v /宿主機目錄:/容器內目錄:ro 映象名稱

效果 :

先在宿主機建立host_share目錄

# 執行命令 docker run -it -v /宿主機目錄:/容器內目錄 映象名稱
docker run -it -v /host_share:/container_share centos

進入容器內部,發現container_share資料夾成功建立

按Ctrl+P+Q暫時退出容器(容器不關閉)

檢查資料卷是否掛載成功
# 檢視容器內部資訊
docker inspect 容器ID

測試資料是否共享

測試容器停止後,主機修改的資料是否同步

  • 方法二: 使用DockerFile新增

出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。

由於宿主機目錄是依賴於特定宿主機的,並不能夠保證在所有的宿主機上都存在這樣的特定目錄。下面介紹使用 DockerFile 新增資料卷

宿主機根目錄下新建mydocker並進入,新建一個mydockerfile檔案,編輯
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success!"
CMD /bin/bash

VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]通過這種方法可以在容器中新增多個數據卷,對應的宿主機共享地址會預設設定

使用build命令將當前的 mydockerfile 生成映象
# docker build -f DockerFIle絕對路徑 -t 名稱空間/映象名稱 .
# 注意 . 不要忘了
docker build -f /mydocker/mydockerfile -t moti/centos .

執行容器並進入,發現兩個資料卷目錄已經成功建立

Ctrl+P+Q暫時退出(不停止容器),使用docker inspect 容器ID檢視資料卷的相關資訊

紅框勾選的就是在宿主機的對應路徑

測試資料共享是否實現

  • 資料卷容器

命名的容器掛載資料卷,其它容器通過掛載這個(父容器)實現資料共享,掛載資料卷的容器,稱之為資料卷容器

容器之間傳遞資料共享

先建立一個容器c1,在dataVolumeContainer1新增共享資料c1.txt

建立容器c2繼承自c1,檢視 dataVolumeContainer1 裡面的檔案,並在 dataVolumeContainer1 中新增c2.txt

建立容器c3繼承自c1,檢視 dataVolumeContainer1 裡面的檔案,並在 dataVolumeContainer1 中新增c3.txt

刪除c1容器,檢視c2和c3中的檔案是否有變化(原來有c1.txt c2.txt c3.txt共三個檔案)

可以發現,c1刪除,對c2,c3是不影響的,那麼c2與c3會不會共享檔案?

可以看到,儘管c1刪除了但是c2和c3仍然是資料共享的,那麼刪除c2,檢視c3的資料有沒有什麼變化

結論:容器之間配置資訊的傳遞,資料卷的生命週期會一直持續到沒有容器使用它