在Docker可視化管理:Portainer中文版 中,我提到了一個Volume,但是對于這個Volume我是一筆帶過了(其實那一步是可以不創建的,因為我後期的映射是采用絕對路徑進行),現在我們通過簡單的案例來了解一下這個“Volume”是個什麼小東西。
不使用Volume首先創建一個nginx容器,命令如下:
docker run -dit --name=web -p 81:80 nginx
創建結果:
創建nginx容器
然後我們訪問:
訪問nginx服務
接着修改網頁内容:
docker exec -ti web /bin/bash
echo 1 > /usr/share/nginx/html/index.html
cd /etc/init.d/
./nginx restart
exit
docker restart web
然後訪問:
訪問修改後的頁面
這時候,網頁内容已經更改了,然後我們删除這個容器,重新創建它
docker rm -f web
docker run -dit --name=web -p 81:80 nginx
删除并重新創建容器
再次訪問:
訪問新創建的容器服務
這時候你會發現,之前修改的内容已經不見了,這個又是一個新的容器,那麼這是在不使用Volume的場景
使用自定義Volume接下來我們使用-v參數去創建容器:
創建容器之前,我們先創建一個文件夾(确保沒數據)
mkdir /web/
docker run -dit --name=web -v /web/:/usr/share/nginx/html/ -p 81:80 nginx
執行結果:
創建映射卷的容器
然後我們進入容器看一下:
docker exec -ti web /bin/bash
cd /usr/share/nginx/html/
ls
查看容器服務數據目錄文件
從圖中我們可以看到,此時默認的數據(網頁文件)不見了,訪問網頁看一下:
找不到文件,不過沒關系啊,我們回到宿主機創建網頁文件看看:
exit
echo 'web' > /web/index.html
在宿主機創建網頁文件
再次訪問:
訪問服務
這時候驚喜來了,我們在宿主機創建的文件直接應用在了容器裡面,而且我們不需要進入容器就能實現更改應用,到這裡是不是大概了解了Volume的作用了呢?還不了解的也沒關系,繼續往下看:
映射有數據的目錄到新建容器現在我們把現在的容器删除掉,重新創建,然後繼續挂載這個目錄
docker rm -f web
ls /web/
docker run -dit --name=web -v /web/:/usr/share/nginx/html/ -p 81:80 nginx
創建新的容器并挂載到有數據的目錄
然後再次訪問:
這時候發現,剛剛新建的nginx容器服務無需進行任何操作就出現了之前手動修改的網頁文件内容,也就是說:
那麼這是自定義Volume的一個場景,接下來看一下Docker Volume的場景
使用docker Volumedocker Volume其實就是由Dokcer統一管理的卷,默認存放路徑為:
/var/lib/docker/volumes/
例如我完成一個volume生命周期:
ls /var/lib/docker/volumes/
docker volume create web
ls /var/lib/docker/volumes/
docker volume rm web
ls /var/lib/docker/volumes/
執行結果:
Volume生命周期管理
可以看到,當我們創建一個新的Volume的時候,/var/lib/docker/volumes/目錄下就會出現對應的文件名名稱。
也就是說,Docker Volume其實就是設定一個默認的Volume路徑,然後創建删除volume都會在設定的目錄變化,
所以實際上我們使用-v指定絕對路徑跟-v指定卷名的作用是一樣的,隻是路徑不一定相同而已。
舉個例子:我創建一個volume,在裡面寫入數據,然後映射
rm -rf /web/ #删除宿主機絕對路徑下的web
docker rm -f web #删除存在的容器
docker volume create web #創建一個volume
echo '/var/lib/docker/volumes/web/' > /var/lib/docker/volumes/web/index.html #寫入數據到volume
docker run -dit --name=web -v web:/usr/share/nginx/html/ -p 81:80 nginx #創建容器
執行結果:
細心的朋友可能發現我在映射本地路徑的時候,使用的是相對路徑web/,但是我當前目錄是沒有web/文件夾的,所以docker在創建的時候就是會自動去默認的volume路徑找。
創建成功之後,我們訪問網頁看下:
訪問新的容器服務
此時,默認網頁出現在我們的面前,也就是說,剛才的echo寫入的文件沒有映射到這個容器,我們去看下是怎麼回事:
問題找到了,通過docker volume映射的容器目錄并不會将volume根目錄的數據映射到容器的對應路徑,而是把volume下的_data映射到容器的工作目錄,所以我們需要修改的路徑應該再加一層
_data
然後我們繼續執行下面這台命令看一下:
echo '/var/lib/docker/volumes/web/' > /var/lib/docker/volumes/web/_data/index.html
然後再次訪問:
此時,我們在本地修改的數據已經同步到了容器裡面了,所以到這裡你看懂這個volume了嗎?
還是不懂的話你可以把這個主機的volume雲服務器裡面的一個數據盤,即使雲服務器(容器)銷毀了,數據盤的數據不會随着雲服務器(容器)的銷毀而消失,這就是數據持久化,同時,volume支持多容器共享一個volume,這在某些場景是非常有用的。
想了解更多Docker、Linux、Python相關知識請關注我吧,也可以留言給我需要了解哪些知識,然後我可以根據你們的需求去定後續的文章!
如果覺得本文對你有幫助,請多多轉發評論,這是對我的一個最大的支持,也是我持續更新的動力,謝謝!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!