網站首頁 編程語言 正文
一、前言
我們知道,鏡像是只讀的,容器是在鏡像的基礎上加了一層讀寫層,這樣容器就可以寫了。既然容器可以進行寫入了,那么我們就可以把一些數據放進容器里面。但是這樣會有一種問題:如果容器被刪除了,那么容器里面的數據也將會被刪除。這該怎么解決呢?這時我們就可以使用Volume來解決這種問題。
二、volume
1、什么是volume
我們先來考慮這樣一個問題:如何把源代碼放進容器里面
- 可以在制作鏡像時直接把源代碼嵌入里面。(不考慮這種方式)
- 把源代碼掛載到容器的可讀寫層。
那么什么是Volume呢?
- Volume(卷)是容器中一個特別種類的目錄,通常叫做數據volume,顧名思義,里面可以放置各種類型的數據,例如代碼、日志文件、數據文件等等。
- Volume可以在容器間被共享和復用。可以讓多個容器對同一個volume進行讀寫,也可以讓一個容器讀寫多個volume。
- 對鏡像的更新并不會影響volume。
- Volume是被持久化的,即使容器被刪除,它仍然存在。
我們可以用下面的一張圖來理解Volume
藍色的部分表示容器,淺綠色的部分表示volume。可以在容器里面定義一個Volume,在容器里面的路徑定義為/var/www,這里的路徑是任意的。如果我們想把源代碼寫到/var/www路徑里面,這個路徑不應該是在容器里面,應該是在容器外部,否則容器被刪除了,里面的數據也就隨之被刪除。
在來看下面一張圖
在上圖中,我們在容器里面的/var/www路徑里面寫入了一些東西,而這個路徑就是Docker宿主里面掛載的一個文件夾。我們用上面的截圖來說明,容器里面的/var/www的路徑就是對于的docker宿主里面的/mnt路徑,這個路徑也是可以自定義的。 如果使用的是Linux操作系統或者Windows Server2016及以上版本的操作系統,這里的Docker宿主機就是操作系統。而在Windows10上面,其實是使用的一個Linux的虛擬機,這時的Docker宿主機是Linux虛擬機。
我們往容器的/var/www路徑里面寫入東西,其實是寫入到了Docker宿主的/mnt路徑下面,這樣即使把容器刪除掉了,數據還是會保存在Docker的宿主里面。除非docker宿主機的文件也被刪除了,否則數據就會一直存在。
看下面的一個例子
docker run --name=nginx -d -p 4030:80 -v /var/www nginx
對上面命令的解釋:
- -v:表示在容器里面創建一個volume。指定容器里面創建的volume路徑是/var/www,也就是路徑的別名。這里沒有指定docker宿主機里面的路徑,docker就會在宿主機里面自動指定一個路徑
如圖所示
我們看到這個容器已經在運行了。我們使用inspect命令查看容器信息
docker inspect nginx
這里使用的是容器名稱,也可以使用容器ID。
我們查看Mounts節點信息
在這個節點里面,我們可以看到容器里面的地址和Docker宿主機里面的地址。
我們進入Docker宿主機的目錄查看
在docker的宿主機里面就可以看到自動生成的路徑了。
上面的例子中,我們是使用的Docker自動生成的路徑,我們還可以自定義寫入路徑。
我們在demo目錄下面創建一個MyVolumn目錄,然后把容器里面的路徑指定到創建的MyVolumn目錄
然后在執行下面的命令
docker run --name=nginx -d -p 4030:80 -v /demo/MyVolumn:/var/www nginx
對上面命令的解釋如下
- /demo/MyVolumn:表示Docker宿主機定義的目錄。
- /var/www:表示容器里面的目錄。
如圖所示
我們在使用inspect命令查看
查看Mounts節點
這里就是我們自定義的路徑了。
2、寫入操作
上面的兩個例子中都沒有數據寫入操作,我們只看到生成了路徑,不能知道路徑下面有沒有數據生成。下面看一個有寫入操作的例子,通過這個例子,我們可以更直觀地明白volume的作用。
我們使用VS2019創建一個ASP.NET Core MVC項目,然后在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文件,項目在本地發布之后拷貝到Linux服務器上面。這里不在演示。
我們創建一個VolumnDemo目錄
然后把剛才的項目拷貝到這個目錄下面
使用下面的命令來構建一個鏡像
docker build -t volumndemo .
如圖所示
鏡像構建成功以后運行容器,volume目錄指向MyVolumn目錄
docker run --name=volumndemo -d -p 9020:80 -v /demo/MyVolumn:/var/www volumndemo
如圖所示
然后我們在瀏覽器里面訪問9020端口
查看/demo/MyVolumn目錄里面有沒有文件生成
可以看到生成了text.txt文件。然后查看文件內容
我們在進入容器里面查看/var/www目錄下面有沒有文件生成
可以看到,www目錄下面也有了text.txt文件生成。這個路徑是在隱藏目錄里面,所以要使用ls -a命令查看所有的目錄,包括隱藏目錄。
我們查看text.txt文件內容
這樣就實現了容器里面的目錄和docker宿主機目錄的映射。 可以保證數據不丟失。
原文鏈接:https://www.cnblogs.com/dotnet261010/p/12609790.html
相關推薦
- 2024-03-06 Maven終端命令生成Spring-boot項目并輸出“helloworld“
- 2022-08-03 C++單例設計模式詳細講解_C 語言
- 2022-11-12 Python創建SQL數據庫流程逐步講解_python
- 2023-07-02 Golang?time.Sleep()用法及示例講解_Golang
- 2022-06-16 Zabbix自定義腳本監控nginx以及微信告警的全過程_zabbix
- 2022-12-09 react?hooks?UI與業務邏輯分離必要性技術方案_React
- 2022-04-27 分布式Redis?Cluster集群搭建與Redis基本用法_Redis
- 2024-01-30 MongoDB 聚合查詢在數據統計中的應用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支