Docker資料卷技術
什麼是容器資料卷
docker的理念回顧
將應和環境打包成一個映象!
資料?如果資料都在容器中,那麼我們容器刪除,資料就會丟失!需求:資料可以持久化
MySQL,容器刪了,刪庫跑路--->需求:MySQL資料可以儲存在本地!
容器之間可以有一個資料共用的技術!Docker容器中產生的資料,同步到本地!
這就是卷技術!目錄的掛載,將我們容器內的目錄,掛載到Linu×上面!
總結:容器的持久化和同步操作!容器間也是可以實現資料共用的!
使用資料卷
docker run -it -v 宿主機目錄: 容器目錄 -p 主機埠:容器埠 容器id
實戰演練
inspect檢視同步詳細資訊
在容器中建立一個檔案,看是否同步到本地資料夾
在關閉容器的情況下,對本地檔案進行修改,看修改的是不是會同步到容器中檔案
Mysql實戰
命令
docker run -d -p 3310:3306 -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
引數
-d 後臺執行
-p 埠對映
-v 資料卷掛載:同步資料
-e 設定環境變數:這裡時設定的時MySQL的登陸密碼
--name 容器起名字
測試結果:連線成功
遇到的問題
首先使用的時mysql的最新版本:8.0----在使用navicat進行連線的時候,總是報莫名其妙的錯誤
解決方式:換成5.7版本,沒有任何問題
在我們run映象mysql的時候,沒有加上-e MYSQL_ROOT_PASSWORD=123456進行密碼的設定,容器一直會處於關閉狀態,即使重新start也不會開啟
加上-e MYSQL_ROOT_PASSWORD=123456這個引數完美開啟
即使我們將容器刪除,我們掛載到原生的資料卷依舊沒有丟失,這就實現了容器資料的持久化功能
具名掛載和匿名掛載
匿名掛載
-v 容器內的路徑!
docker run -d --name nginx01 -v /etc/nginx nginx
這裡我們發現,這種就是匿名掛載,我們在-v的後面只是寫上了容器內的路徑,沒有寫容器外的路徑
檢視所有卷的情況
docker volume ls
具名掛載
-v 掛載卷的名稱:容器內的路徑
docker run -d --name nginx01 -v 具名掛在名稱:/etc/nginx nginx
這裡我們發現,這種就是匿名掛載,我們在-v的後面既寫上了容器內的路徑,沒有容器外的路徑,但是有一個名稱
docker的內容目錄:/var/lib/docker
所有的docker容器內的卷,沒有指定目錄的情況下都是在:/var/lib/docker/volume/xx/_data
我們可以通過具名掛載方便的找到我們的一個卷,並且在使用卷的時候最多的使用方式就是具名掛載
額外知識
如何區分時具名掛載還是匿名掛載,指定路徑掛載
-v 容器內路徑 #匿名掛載
-v 卷名:容器內路徑 #具名掛載
-v /容器外路徑:容器內路徑 #指定路徑掛載
擴充套件
-v 容器內路徑:ro rw 改變讀寫許可權
ro readonly 唯讀
rw readwrite 可讀可寫
一旦設定了這個容器許可權,容器對我們掛載出來的內容就有限定了
docker run -d --name nginx01 -v 具名掛在名稱:/etc/nginx:ro nginx docker run -d --name nginx01 -v 具名掛在名稱:/etc/nginx:rw nginx
Ro 只要看到ro就說明這個路徑只能通過宿主機來進行操作,容器內是無法操作的!
初識Dockerfile
dockerfile
dockerfile就是用來構建docker映象檔案的!命令指令碼!先體驗一下
通過這個指令碼可以生成映象,映象是一層一層的,指令碼是一個個的命令,每個命令都是一層!
寫一個dockerfile
# 創立一個dockerfile檔案,名字可以隨便的取,最好叫做dockerfile # 檔案中的內容 指令(大寫) 引數 FROM centos VOLUME ["volme01","volume02"] CMD echo "--------end----------" CMD /bin/bash #這裡每個指令就是映象的一層
使用dockerfile生成映象
docker build -f dockerfile檔案位置 -t 映象名稱和版本 映象生成的位置
進入映象檢視詳情
檢視卷的同步目錄
docker ps -a
docker inspect 容器id
最後測試兩個資料夾中是不是同步
同步成功
總結
使用dockerfile構建映象的方式在我們未來的使用中非常的多,因為我們通常會構建自己的映象
假設構建映象時候沒有掛載卷,要手動映象掛載-v
資料卷容器
實際上即使保證的容器之間的資料共用的問題
資料卷容器實際上就是被拷貝資料的容器(A- volumes-from ->B,B是資料卷容器)
測試兩個映象之間同步
首先先開三個容器
建立docker01
建立docker02 --volumes-from docekr01
建立docker03 --volumes-from docekr02
檢視docker01和docker03之間的資料共用
接著我們將docker02刪除,檢視docker01和docker03之間的資料共用
總結:
實現多個mysql之間的資料共用
docker run -d -p 3310:3306 -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 docker run -d -p 3310:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql:5.7
總結:
容器之間設定資訊的傳遞。資料卷容器的宣告週期一直持續到沒有容器使用位置
理解:容器之間只要是共用就會資料copy,即使有的容器被刪除,資料依然存在,直到所有共用 的容器都刪除,資料才會被徹底刪除
但是一旦你持久化到了本地,這個時候,原生的資料是不會刪除的。
推薦學習:《》
以上就是Docker總結分享之資料卷技術的詳細內容,更多請關注TW511.COM其它相關文章!