Docker 容器數據卷

  • 前提

Docker容器產生的數據,若是不經過docker commit生成新的鏡像,使數據作爲鏡像的一部分保存下來,那麼當容器刪除後,數據天然也就沒有了。docker

爲了能保存數據在docker中咱們使用卷。目的就是爲了讓容器內的數據吃持久化.centos

  • 數據卷的介紹

卷就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合文件系統,所以可以繞過Union File System提供一些用於持續存儲或共享數據的特性:卷的設計目的就是數據的持久化,徹底獨立於容器的生存週期,所以Docker不會在容器刪除時刪除其掛載的數據卷bash

特色:

  1. 數據卷可在容器之間共享或重用數據
  2. 卷中的更改能夠直接生效
  3. 數據卷中的更改不會包含在鏡像的更新中
  4. 數據卷的生命週期一直持續到沒有容器使用它爲止
  • 容器內添加數據卷

方法一: 使用 -v 命令

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

效果 :測試

先在宿主機建立host_share目錄ui

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

進入容器內部,發現container_share文件夾成功建立設計

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

檢查數據卷是否掛載成功
# 查看容器內部信息
docker inspect 容器ID

測試數據是否共享

測試容器中止後,主機修改的數據是否同步

  • 方法二: 使用DockerFile添加

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

因爲宿主機目錄是依賴於特定宿主機的,並不可以保證在全部的宿主機上都存在這樣的特定目錄。下面介紹使用 DockerFile 添加數據卷blog

宿主機根目錄下新建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的數據有沒有什麼變化

結論:容器之間配置信息的傳遞,數據卷的生命週期會一直持續到沒有容器使用它爲止

相關文章
相關標籤/搜索