詳細介紹docker資料卷管理&convoy卷外掛(範例詳解)

2022-01-21 19:00:30
本篇文章給大家帶來了關於docker中資料卷管理和convoy卷外掛的相關知識,希望對大家有幫助。

1.什麼是Docker資料卷

  • 資料卷是一個或多個容器中專門指定的目錄,它能夠繞過聯合檔案系統。
    卷被設計用作資料持久化、並且是獨立於容器的生命週期的。

  • 因此,Docker不會在刪除容器時自動刪除資料卷卷,也不會主動「垃圾回收」掉容器不再使用的卷。

  • 資料卷的存在就是想讓的容器的資料持久化存在,而且可以實現容器之間的資料共用。

  • 通俗地來說,docker容器資料卷可以看成使我們生活中常用的u盤,它存在於一個或多個的容器中,由docker掛載到容器,但不屬於聯合檔案系統,Docker不會在容器刪除時刪除其掛載的資料卷。

2.為什麼要用資料卷

docker分層檔案系統:

  • 效能差
  • 生命週期與容器相同

docker資料卷:

  • mount到主機中,繞開分層檔案系統
  • 和主機磁碟效能相同,容器刪除後依然保留
  • 僅限本地磁碟,不能隨容器遷移

3.docker資料卷提供兩種卷

bind mount

是將主機上的目錄或檔案mount到容器裡

  • 使用直觀高效,易於理解。
  • 使用 -v 選項指定路徑,格式 :
  • bind mount 預設許可權是讀寫rw,可以在掛載時指定唯讀ro。
  • -v選項指定的路徑,如果不存在,掛載時會自動建立。

docker managed volume

bind mount必須指定host檔案系統路徑,限制了移植性。
docker managed volume 不需要指定mount源

bind mount 和docker managed volume對比

相同點:兩者都是host檔案系統中的某個路徑

不同點:
在這裡插入圖片描述

4.bind mount應用

docker network prune 
docker network ls
docker run -d --name vm1 -v /opt/website:/usr/share/nginx/html nginx
docker ps

在這裡插入圖片描述

docker inspect vm1	#檢視到ip為172.17.0.2
curl 172.17.0.2

發現是403頁面:
在這裡插入圖片描述

cd /opt/website/
ls	#發現沒有預設釋出頁面
echo www.westos.org > index.html
curl 172.17.0.2

此時存取nginx,就有www.westos.org內容了:
在這裡插入圖片描述
掛載時還可以指定許可權:

docker run -it --rm -v /opt/website:/data1 -v /etc/passwd:/data2/passwd:ro busybox

可以看到預設許可權為rw讀寫,所以我們可以更改index.html的內容;而指定passwd為唯讀後,我們就無法修改其內容,只能讀
在這裡插入圖片描述

5.docker managed volume

檢視現有的管理卷:

docker volume ls

我們有些是時候在刪除了容器後會有殘存的管理卷存在,這是我們就需要去清理它,不然會佔用我們的資源:

docker volume prune 
docker volume ls

在這裡插入圖片描述

docker run -d --name registry registry
cd /var/lib/docker/volumes/
ls
docker history registry:latest

在這裡插入圖片描述
通過docker volume可以將容器內的內容複製到掛載點:

docker run -d --name vm2 -v /usr/share/nginx/html nginx
cd /var/lib/docker/volumes/
ls
cd 674c999f99b7b524d8f5769b65cb5411d11e3fa855da695a5fdd3494e4342d89/
cd _data/
ls	#檢視到預設釋出目錄被複制到了這裡

在這裡插入圖片描述

docker inspect vm2
curl 172.17.0.3	#nginx預設釋出頁

在這裡插入圖片描述

echo hello docker! > index.html
curl 172.17.0.3	#可以直接在掛載的目錄修改預設釋出頁

在這裡插入圖片描述

6.docker卷外掛簡介

docker卷預設使用的是local型別的驅動,只能存在宿主機,
跨主機的volume就需要使用第三方的驅動
,可以檢視連結:
https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins
在這裡插入圖片描述

Docker Plugin 是以Web Service的服務執行在每一臺Docker Host上的,通過HTTP協定傳輸RPC風格的JSON資料完成通訊。Plugin的啟動和停止,並不歸Docker管理,Docker Daemon依靠在預設路徑下查詢Unix Socket檔案,自動發現可用的外掛。
當用戶端與Daemon互動,使用外掛建立資料卷時,Daemon會在後端找到外掛對應的 socket 檔案,建立連線並行起相應的API請求,最終結合Daemon自身的處理完成使用者端的請求。

7.convoy卷外掛

convoy卷外掛支援三種執行方式:devicemapper、NFS、EBS。下面的實驗以nfs的執行方式來演示

實驗目的:在server1和2底層用nfs來實現資料共用

step1 首先在server1和server2上搭建nfs檔案系統:

server1:

yum install -y nfs-utils
systemctl start rpcbind	
mkdir /nfs	#建立共用目錄
chmod 777 /nfs	#修改共用目錄許可權
vim /etc/exports	#編輯共用目錄檔案,否則將不會被共用出去
/nfs	*(rw,no_root_squash)
systemctl start nfs

注意:rpcbind服務必須是開啟的。這是因為:他是一個RPC服務,主要是在nfs共用時候負責通知使用者端,伺服器的nfs埠號的。簡單理解rpc就是一箇中介服務。
在這裡插入圖片描述
server2:

yum install -y nfs-utils
systemctl start nfs-server.service
showmount -e server1	#尋找server1的掛載目錄
mkdir /nfs
mount server1:/nfs /nfs
df

在這裡插入圖片描述
測試:
在server2中:

cd /nfs/
touch file

在這裡插入圖片描述
在server1中:

cd /nfs/
ls	#檢視到file

在這裡插入圖片描述
說明兩個節點的/nfs實現同步了

step2 設定convoy環境:
docker官方只提供了卷外掛的api,開發者可以根據實際需求客製化卷外掛驅動。

在server1中:

tar zxf convoy.tar.gz 
cd convoy/
cp convoy* /usr/local/bin/  #將二進位制檔案加入到PATH路徑
mkdir /etc/docker/plugins	#建立docker的外掛目錄
convoy daemon --drivers vfs --driver-opts vfs.path=/nfs &> /dev/null &
cd /nfs
ls

注意:第一次執行上面的convoy daemon命令的時候,會在/nfs目錄下生成一個config資料夾,這個資料夾不要刪除,不然使用者端的convoy命令就會用不了

echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
#將convoy守護行程開啟生成的.sock檔案放入/etc/docker/plugins目錄下的convoy.spec檔案中,docker就可以識別。(其中convoy.spec檔案之前是不存在的)
cat /etc/docker/plugins/convoy.spec

在這裡插入圖片描述
在server2中同樣設定convoy環境:

scp -r server1:convoy .
cd convoy/
cp convoy* /usr/local/bin/  #將二進位制檔案加入到PATH路徑
mkdir /etc/docker/plugins	#建立docker的外掛目錄
echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
convoy daemon --drivers vfs --driver-opts vfs.path=/nfs &> /dev/null &
cd /nfs
ls

在這裡插入圖片描述
step3 建立卷:

docker volume ls
convoy create vol1

在這裡插入圖片描述
step4 操作卷:

在server2中執行容器,指定卷為剛才新建立的vol1:

docker run -it --name vm1 -v vol1:/usr/share/nginx/html nginx
docker ps
docker inspect vm1
curl 172.17.0.2	#nginx預設釋出頁

在這裡插入圖片描述
在這裡插入圖片描述

cd /nfs/
cd vol1/
echo hello convoy > index.html
curl 172.17.0.2

在這裡插入圖片描述
在server1中資料也同步了:

cd /nfs/
cd vol1/
cat index.html

在這裡插入圖片描述
在ser1中也可以執行容器,也可以用到共用的資料卷

說明:docker引擎預設掃描 /etc/docker/plugins目錄中的convoy.spec—>存取/run/convoy/convoy.sock檔案—>發起響應的api請求—>把資料寫入vol1中—>底層通過nfs進行主機間的資料同步

如何刪除通過nfs建立的資料卷,讓之後建立的資料卷都是原生的呢?

刪除卷:

convoy delete vol1

實現本地驅動:

cd /etc/docker/plugins/
mv convoy.spec /mnt
systemctl restart docker

建立卷:

docker volume create vol1
ls
cd volumes/
ls	#可以看到vol1,預設建立在這個目錄下
cd vol1/
ls
cd _data/
ls	#進入該目錄,是空的

在這裡插入圖片描述
使用卷:

docker run -d --name vm1 -v vol1:/usr/share/nginx/html nginx
docker ps
ls	#看到nginx預設釋出目錄被掛到這裡了

在這裡插入圖片描述
補充幾條命令:

docker container prune	#刪除停止的容器
docker volume prune	#刪除沒有被使用的卷

推薦學習:《》

以上就是詳細介紹docker資料卷管理&convoy卷外掛(範例詳解)的詳細內容,更多請關注TW511.COM其它相關文章!