天天看點

Docker之快速搞定容器資料卷

 前面我們介紹了鏡像和容器,通過鏡像我們可以啟動多個容器,但是我們發現當我們的容器停止擷取删除後,我們在容器中的應用的一些資料也丢失了,這時為了解決容器的資料持久化,我們需要通過容器資料卷來解決這個問題,本文我們就來介紹下容器資料卷。

1.是什麼

 Docker容器産生的資料,如果不通過docker commit生成新的鏡像,使得資料做為鏡像的一部分儲存下來,那麼當容器删除後,資料自然也就沒有了。為了能儲存資料在docker中我們使用卷。簡單來說,容器卷就相當于Redis中持久化方式的RDB和AOF。

2.解決了什麼問題

 卷就是目錄或檔案,存在于一個或多個容器中,由docker挂載到容器,但不屬于聯合檔案系統,是以能夠繞過Union File System提供一些用于持續存儲或共享資料的特性:

 卷的設計目的就是資料的持久化,完全獨立于容器的生存周期,是以Docker不會在容器删除時删除其挂載的資料卷

特點:

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

   卷中的更改可以直接生效

   資料卷中的更改不會包含在鏡像的更新中

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

   持久化,容器間繼承和共享資料

3.資料卷

 首先我們來看看資料卷的使用方式

3.1 直接指令添加

3.1.1 挂載資料卷

添加的指令

docker run -it -v /主控端絕對路徑:/容器内目錄 鏡像名      
Docker之快速搞定容器資料卷

我們發現執行了該指令後,在主控端中會添加mydatavolume檔案夾,同時在容器中的根目錄中也有了datavolumecontainer檔案夾。

Docker之快速搞定容器資料卷

這表示資料卷挂載成功了。同時我們也可以通過前面介紹的 docker inspect 容器名稱ID來檢視容器的 json資料

Docker之快速搞定容器資料卷

3.1.2 資料共享操作

 資料卷挂載成功後,我們來看看容器和主控端之間的資料共享,我們先在主控端的mydatavolume目錄中建立一個檔案。然後到容器的datavolumecontainer目錄中檢視是否有相同的檔案,然後我們再反過來測試。

Docker之快速搞定容器資料卷

然後我們發現在容器中也有了相同的檔案,而且内容也一緻。反過來

Docker之快速搞定容器資料卷

這就說明容器和主控端中的資料實作了資料共享

3.3.3 容器停止資料共享

 接下來我們把容器停止掉,然後在主控端中更新資料,然後啟動容器我們看看資料是否還能同步。

Docker之快速搞定容器資料卷

更新主控端中的資料

Docker之快速搞定容器資料卷

啟動原來的容器檢視。

Docker之快速搞定容器資料卷

3.3.4 權限管理

 前面我們介紹的共享的權限是在容器中具有讀寫的權限。通過docker inspect 容器ID 我們也可以看到

Docker之快速搞定容器資料卷

我們可以修改該權限

docker run -it -v /主控端絕對路徑:/容器内目錄:ro 鏡像名      
Docker之快速搞定容器資料卷

檢視狀态

Docker之快速搞定容器資料卷

主控端添加檔案

Docker之快速搞定容器資料卷

容器中檢視

Docker之快速搞定容器資料卷

建立檔案或者修改檔案會失敗

Docker之快速搞定容器資料卷

3.2 DockerFile添加

 DockerFile下篇文章我們會專門來介紹,此處我們先來使用看看效果。

3.2.1 mydocker檔案夾

 在根目錄下建立mydocker檔案夾

Docker之快速搞定容器資料卷

3.2.2 VOLUM指令

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

   說明:

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

   由于主控端目錄是依賴于特定主控端的,并不能夠保證在所有的主控端上都存在這樣的特定目錄。

3.2.3 File建構

 建構File檔案

Docker之快速搞定容器資料卷
# volume test

FROM centos

VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]

CMD echo "finished,--------success1"

CMD /bin/bash      

3.2.4 build新鏡像

docker build -f /mydocker/dockerfile1 -t bobokaoya/centos .      
Docker之快速搞定容器資料卷

3.2.5 run一個新容器

 根據上面新建立的鏡像我們來run一個新容器

Docker之快速搞定容器資料卷

那麼如此一來,對應的主控端的映射位址在哪呢?docker inspect 容器ID來檢視

Docker之快速搞定容器資料卷

容器的 共享目錄中建立 檔案。

Docker之快速搞定容器資料卷

去宿主中的映射目錄中檢視

Docker之快速搞定容器資料卷

搞定~

注意

   Docker挂載主機目錄Docker通路出現cannot open directory .: Permission denied

   解決辦法:在挂載目錄後多加一個–privileged=true參數即可

4.資料卷容器

 命名的容器挂載資料卷,其它容器通過挂載這個(父容器)實作資料共享,挂載資料卷的容器,稱之為資料卷容器,我們在前面的案例基礎上來介紹

4.1 啟動一個父容器

docker run -it --name dc01 bobokaoya/centos      
Docker之快速搞定容器資料卷

然後在共享目錄中建立檔案

Docker之快速搞定容器資料卷

4.2 建立兩個子容器

建立dc02

docker run -it --name dc02 --volumes-from dc01 bobokaoya/centos      
Docker之快速搞定容器資料卷

同時在dc02中修改了檔案

我們在建立dc03容器,同時繼承dc01

docker run -it --name dc03 --volumes-from dc01 bobokaoya/centos      
Docker之快速搞定容器資料卷

我們發現dc03中也看到dc02修改的資料,說明共享是成功的。

4.3 删除dc01,檢視dc02和dc03是否共享

 我們停掉dc01并删除,dc02和dc03之間的資料還是共享的

Docker之快速搞定容器資料卷

dc02修改,然後檢視dc03

Docker之快速搞定容器資料卷

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