Docker學習重點(6)~容器資料卷
阿新 • • 發佈:2022-05-18
一、容器資料卷
1、什麼是容器卷
docker是要將應用和環境打包成一個映象
這樣,資料就不應該在容器中,否則容器刪除,資料就會丟失,這就是刪庫跑路
故容器之間要有一個數據共享技術
在Docker容器中產生的資料,同步到本地,這就是卷技術
2、容器卷的本質:
本質上是一個目錄掛載,將容器內的目錄掛載到虛擬機器上
3、容器卷掛載目錄的目的:
容器的持久化和同步操作, 實現容器間可以資料共享
二、使用資料卷
1、方式一:直接使用命令來掛載 —v volume卷技術
- 命令:docker run -it -v 主機目錄:容器內目錄
[root@kuangshen home]# docker run-it -v/home/ceshi:/home centos/bin/bash
-
啟動起來時候我們可以通過 docker inspect 容器id
-
新開一個視窗
docker inspect 容器id
- 找到掛載資訊Mounts
- 測試:資料同步
-
再來測試(容器停止後,修改主機檔案,再啟動容器的時候,資料同樣改變):
1、停止容器
2、宿主機上修改檔案
3、啟動容器
4、容器內的資料依舊是同步的!
雙向同步
4、使用容器資料卷的好處:
我們以後修改,只需在本地修改即可,容器內會自動同步!
三、實戰安裝mysql
- MySQL的資料持久化命令
# 拉取 docker pull mysql:5.7 # 掛載 docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mysql01 mysql:5.7 -d 後臺執行 -p 埠對映 -v 卷掛載 -e 環境配置 安裝啟動mysql需要配置密碼 --name 容器名字
- 連線測試:開啟mysql的客戶端工具:
● 如果,我們將容器mysql01刪除,發現:
- 我們掛載到本地的資料卷依然沒有丟失,這就實現了容器資料持久化的功能!
四、具名和匿名掛載
1、匿名掛載和具名掛載的區別:
-
匿名掛載:不寫宿主機目錄
-
具名掛載:會給宿主機起一個名字
#匿名掛載 -v 容器內路徑! docker run -d -P --name nginx01 -v /ect/nginx nginx #檢視所有的 volume 的情況 [root@kuangshen home]# docker volume 1s local 9f38292179faa178afcce54d80be99d4ddd68c91d2a68870bcece72d2b7ed061 #這裡發現,這種就是匿名掛載,我們在—v 只寫了容器內的路徑,沒有寫容器外的路徑!
#具名掛載 [root@kuangshen home]#docker run-d-P--name nginx02 -v juming-nginx:/etc/nginx nginx 95b809564484c8ac87d65c69643e7e67447f1c77ff9a91b93edec7003692e3a9 [root@kuangshen home]# docker volume 1s DRIVER VOLUME NAME local juming-nginx # 通過—v 卷名:容器內路徑 #檢視一下這個卷
- 所有的docker容器內的卷,沒有指定的目錄的情況下都是在
/var/lib/docker/volumes/xxx/_data
- 所有的docker容器內的卷,沒有指定的目錄的情況下都是在
如何確定是具名掛載還是匿名掛載,還是指定路徑掛載!
- -v 容器內路徑 # 匿名掛載
- -v 卷名:容器內路徑 # 具名掛載
- -v 宿主機路徑:容器內路徑 # 指定路徑掛載!
2、拓展:ro、rw
# 通過 —v 容器內路徑:ro(readonly) rw(readwrite) 改變讀寫許可權
#一旦這個了設定了容器許可權,容器對我們掛載出來的內容就有限定了!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
#ro 只要看到ro就說明這個路徑只能通過宿主機來操作,容器內部是無法操作!
五、初始Dockerfile
1、(目錄掛載、資料同步)方式二:DockerFile使用來構建docker映象的檔案!命令指令碼!
- 通過這個指令碼可以生成映象,映象時一層一層的,指令碼是一個一個的命令,每個命令都是一層!
映象是一層一層的,指令碼是一行一行的
- Dockerfile 內容:
# 指令都是大寫的、
# 建立一個dockerfile檔案,命名為Dockerfile
#檔案內容:·
FROM centos # 一層
VOLUME ["volume01","volume02"] # 一層 再建立映象的時候就掛載出來
CMD echo "---end---" # 一層
CMD /bin/bash # 一層
- 構建Dockerfile:
docker build -f /home/docker-test-volume/dockerfile1 -t shan/centos
■ 測試:在容器內部建立一個檔案
所有的docker容器內的卷,沒有指定的目錄的情況下都是在
/var/lib/docker/volumes/xxx/_data
- 檢查容器
- 檢視Mounts,Source對應容器外目錄,匿名掛載卷
- 測試一下,在container volume01下生成檔案:
- 在主機掛載路徑下,也同樣生成(資料同步)
● 這種方式我們未來使用的十分多,因為我們通常會構建自己的映象!假設構建映象時候沒有掛載卷,
手動映象掛載 —v卷名:容器內路徑!
六、資料卷容器---多個容器資料共享
- 多個mysql 同步資料
1、多個容器資料共享
資料卷的繼承關係 --volumes-from
- 建立兩個容器:
-
資料卷的繼承關係:
--volumes-from
- 啟動docker01,用之前建的shan/centos 1.0 映象
docker run -it --name docker01 shan/centos:1.0 # 1.0必須寫
docker run -it --name docker02 --volumes-from docker01 shan/centos:1.0
2、資料卷共享資料是拷貝
3、結論:
容器之間配置資訊的傳遞,資料卷容器的生命週期一直持續到沒有容器使用為止。
但是如果持久化到了本地,即使所有容器刪除了,本地資料是不會刪除的!
☺ 參考來源:
狂神的B站視訊《【狂神說Java】Docker最新超詳細版教程通俗易懂》 https://www.bilibili.com/video/BV1og4y1q7M4
如果本文對你有幫助的話記得給一樂點個贊哦,感謝!