1. 程式人生 > >Docker系列-第五篇Docker容器資料卷

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

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

微信公眾號


JAVA程式猿成長之路
分享資源,記錄程式猿成長點滴。專注於Java,Spring,SpringBoot,SpringCloud,分散式,微服務。