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
結論:容器之間配置信息的傳遞,數據卷的生命周期一直持續到沒有容器使用它為止
微信公眾號