Docker教程:Volume简介
一、前言
通過前面的學(xué)習(xí),我們知道,鏡像是只讀的,容器是在鏡像的基礎(chǔ)上加了一層讀寫層,這樣容器就可以寫了。既然容器可以進(jìn)行寫入了,那么我們就可以把一些數(shù)據(jù)放進(jìn)容器里面。但是這樣會有一種問題:如果容器被刪除了,那么容器里面的數(shù)據(jù)也將會被刪除。這該怎么解決呢?這時(shí)我們就可以使用Volume來解決這種問題。
二、volume
1、什么是volume
我們先來考慮這樣一個(gè)問題:如何把源代碼放進(jìn)容器里面
可以在制作鏡像時(shí)直接把源代碼嵌入里面。(不考慮這種方式)
把源代碼掛載到容器的可讀寫層。
那么什么是Volume呢?
Volume(卷)是容器中一個(gè)特別種類的目錄,通常叫做數(shù)據(jù)volume,顧名思義,里面可以放置各種類型的數(shù)據(jù),例如代碼、日志文件、數(shù)據(jù)文件等等。
Volume可以在容器間被共享和復(fù)用。可以讓多個(gè)容器對同一個(gè)volume進(jìn)行讀寫,也可以讓一個(gè)容器讀寫多個(gè)volume。
對鏡像的更新并不會影響volume。
Volume是被持久化的,即使容器被刪除,它仍然存在。
我們可以用下面的一張圖來理解Volume
藍(lán)色的部分表示容器,淺綠色的部分表示volume。可以在容器里面定義一個(gè)Volume,在容器里面的路徑定義為/var/www,這里的路徑是任意的。如果我們想把源代碼寫到/var/www路徑里面,這個(gè)路徑不應(yīng)該是在容器里面,應(yīng)該是在容器外部,否則容器被刪除了,里面的數(shù)據(jù)也就隨之被刪除。
在來看下面一張圖
在上圖中,我們在容器里面的/var/www路徑里面寫入了一些東西,而這個(gè)路徑就是Docker宿主里面掛載的一個(gè)文件夾。我們用上面的截圖來說明,容器里面的/var/www的路徑就是對于的docker宿主里面的/mnt路徑,這個(gè)路徑也是可以自定義的。 如果使用的是Linux操作系統(tǒng)或者Windows Server2016及以上版本的操作系統(tǒng),這里的Docker宿主機(jī)就是操作系統(tǒng)。而在Windows10上面,其實(shí)是使用的一個(gè)Linux的虛擬機(jī),這時(shí)的Docker宿主機(jī)是Linux虛擬機(jī)。
我們往容器的/var/www路徑里面寫入東西,其實(shí)是寫入到了Docker宿主的/mnt路徑下面,這樣即使把容器刪除掉了,數(shù)據(jù)還是會保存在Docker的宿主里面。除非docker宿主機(jī)的文件也被刪除了,否則數(shù)據(jù)就會一直存在。
看下面的一個(gè)例子
docker run --name=nginx -d -p 4030:80 -v /var/www nginx
對上面命令的解釋:
-v:表示在容器里面創(chuàng)建一個(gè)volume。指定容器里面創(chuàng)建的volume路徑是/var/www,也就是路徑的別名。這里沒有指定docker宿主機(jī)里面的路徑,docker就會在宿主機(jī)里面自動指定一個(gè)路徑
如圖所示
我們看到這個(gè)容器已經(jīng)在運(yùn)行了。我們使用inspect命令查看容器信息
docker inspect nginx
這里使用的是容器名稱,也可以使用容器ID。
我們查看Mounts節(jié)點(diǎn)信息
在這個(gè)節(jié)點(diǎn)里面,我們可以看到容器里面的地址和Docker宿主機(jī)里面的地址。
我們進(jìn)入Docker宿主機(jī)的目錄查看
在docker的宿主機(jī)里面就可以看到自動生成的路徑了。
上面的例子中,我們是使用的Docker自動生成的路徑,我們還可以自定義寫入路徑。
我們在demo目錄下面創(chuàng)建一個(gè)MyVolumn目錄,然后把容器里面的路徑指定到創(chuàng)建的MyVolumn目錄
然后在執(zhí)行下面的命令
docker run --name=nginx -d -p 4030:80 -v /demo/MyVolumn:/var/www nginx
對上面命令的解釋如下
/demo/MyVolumn:表示Docker宿主機(jī)定義的目錄。
/var/www:表示容器里面的目錄。
如圖所示
我們在使用inspect命令查看
查看Mounts節(jié)點(diǎn)
這里就是我們自定義的路徑了。
2、寫入操作
上面的兩個(gè)例子中都沒有數(shù)據(jù)寫入操作,我們只看到生成了路徑,不能知道路徑下面有沒有數(shù)據(jù)生成。下面看一個(gè)有寫入操作的例子,通過這個(gè)例子,我們可以更直觀地明白volume的作用。
我們使用VS2019創(chuàng)建一個(gè)ASP.NET Core MVC項(xiàng)目,然后在Program的Main方法里面寫日志
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
namespace VolumnDemo
{
public class Program
{
public static void Main(string[] args)
{
// 寫文件,模擬寫入功能
using(StreamWriter sw=new StreamWriter(@"/var/www/text.txt",true))
{
sw.WriteLine("test");
sw.Close();
}
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
然后添加Dockerfile文件,項(xiàng)目在本地發(fā)布之后拷貝到Linux服務(wù)器上面。這里不在演示。
我們創(chuàng)建一個(gè)VolumnDemo目錄
然后把剛才的項(xiàng)目拷貝到這個(gè)目錄下面
使用下面的命令來構(gòu)建一個(gè)鏡像
docker build -t volumndemo .
如圖所示
鏡像構(gòu)建成功以后運(yùn)行容器,volume目錄指向MyVolumn目錄
docker run --name=volumndemo -d -p 9020:80 -v /demo/MyVolumn:/var/www volumndemo
如圖所示
然后我們在瀏覽器里面訪問9020端口
查看/demo/MyVolumn目錄里面有沒有文件生成
可以看到生成了text.txt文件。然后查看文件內(nèi)容
我們在進(jìn)入容器里面查看/var/www目錄下面有沒有文件生成
可以看到,www目錄下面也有了text.txt文件生成。這個(gè)路徑是在隱藏目錄里面,所以要使用ls -a命令查看所有的目錄,包括隱藏目錄。
我們查看text.txt文件內(nèi)容
這樣就實(shí)現(xiàn)了容器里面的目錄和docker宿主機(jī)目錄的映射。 可以保證數(shù)據(jù)不丟失。
總結(jié)
以上是生活随笔為你收集整理的Docker教程:Volume简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux:减号(-)详解
- 下一篇: JAVA zip解压 MALFORMED