tft每日頭條

 > 圖文

 > docker實現的是哪個級别的隔離

docker實現的是哪個級别的隔離

圖文 更新时间:2024-11-18 13:21:31

在Docker可視化管理:Portainer中文版 中,我提到了一個Volume,但是對于這個Volume我是一筆帶過了(其實那一步是可以不創建的,因為我後期的映射是采用絕對路徑進行),現在我們通過簡單的案例來了解一下這個“Volume”是個什麼小東西。

不使用Volume

首先創建一個nginx容器,命令如下:

docker run -dit --name=web -p 81:80 nginx

創建結果:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)1

創建nginx容器

然後我們訪問:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)2

訪問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實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)3

然後訪問:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)4

訪問修改後的頁面

這時候,網頁内容已經更改了,然後我們删除這個容器,重新創建它

docker rm -f web docker run -dit --name=web -p 81:80 nginx

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)5

删除并重新創建容器

再次訪問:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)6

訪問新創建的容器服務

這時候你會發現,之前修改的内容已經不見了,這個又是一個新的容器,那麼這是在不使用Volume的場景

使用自定義Volume

接下來我們使用-v參數去創建容器:

創建容器之前,我們先創建一個文件夾(确保沒數據)

mkdir /web/ docker run -dit --name=web -v /web/:/usr/share/nginx/html/ -p 81:80 nginx

執行結果:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)7

創建映射卷的容器

然後我們進入容器看一下:

docker exec -ti web /bin/bash cd /usr/share/nginx/html/ ls

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)8

查看容器服務數據目錄文件

從圖中我們可以看到,此時默認的數據(網頁文件)不見了,訪問網頁看一下:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)9

找不到文件,不過沒關系啊,我們回到宿主機創建網頁文件看看:

exit echo 'web' > /web/index.html

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)10

在宿主機創建網頁文件

再次訪問:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)11

訪問服務

這時候驚喜來了,我們在宿主機創建的文件直接應用在了容器裡面,而且我們不需要進入容器就能實現更改應用,到這裡是不是大概了解了Volume的作用了呢?還不了解的也沒關系,繼續往下看:

映射有數據的目錄到新建容器

現在我們把現在的容器删除掉,重新創建,然後繼續挂載這個目錄

docker rm -f web ls /web/ docker run -dit --name=web -v /web/:/usr/share/nginx/html/ -p 81:80 nginx

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)12

創建新的容器并挂載到有數據的目錄

然後再次訪問:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)13

這時候發現,剛剛新建的nginx容器服務無需進行任何操作就出現了之前手動修改的網頁文件内容,也就是說:

  • 當映射的本地目錄不存在數據的時候,對應的容器目錄默認數據會被删除并沒有任何文件
  • 當映射的本地目錄存在數據的時候,對應的容器目錄默認數據會被删除,本地的目錄文件會出現在容器的挂載目錄上

那麼這是自定義Volume的一個場景,接下來看一下Docker Volume的場景

使用docker Volume

docker 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/

執行結果:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)14

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 #創建容器

執行結果:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)15

細心的朋友可能發現我在映射本地路徑的時候,使用的是相對路徑web/,但是我當前目錄是沒有web/文件夾的,所以docker在創建的時候就是會自動去默認的volume路徑找。

創建成功之後,我們訪問網頁看下:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)16

訪問新的容器服務

此時,默認網頁出現在我們的面前,也就是說,剛才的echo寫入的文件沒有映射到這個容器,我們去看下是怎麼回事:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)17

問題找到了,通過docker volume映射的容器目錄并不會将volume根目錄的數據映射到容器的對應路徑,而是把volume下的_data映射到容器的工作目錄,所以我們需要修改的路徑應該再加一層

_data

然後我們繼續執行下面這台命令看一下:

echo '/var/lib/docker/volumes/web/' > /var/lib/docker/volumes/web/_data/index.html

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)18

然後再次訪問:

docker實現的是哪個級别的隔離(帶你了解Docker的Volume是什麼)19

此時,我們在本地修改的數據已經同步到了容器裡面了,所以到這裡你看懂這個volume了嗎?

還是不懂的話你可以把這個主機的volume雲服務器裡面的一個數據盤,即使雲服務器(容器)銷毀了,數據盤的數據不會随着雲服務器(容器)的銷毀而消失,這就是數據持久化,同時,volume支持多容器共享一個volume,這在某些場景是非常有用的。

想了解更多Docker、Linux、Python相關知識請關注我吧,也可以留言給我需要了解哪些知識,然後我可以根據你們的需求去定後續的文章!

如果覺得本文對你有幫助,請多多轉發評論,這是對我的一個最大的支持,也是我持續更新的動力,謝謝!

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved