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,分散式,微服務。