1. 程式人生 > 其它 >五、Docker入門系列--Docker容器資料卷

五、Docker入門系列--Docker容器資料卷

五、 Docker容器資料卷

一、Docker入門系列--Docker 簡介
二、Docker入門系列--Docker安裝
三、Docker入門系列--Docker常用命令
四、Docker入門系列--Docker映象
五、Docker入門系列--Docker容器資料卷
六、Docker入門系列--DockerFlie解析
七、Docker入門系列--使用DockerFlie自定義Tomcat映象
八、Docker入門系列--Docker常用安裝
九、Docker入門系列--本地映象釋出到阿里雲
十、Docker入門系列--Docker-Compose簡介和安裝
十一、Docker入門系列--Docker-Compose模板命令


十二、Docker入門系列--Docker-Compose常用命令
十三、Docker入門系列--Portainer視覺化Docker
十四、Docker入門系列--Docker搭建部署SpringCloud微服務專案Demo


5.1 容器資料卷簡述

先來看看Docker的理念:

  • 將運用與執行的環境打包形成容器執行 ,執行可以伴隨著容器,但是我們對資料的要求希望是持久化的

  • 容器之間希望有可能共享資料

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

一句話:有點類似我們Redis裡面的rdb和aof檔案。

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

特點:

  • 資料卷可在容器之間共享或重用資料

  • 卷中的更改可以直接生效

  • 資料卷中的更改不會包含在映象的更新中

  • 資料卷的生命週期一直持續到沒有容器使用它為止

  • 容器卷也可以完成主機到容器、容器到主機的資料共享(類似於 docker cp)

5.2 容器資料卷案例

5.2.1 命令新增

命令:docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 映象名

新增之前:

執行docker run -it -v /myDataVolume:/dataVolumeContainer centos

可以看到宿主機跟容器中都生成了對應資料夾:

備註:Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied

解決辦法:在掛載目錄後多加一個--privileged=true引數即可

檢查是否掛載成功:docker inspect 容器ID

1.容器和宿主機之間資料共享

可以看到實現了宿主機跟容器之間的雙向同步。

2. 容器停止退出後,主機修改後資料是否同步

容器先停止退出、主機修改host.txt、容器重啟進入、檢視主機修改過的host.log

3. 命令(帶許可權)

帶許可權的命令:docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 映象名

ro表示read only只讀。

執行:docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos

5.2.2 DockerFile新增

具體描述放到後面講,這裡先使用。

主機根目錄下新建mydocker資料夾並進入:mkdir mydocker

可在Dockerfile中使用VOLUME指令來給映象新增一個或多個數據卷:

VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]

說明:

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

由於宿主機目錄是依賴於特定宿主機的,並不能夠保證在所有的宿主機上都存在這樣的特定目錄。

File構建:

建立一個檔案Dockerfile,然後新增以下內容:

vim Dockerfile
# volume test
FROM centos   
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash

build後生成映象:獲得一個新的映象

docker build -f /mydocker/Dockerfile -t mrlinxi/centos .

run我們設定好的容器:

docker run -it 27ffb21c539d /bin/bash

可以看到容器內已經建立好了卷地址。

通過上述步驟,容器內的卷目錄地址已經知道,對應的主機目錄地址哪??

通過docker inspect 容器ID檢視

5.3 資料卷容器

5.3.1. 總體介紹

命名的容器掛載資料卷,其它容器通過掛載這個(父容器)實現資料共享,掛載資料卷的容器,稱之為資料卷容器。實際上就是通過父容器傳遞資料卷的配置,通過傳遞資料卷的配置,將不同容器掛載到宿主機的相同目錄下,從而實現各容器之間的資料傳遞。

以上一步新建的映象mrlinxi/centos為模板並執行容器dc01/dc02/dc03,他們已經具有容器卷/dataVolumeContainer1和/dataVolumeContainer2

5.3.2. 容器間傳遞共享(--volumes-from)

先啟動一個父容器dc01,在dataVolumeContainer2中新增內容

docker run -it --name dc01 mrlinxi/centos
cd dataVolumeContainer2
touch doc1.txt

然後ctrl+p+q退出

dc02/dc03繼承自dc01,通過--volumes-from繼承

docker run -it --name dc02 --volumes-from dc01 mrlinxi/centos

然後在dc02和dc03的dataVolumeContainer2中分別新增各自的內容

docker run -it --name dc02 --volumes-from dc01 mrlinxi/centos
cd dataVolumeContainer2
touch doc2.txt

docker run -it --name dc03 --volumes-from dc01 mrlinxi/centos
cd dataVolumeContainer2
touch doc3.txt

回到dc01可以看到02/03各自新增的都能共享了

同理,dc02跟dc03裡面都有其他容器的資料

刪除dc01,dc02修改後dc03可否訪問

刪除dc01後,dc02和dc03之間的資料共享並不受影響。

--volumes-from可以理解為繼承資料卷的配置,即便刪除了dc01,但是配置沒有動依然可以同步資料

可以docker inspect查一下,宿主目錄是同一個

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