Docker之快速搞定容器數據卷
- 2019 年 12 月 30 日
- 筆記
前面我們介紹了鏡像
和容器
,通過鏡像我們可以啟動多個容器,但是我們發現當我們的容器停止獲取刪除後,我們在容器中的應用的一些數據也丟失了,這時為了解決容器的數據持久化
,我們需要通過容器數據卷
來解決這個問題,本文我們就來介紹下容器數據卷
。
1.是什麼
Docker容器產生的數據,如果不通過docker commit生成新的鏡像,使得數據做為鏡像的一部分保存下來,那麼當容器刪除後,數據自然也就沒有了。為了能保存數據在docker中我們使用卷。簡單來說,容器卷就相當於Redis中持久化方式的RDB和AOF。
2.解決了什麼問題
卷就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合文件系統,因此能夠繞過Union File System提供一些用於持續存儲或共享數據的特性: 卷的設計目的就是數據的持久化
,完全獨立於容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數據卷
特點:
- 數據卷可在容器之間共享或重用數據
- 卷中的更改可以直接生效
- 數據卷中的更改不會包含在鏡像的更新中
- 數據卷的生命周期一直持續到沒有容器使用它為止
持久化,容器間繼承和共享數據
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


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