Docker之快速搞定容器數據卷

  前面我們介紹了鏡像容器,通過鏡像我們可以啓動多個容器,但是我們發現當我們的容器停止獲取刪除後,我們在容器中的應用的一些數據也丟失了,這時爲了解決容器的數據持久化,我們需要通過容器數據卷來解決這個問題,本文我們就來介紹下容器數據卷

1.是什麼

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

2.解決了什麼問題

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

特點:

  1. 數據卷可在容器之間共享或重用數據

  2. 卷中的更改可以直接生效

  3. 數據卷中的更改不會包含在鏡像的更新中

  4. 數據卷的生命週期一直持續到沒有容器使用它爲止

持久化,容器間繼承和共享數據

3.數據卷

  首先我們來看看數據卷的使用方式

3.1 直接命令添加

3.1.1 掛載數據卷

添加的命令

docker run -it -v /宿主機絕對路徑:/容器內目錄 鏡像名

在這裏插入圖片描述
我們發現執行了該命令後,在宿主機中會添加mydatavolume文件夾,同時在容器中的根目錄中也有了datavolumecontainer文件夾。

在這裏插入圖片描述

這表示數據卷掛載成功了。同時我們也可以通過前面介紹的 docker inspect 容器名稱ID來查看容器的 json數據

在這裏插入圖片描述

3.1.2 數據共享操作

  數據卷掛載成功後,我們來看看容器和宿主機之間的數據共享,我們先在宿主機的mydatavolume目錄中創建一個文件。然後到容器的datavolumecontainer目錄中查看是否有相同的文件,然後我們再反過來測試。

在這裏插入圖片描述
在這裏插入圖片描述
然後我們發現在容器中也有了相同的文件,而且內容也一致。反過來

在這裏插入圖片描述
在這裏插入圖片描述

這就說明容器和宿主機中的數據實現了數據共享

3.3.3 容器停止數據共享

  接下來我們把容器停止掉,然後在宿主機中更新數據,然後啓動容器我們看看數據是否還能同步。

在這裏插入圖片描述
更新宿主機中的數據

在這裏插入圖片描述

啓動原來的容器查看。

在這裏插入圖片描述

3.3.4 權限管理

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

在這裏插入圖片描述

我們可以修改該權限

docker run -it -v /宿主機絕對路徑:/容器內目錄:ro 鏡像名

在這裏插入圖片描述
查看狀態
在這裏插入圖片描述

宿主機添加文件

在這裏插入圖片描述
容器中查看

在這裏插入圖片描述
創建文件或者修改文件會失敗

在這裏插入圖片描述

3.2 DockerFile添加

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

3.2.1 mydocker文件夾

  在根目錄下創建mydocker文件夾
在這裏插入圖片描述

3.2.2 VOLUM指令

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

說明:
出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。
由於宿主機目錄是依賴於特定宿主機的,並不能夠保證在所有的宿主機上都存在這樣的特定目錄。

3.2.3 File構建

  構建File文件

在這裏插入圖片描述

# 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 .

在這裏插入圖片描述

3.2.5 run一個新容器

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

在這裏插入圖片描述

那麼如此一來,對應的宿主機的映射地址在哪呢?docker inspect 容器ID來查看

在這裏插入圖片描述

容器的 共享目錄中創建 文件。
在這裏插入圖片描述
去宿主中的映射目錄中查看

在這裏插入圖片描述

搞定~
注意

Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
解決辦法:在掛載目錄後多加一個–privileged=true參數即可

4.數據卷容器

  命名的容器掛載數據卷,其它容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之爲數據卷容器,我們在前面的案例基礎上來介紹

4.1 啓動一個父容器

docker run -it --name dc01 bobokaoya/centos

在這裏插入圖片描述

然後在共享目錄中創建文件

在這裏插入圖片描述

4.2 創建兩個子容器

創建dc02

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

在這裏插入圖片描述

同時在dc02中修改了文件
我們在創建dc03容器,同時繼承dc01

docker run -it --name dc03 --volumes-from dc01 bobokaoya/centos

在這裏插入圖片描述

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

4.3 刪除dc01,查看dc02和dc03是否共享

  我們停掉dc01並刪除,dc02和dc03之間的數據還是共享的

在這裏插入圖片描述
dc02修改,然後查看dc03

在這裏插入圖片描述

在這裏插入圖片描述

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章