Docker總結分享之資料卷技術

2022-01-14 19:00:06
本篇文章給大家帶來了Docker總結分享之資料卷技術的相關知識,希望對大家有幫助。

Docker資料卷技術

19.png

什麼是容器資料卷

docker的理念回顧

將應和環境打包成一個映象!

資料?如果資料都在容器中,那麼我們容器刪除,資料就會丟失!需求:資料可以持久化

MySQL,容器刪了,刪庫跑路--->需求:MySQL資料可以儲存在本地!

容器之間可以有一個資料共用的技術!Docker容器中產生的資料,同步到本地!

這就是卷技術!目錄的掛載,將我們容器內的目錄,掛載到Linu×上面!

20.png

總結:容器的持久化和同步操作!容器間也是可以實現資料共用的!

使用資料卷

docker run -it -v 宿主機目錄: 容器目錄 -p 主機埠:容器埠 容器id

實戰演練

inspect檢視同步詳細資訊

21.png

在容器中建立一個檔案,看是否同步到本地資料夾

22.png

在關閉容器的情況下,對本地檔案進行修改,看修改的是不是會同步到容器中檔案

23.png

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 容器起名字

24.png

測試結果:連線成功

25.png

遇到的問題

首先使用的時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

26.png

具名掛載

-v 掛載卷的名稱:容器內的路徑

docker run -d --name nginx01 -v 具名掛在名稱:/etc/nginx nginx

這裡我們發現,這種就是匿名掛載,我們在-v的後面既寫上了容器內的路徑,沒有容器外的路徑,但是有一個名稱

27.png

docker的內容目錄:/var/lib/docker

所有的docker容器內的卷,沒有指定目錄的情況下都是在:/var/lib/docker/volume/xx/_data

我們可以通過具名掛載方便的找到我們的一個卷,並且在使用卷的時候最多的使用方式就是具名掛載

28.png

額外知識

如何區分時具名掛載還是匿名掛載,指定路徑掛載

-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 映象名稱和版本 映象生成的位置

29.png

進入映象檢視詳情

30.png

檢視卷的同步目錄

docker ps -a

docker inspect 容器id

31.png

最後測試兩個資料夾中是不是同步

同步成功

總結

使用dockerfile構建映象的方式在我們未來的使用中非常的多,因為我們通常會構建自己的映象

假設構建映象時候沒有掛載卷,要手動映象掛載-v

資料卷容器

實際上即使保證的容器之間的資料共用的問題

32.png

資料卷容器實際上就是被拷貝資料的容器(A- volumes-from ->B,B是資料卷容器)

測試兩個映象之間同步

首先先開三個容器

建立docker01

33.png

建立docker02 --volumes-from docekr01

34.png

建立docker03 --volumes-from docekr02

35.png

檢視docker01和docker03之間的資料共用

36.png

接著我們將docker02刪除,檢視docker01和docker03之間的資料共用

37.png

總結:

38.png

實現多個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其它相關文章!