前面我們介紹了鏡像和容器,通過鏡像我們可以啟動多個容器,但是我們發現當我們的容器停止擷取删除後,我們在容器中的應用的一些資料也丢失了,這時為了解決容器的資料持久化,我們需要通過容器資料卷來解決這個問題,本文我們就來介紹下容器資料卷。
1.是什麼
Docker容器産生的資料,如果不通過docker commit生成新的鏡像,使得資料做為鏡像的一部分儲存下來,那麼當容器删除後,資料自然也就沒有了。為了能儲存資料在docker中我們使用卷。簡單來說,容器卷就相當于Redis中持久化方式的RDB和AOF。
2.解決了什麼問題
卷就是目錄或檔案,存在于一個或多個容器中,由docker挂載到容器,但不屬于聯合檔案系統,是以能夠繞過Union File System提供一些用于持續存儲或共享資料的特性:
卷的設計目的就是資料的持久化,完全獨立于容器的生存周期,是以Docker不會在容器删除時删除其挂載的資料卷
特點:
資料卷可在容器之間共享或重用資料
卷中的更改可以直接生效
資料卷中的更改不會包含在鏡像的更新中
資料卷的生命周期一直持續到沒有容器使用它為止
持久化,容器間繼承和共享資料
3.資料卷
首先我們來看看資料卷的使用方式
3.1 直接指令添加
3.1.1 挂載資料卷
添加的指令
docker run -it -v /主控端絕對路徑:/容器内目錄 鏡像名
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CM5IjYlVzNhFDMmNjYlVWOiBTZ0MjMzYjMjRzMwEjYk9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
我們發現執行了該指令後,在主控端中會添加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
結論:容器之間配置資訊的傳遞,資料卷的生命周期一直持續到沒有容器使用它為止.