資料卷是一個或多個容器中專門指定的目錄,它能夠繞過聯合檔案系統。
卷被設計用作資料持久化、並且是獨立於容器的生命週期的。
因此,Docker不會在刪除容器時自動刪除資料卷卷,也不會主動「垃圾回收」掉容器不再使用的卷。
資料卷的存在就是想讓的容器的資料持久化存在,而且可以實現容器之間的資料共用。
通俗地來說,docker容器資料卷可以看成使我們生活中常用的u盤,它存在於一個或多個的容器中,由docker掛載到容器,但不屬於聯合檔案系統,Docker不會在容器刪除時刪除其掛載的資料卷。
docker分層檔案系統:
docker資料卷:
是將主機上的目錄或檔案mount到容器裡
bind mount必須指定host檔案系統路徑,限制了移植性。
docker managed volume 不需要指定mount源
相同點:兩者都是host檔案系統中的某個路徑
不同點:
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為唯讀後,我們就無法修改其內容,只能讀
檢視現有的管理卷:
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 #可以直接在掛載的目錄修改預設釋出頁
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自身的處理完成使用者端的請求。
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其它相關文章!