本文內容
- 為什麼需要容器數據卷?如何使用數據卷?
- 安裝MySQL,並將資料掛載到本地主機
- 其他操作(容器的讀取權限、容器共用數據卷)
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