【學習筆記】Docker 容器數據卷

Ray
7 min readOct 27, 2022

--

本文內容

  1. 為什麼需要容器數據卷?如何使用數據卷?
  2. 安裝MySQL,並將資料掛載到本地主機
  3. 其他操作(容器的讀取權限、容器共用數據卷)

1.為什麼需要容器數據卷?如何使用數據卷?

數據卷解決了哪些問題?

  • 資料會都存在於容器中,假如開了一個mySQL的容器,但是把這個容器刪了,資料就都沒了
  • 每次要修改配置都需要進到容器內部較麻煩,且容器內可能沒有一些指令集(ex.vim)

透過容器數據卷的方式可以讓數據保留在本地主機上,而非容器中。從而達到數據持久化的需求。實際上就是用一個目錄掛載的方式實現(把容器儲存檔案的目錄位置移到本機的某個目錄位置)

小結:為了數據持久化與同步操作,以及數據共享(容器與主機、容器與容器)

如何使用數據卷?

**主機部分**
docker run -it -v <主機目錄>:<容器目錄> centos /bin/bash
// ex. docker run -it -v /home/raydev:/home centos /bin/bash
// 透過交互模式運行centos鏡像產生的容器,並將該容器的/home路徑掛載到主的/home/raydev
**容器部分**
cd home touch volumnTest.txt ctrl + P + Q
// 進到與目錄掛載的資料夾,並建立一個.txt後回到主機
**主機部分**
cd raydev ls
// 進到給容器掛載的目錄查看是否有檔案,有則表示掛載成功 (於容器內建立,且主機上也看的到)

另一個查看是否掛載成功的方式

docker inspect <容器id>  // 找到 Mounts  ... "Mounts": [             
{
"Type": "bind",
"Source": "/home/raydev", // 主機地址
"Destination": "/home", // 容器地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
], ...

補充:就算容器沒有開啟,只要主機目錄檔案有更動,也會同步到容器

2.安裝MySQL,並將資料掛載到本地主機

安裝SQL

拉取MySQL鏡像

docker pull mysql:5.7

將mysql鏡像啟動為mysql01,以後臺執行且主機暴露3310端口,並將兩個目錄掛載到主機

sudo 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=123456 --name mysql01 mysql:5.7// 分別是:conf是mysql的設定檔,以及mysql的資料
// -e 後面是第一次啟動mysql的鏡像需要給他一個密碼,參考官方文檔

使用SQLyog連線

現在主機上掛載容器放data的目錄上ls查看一下當前資料夾的資料

回到SQLyog創建一個數據庫叫RayYeh

再看一次主機上掛載容器data目錄的資料夾,會發現多了一個RayYeh資料夾,表示映射成功。

補充:此時就算把容器整個rm -f移除掉,主機上的資料還是會在,完成了資料持久性的需求。

掛載方式介紹

指定路徑掛載:同時指定容器目錄與主機目錄位置(上面安裝mysql那種)

具名掛載,同時指定容器目錄與掛載資料夾名稱

匿名掛載:-v 後只提供一個目錄路徑,只有指定容器內的目錄,而沒有指定要掛載到主機的位置。

// 指定路徑掛載 -v <主機路徑>:<容器路徑>
sudo 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=123456 --name mysql01 mysql:5.7
// 具名掛載 -v <卷名>:<容器內路徑>
docker run -d -P --name nginx02 -v withName:/etc/nginx nginx
// 匿名掛載 -v <容器內路徑>
docker run -d -P --name nginx01 -v /etc/nginx nginx

相關指令

docker volumn ls // 查看當前所有卷的資料
docker volume inspect <VOLUME_NAME> // 查看特定卷的詳細資料

補充:具名掛載與匿名掛載的資料,預設路徑都會在 /var/lib/docker/volumes/<卷名>/_data,一般不建議使用匿名掛載。(如果這邊cd不過去而且也沒報錯,可以先sudo -s,進入root身分後再cd就可以了)

3.其他操作(容器的讀取權限、容器共用數據卷)

掛載時,如何設定容器的讀取權限

ro : read-only // 表示容器對於此資料僅讀
rw : read-write // 表示容器對於此資料可讀可寫(預設)
docker run -d -P --name nginx02 -v withName:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v withName:/etc/nginx:rw nginx

容器共用數據卷

啟用一個docker01容器

docker run -it --name docker01 raydev/centos:1.0

啟用一個docker02容器,並共用docker01的數據卷

docker run -it --name docker02 --volumes-from docker01 raydev/centos:1.0

docker01 有掛載兩個目錄資料夾分別是 volume01 與 volume02
因為 docker02 共用了docker01的數據卷,因此在 docker02 ls檢視目錄也會發現那兩個資料夾

此時進入到 docker02 的 volume01 創建一個新的.txt測試是否有同步到 docker01 與主機

touch raygg.txt // in docker02

退出後到docker01的volumn01

ls // 查看是否有剛剛建立的raygg.txt

退出後回到主機

docker ps // 查看當前運行的兩個 docker01 與 docker02 的容器id
docker inspect <容器id> // 查看當前運行的兩個 docker01 與 docker02 的數據卷掛載目錄
cd <Mounts的路徑> // 查看是否主機有raygg.txt

--

--

No responses yet