Docker 容器資料卷
- 前提
Docker容器產生的資料,如果不通過docker commit生成新的映象,使資料做為映象的一部分儲存下來,那麼當容器刪除後,資料自然也就沒有了。
為了能儲存資料在docker中我們使用卷。目的就是為了讓容器內的資料吃持久化.
- 資料卷的介紹
卷就是目錄或檔案,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合檔案系統,因此能夠繞過Union File System提供一些用於持續儲存或共享資料的特性:卷的設計目的就是資料的持久化,完全獨立於容器的生存週期,因此Docker不會在容器刪除時刪除其掛載的資料卷
特點:
- 資料卷可在容器之間共享或重用資料
- 卷中的更改可以直接生效
- 資料卷中的更改不會包含在映象的更新中
- 資料卷的生命週期一直持續到沒有容器使用它為止
- 容器內新增資料卷
方法一: 使用 -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的資料有沒有什麼變化
結論:容器之間配置資訊的傳遞,資料卷的生命週期會一直持續到沒有容器使用它