Docker系列-第五篇Docker容器數據卷


1.是什么

在生產環境中使用 Docker,往往需要對數據進行持久化,或者需要在多個容器之間進行數據共享,這必然涉及容器的數據管理操作 。
容器中的管理數據主要有兩種方式 :

  • 數據卷 ( Data Volumes ) : 容器內數據直接映射到本地主機環境;
  • 數據卷容器( Data Volume Containers ) : 使用特定容器維護數據卷。

一句話:有點類似我們Redis里面的rdb和aof文件

  • 將運用與運行的環境打包形成容器運行 ,運行可以伴隨着容器,但是我們對數據的要求希望是持久化的
  • 容器之間希望有可能共享數據

Docker容器產生的數據,如果不通過docker commit生成新的鏡像,使得數據做為鏡像的一部分保存下來,
那么當容器刪除后,數據自然也就沒有了。

為了能保存數據在docker中我們使用卷。

2.能干什么

卷就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合文件系統,因此能夠繞過Union File System提供一些用於持續存儲或共享數據的特性:

數據卷 ( Data Volumes ) 是一個可供容器使用的特殊目錄,它將主機操作系統目錄直接映射進容器,類似於 Linux 中的 mount 行為 。

卷的設計目的就是數據的持久化,完全獨立於容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數據卷

特點:
1:數據卷可在容器之間共享或重用數據
2:對數據卷內數據的修改會立馬生效,無論是容器內操作還是本地操作;
3:數據卷中的更改不會包含在鏡像的更新中
4:數據卷的生命周期一直持續到沒有容器使用它為止

  • 容器的持久化
  • 容器間繼承+共享數據

3.數據卷

3.1容器內添加-直接命令添加

3.1.1命令

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

docker run -it -v /dataVolume:/dataVloumeContainer centos /bin/bash

查看容器內時候創建成功

在這里插入圖片描述

查看宿主機是否創建成功

在這里插入圖片描述

3.1.2查看數據卷是否掛載成功

命令:docker inspect 容器ID

在這里插入圖片描述

在這里插入圖片描述

上面的“RW”:true 標識具有讀寫權限

3.1.3容器和宿主機之間數據共享

主要是在dataVolume 和dataVolumeContainer 兩個掛載的目錄下演示數據是否共享

在這里插入圖片描述

上圖主要演示在centos docker容器和宿主機中往test.txt文件中寫數據,看雙方數據是否一致。

結果在centos docker容器中編輯的test.txt文件能同步到宿主機中的test.txt文件中。

在宿主機中編輯的test.txt文件也能同步到centos docker 容器的test.txt中。

3.1.4容器停止退出后,主機修改后數據是否同步

演示步驟:

  • 退出centos docker容器(exit 命令,退出並停止容器)
  • 在宿主機的dataVolume上執行 echo "java world">>test02.txt
  • docker ps -a 查詢剛才停止退出的容器id
  • docker start 容器id
  • docker attach 容器id
  • 查看dataVolumeContainer目錄下是否有新建的test02.txt和之前的text.txt

在這里插入圖片描述

3.1.5命令(帶權限)

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

添加了ro之后,只允許宿主機進行單項的操作,容器內目錄只有讀的權限

在這里插入圖片描述

3.2容器內添加-DockerFile添加

Java EE Hello.java---->Hello.class

Docker images---->DockerFile(dokcer編程)

基於 Dockerfile 創建鏡像是常見的方式。 Dockerfile 是一個文本文件,利用給定的指令描述基於某個父鏡像創建新鏡像的過程 。

DockerFile

  • step1

根目錄下新建mydocker文件夾並進入

  • step2

可在Dockerfile中使用VOLUME指令來給鏡像添加一個或多個數據卷

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

說明:

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

  • step3

File構建

在這里插入圖片描述

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

build后生成鏡像

獲得一個新鏡像ng/centos

 docker build -f /mydocker/dockerfile -t ng/centos .

在這里插入圖片描述

  • step5

run容器

在這里插入圖片描述

  • step6

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

docker會默認生成一個,通過docker inspet 可以查看具體路徑

在這里插入圖片描述

  • step7

驗證容器和宿主機之間是否數據共享

  • step8

備注

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

4.數據卷容器

4.1是什么

命名的容器掛載數據卷,其它容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之為數據卷容器

如果用戶需要在多個容器之間共享一些持續更新的數據,最簡單的方式是使用數據卷容器 。 數據卷容器也是一個容器,但是它的目的是專門提供數據卷給其他容器掛載。

4.2總體介紹

在這里插入圖片描述

在這里插入圖片描述

以上一步新建的鏡像ng/centos為模板並運行容器dc01/dc02/dc03

它們已經具有容器卷

  • /dataVolumeContainer1
  • /dataVolumeContainer2

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

  • step 1

先啟動一個父容器dc01

docker run -it --name dc01  ng/centos /bin/bash

在這里插入圖片描述

在dataVolumeContainer2新增內容

  • step 2

dc02/dc03繼承自dc01 (主要使用--volumes-from)

docker run -it --name dc02 --volumes-from dc01 ng/centos
docker run -it --name dc03 --volumes-from dc01 ng/centos

在這里插入圖片描述

在這里插入圖片描述

dc02 dc03容器繼承與dc01容器,並在dc2容器的dataVolumeContainer2文件夾下,新增dc02_add.txt文件。

此時可以看到,dc01 dc03容器也有新增加的文件。

並在dc03容器的dataVolumeContainer2文件夾下,新增dc03_add.txt文件。此時可以看到,dc01 dc02容器也有新增加的文件。

  • step 3

刪除dc01,dc02修改后dc03可否訪問------->是可以訪問的

刪除dc01容器

docker container rm -f  dc01 
  • step 4

刪除dc02后dc03可否訪問---->是可以訪問的

  • step 5

新建dc04繼承dc03后再刪除dc03

docker run -it --name dc04 --volumes-from dc03 ng/centos
docker container rm -f dc03

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

微信公眾號
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM