Docker-Volume數據卷詳講

Docker數據卷-Volume

一:Volume是什么,用來做什么的

當刪除docker容器時,容器內部的文件就會跟隨容器所銷毀,在生產環境中我們需要將數據持久化保存,就催生了將容器內部的數據保存在宿主機的需求,volume 就是被設計用于解決容器與主機之間、容器與容器之間共享文件,容器中數據的持久化,容器中的數據備份、遷移、恢復。

在這里插入圖片描述

二:Volume如何使用

在執行 docker run 命令的時候,使用-v參數用于指定數據卷,可以完成數據卷掛載。數據卷卷可以是命名的,也可以是匿名的。匿名卷被賦予一個隨機名稱,該名稱保證在給定的 Docker 主機內是唯一的。與命名卷一樣,即使您刪除使用它們的容器,匿名卷也會保留下來,除非您--rm在創建容器時使用該標志,在這種情況下與容器關聯的匿名卷將被銷毀。

匿名數據卷的使用

在啟動容器的時候只指定容器內部的路徑,不寫宿主機路徑。如下:

lemon@DockerVolume:~$ docker run -d -p 8888:80 -v /usr/share/nginx/html --name nginx-volume nginx:latest
37d8c80f337d3a98d3470855fba5009625285e742acd268b42bbe3f969cd25a8
lemon@DockerVolume:~$

該命令將創建一個名稱為nginx-volume的Nginx容器,其中 -v 僅寫了容器內的路徑,并未提供卷名,使用命令 docker inspect nginx-volume | grep -A 11 “Mounts” 查看其掛載信息。

lemon@DockerVolume:~$ docker inspect nginx-volume | grep -A 11 "Mounts""Mounts": [{"Type": "volume","Name": "538688015ecc44b37c36861c07bff24f7330b06a2d8dd396d4980a9594de461d","Source": "/var/lib/docker/volumes/538688015ecc44b37c36861c07bff24f7330b06a2d8dd396d4980a9594de461d/_data","Destination": "/usr/share/nginx/html","Driver": "local","Mode": "","RW": true,"Propagation": ""}],
lemon@DockerVolume:~$

通過查詢掛載信息可知,該容器掛載了一個名稱為一段哈希串的volume類型的,其在宿主的存儲位置在:/var/lib/docker/volumes/538688015ecc44b37c36861c07bff24f7330b06a2d8dd396d4980a9594de461d/_data 目錄下,掛載的是容器內的路徑:/usr/share/nginx/html

命名數據卷的使用

在啟動容器的時候指定卷名,并綁定容器內部的路徑。如下:

lemon@DockerVolume:~$ docker run -d -p 8800:80 -v nginx_dir:/usr/share/nginx/html --name nginx-volume2 nginx:latest
2501c7eeab6484acf05dbc0de901fec2472835e1bc947af046a711352e153e0b
lemon@DockerVolume:~$

該命令將創建一個名稱為nginx-volume2的Nginx容器,其中 -v 提供了卷名和容器內的路徑映射關系,使用命令 docker inspect nginx-volume2 | grep -A 11 “Mounts” 查看其掛載信息。

lemon@DockerVolume:~$ docker inspect nginx-volume2 | grep -A 11 "Mounts""Mounts": [{"Type": "volume","Name": "nginx_dir","Source": "/var/lib/docker/volumes/nginx_dir/_data","Destination": "/usr/share/nginx/html","Driver": "local","Mode": "z","RW": true,"Propagation": ""}],
lemon@DockerVolume:~$

通過查詢掛載信息可知,該容器掛載了一個名稱為 nginx_dir 的volume類型的,其在宿主的存儲位置在:/var/lib/docker/volumes/nginx_dir/_data 目錄下,掛載的是容器內的路徑:/usr/share/nginx/html

通過這兩個示例發現不管是命名數據卷還是匿名數據卷,其存儲位置都在 /var/lib/docker/volumes/<數據卷名稱>/_data 目錄下,且掛載類型均為 volume ,那還有沒有其他的類型的數據卷掛載嗎,或者說我想指定存儲到宿主機的其他位置呢,比如,我希望將容器nginx-volume3 的目錄指定到/home/lemon/docker_nginx_data/ 目錄之下,我的/var/lib/docker目錄存儲在 / 根分區下,其存儲空間太小,希望將數據挪動到更大的目錄 /home/ 分區下。

下面我將來介紹其他的兩種類型文件綁定方式

三:docker存儲的三種類型

如果希望將容器nginx-volume3 的目錄/usr/share/nginx/html 指定到/home/lemon/docker_nginx_data/ 目錄之下,就需要需用到如下的方式去指定掛載:

-v /home/lemon/docker_nginx_data:/usr/share/nginx/html

示例如下:

lemon@DockerVolume:~$ docker run -d -p 8801:80 -v /home/lemon/docker_nginx_data:/usr/share/nginx/html --name nginx-volume3 nginx:latest
016a57e9a5f419647b87fc603d966357644f12a71b0265f2b3d2eb12e1453877
lemon@DockerVolume:~$

使用命令 docker inspect nginx-volume3 | grep -A 11 “Mounts” 查看其掛載信息。

lemon@DockerVolume:~$ docker inspect nginx-volume3 | grep -A 11 "Mounts""Mounts": [{"Type": "bind","Source": "/home/lemon/docker_nginx_data","Destination": "/usr/share/nginx/html","Mode": "","RW": true,"Propagation": "rprivate"}],"Config": {"Hostname": "016a57e9a5f4",
lemon@DockerVolume:~$

通過查詢掛載信息可知,該容器將宿主機的/home/lemon/docker_nginx_data目錄與容器的/usr/share/nginx/html掛載了起來。與上面的兩個類型相比較,我們發現其Type 參數類型為 bind,與上面的兩種方式的 volume 類型不同。

此處我們來看一下volume與bind兩種類型優缺點:

對比項Volume(卷)Bind (綁定掛載)
存儲位置Docker 統一管理,默認存放在 /var/lib/docker/volumes/直接使用宿主機上的指定目錄
創建方式通過 docker volume create 創建,Docker 負責管理需要手動指定宿主機路徑
適用場景推薦用于持久化存儲,如數據庫、日志等適用于開發環境,可直接訪問宿主機文件
容器間共享容易共享,多個容器可以掛載同一個 Volume手動管理,需要確保宿主機目錄存在
安全性更安全,容器無法直接訪問宿主機風險較高,容器可能影響宿主機數據
性能一般更快,Docker 進行了優化可能受文件系統性能影響
跨平臺可以跨主機(NFS 等),便于遷移和備份僅限本地,受宿主機文件系統影響

此處之外的區別,bind類型會存在空掛載的問題,比如上面的容器nginx-volume3我們在瀏覽器中訪問一下

在這里插入圖片描述

會發現該容器無法訪問Nginx的歡迎頁,具體原由就出現在空掛載上,如果bind類型掛載的宿主機路徑為空,則會將容器內的掛載路徑變為空,該特性適用于將宿主機上的配置文件替換容器內部的配置文件,也在一定程度上適用與容器文件遷移或者文件備份,但是前提條件遷移的目標地址最好是相同的宿主機系統,例如Linux系統遷移至Linux,Windows系統遷移至Windows。跨系統遷移會在一定程度上可能導致文件不能使用。

除了bind類型以外,還有一個不太常用的tmpfs類型,用于將容器內的路徑指定到宿主機的內存上,通常用于一些高性能的文件讀寫環境下,例如將MySQL的數據庫指定到內存當中,以增加緩存刷盤速度,或者用于創建一個高速寫入的緩存路徑。

示例如下:

lemon@DockerVolume:~$ docker run -d -p 8802:80 --mount type=tmpfs,destination=/app --name nginx-volume4 nginx:latest
44354dea5bcbc588d44e795e60fc44200f7edcff20f289c7fb8a7efae2227c4e
lemon@DockerVolume:~$
lemon@DockerVolume:~$ docker inspect nginx-volume4 | grep -A 11 "Mounts""Mounts": [{"Type": "tmpfs","Target": "/app"}],"MaskedPaths": ["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats",
--"Mounts": [{"Type": "tmpfs","Source": "","Destination": "/app","Mode": "","RW": true,"Propagation": ""}]
lemon@DockerVolume:~$

通過查詢掛載信息可以發現,tmpfs類型沒有在宿主機上指定路徑,是因為我們指定到了內存當中。

三種類型掛載的的位置

在這里插入圖片描述

三種類型其本質是,掛載的宿主機文件系統的位置不同。

四:-v--mount參數的區別

-v 只能掛載2種形式 bind,volume

–mount 可以掛載3種形式 bind,volume,tmpfs

兩者在功能上是等效的,但–mount更為靈活,適用于更復雜的掛載需求,使用哪種方式主要取決與具體的使用場景。如果你只需要簡單的將主機上的目錄掛載到容器內,-v參數足夠簡便,如果需要更多掛載選項,推薦使用–mount參數。

五:docker -v的四種用法

1. 不使用-v參數

示例:

lemon@DockerVolume:~/myfile$ docker run -d -p 8803:80 --name nginx-volume5 nginx:latest
bbecec9a49e86319ea239bed3227b54ae00ef514964ed70b9f4e4464cb547ac2
lemon@DockerVolume:~/myfile$ docker inspect nginx-volume5 | grep "Mounts""Mounts": [],
lemon@DockerVolume:~/myfile$

當不使用-v參數時,容器也不會在宿主機上創建volume,此時當容器刪除,數據也會跟隨刪除。

2. -v <容器內路徑>

示例:

lemon@DockerVolume:~/myfile$ docker run -d -p 8804:80 -v /usr/share/nginx/html --name nginx-volume6 nginx:latest
aa30246d69a549c21343b8ef4e7cf94f20c9e4e2a2dbcd3fa3af174b7c39dc7c
lemon@DockerVolume:~/myfile$ docker inspect nginx-volume6 | grep -A 15 "Mounts""Mounts": [{"Type": "volume","Name": "61e5198338d2fffafafe9f1bad51c67c2570506d63124c62355bc4e0e6bea5ef","Source": "/var/lib/docker/volumes/61e5198338d2fffafafe9f1bad51c67c2570506d63124c62355bc4e0e6bea5ef/_data","Destination": "/usr/share/nginx/html","Driver": "local","Mode": "","RW": true,"Propagation": ""}],"Config": {"Hostname": "aa30246d69a5","Domainname": "","User": "",
lemon@DockerVolume:~/myfile$

當 -v 參數僅指定容器內的路徑時,將創建一個匿名類型的volume,用于存儲容器的數據。

3. -v < Volume 名稱>:/<容器內路徑>

示例:

lemon@DockerVolume:~$ docker run -d -p 8805:80 -v NginxVolume7_VolumeName:/usr/share/nginx/html --name nginx-volume7 nginx:latest
d74098d3c4ec7af671e2ab6cd50f9bae51b33fa9fc4100f5adaa380463a062b5
lemon@DockerVolume:~$ docker inspect nginx-volume7 | grep -A 15 "Mounts""Mounts": [{"Type": "volume","Name": "NginxVolume7_VolumeName","Source": "/var/lib/docker/volumes/NginxVolume7_VolumeName/_data","Destination": "/usr/share/nginx/html","Driver": "local","Mode": "z","RW": true,"Propagation": ""}],"Config": {"Hostname": "d74098d3c4ec","Domainname": "","User": "",
lemon@DockerVolume:~$

當 -v 參數指定一個不存在volume時,在創建容器時,docker會自動創建該volume,這兩種類型的 -v 指定掛載方式,不會存在空掛載現象。

4. -v <宿主機路徑>:<容器內路徑>

示例:

lemon@DockerVolume:~$ docker run -d -p 8806:80 -v /home/lemon/nginx_volume8_dir:/usr/share/nginx/html --name nginx-volume8 nginx:latest
df36b3ee868d2e4573b4cb7dd1a1abfafbff4052f102417169b84b152c010c44
lemon@DockerVolume:~$ docker inspect nginx-volume8 | grep -A 15 "Mounts""Mounts": [{"Type": "bind","Source": "/home/lemon/nginx_volume8_dir","Destination": "/usr/share/nginx/html","Mode": "","RW": true,"Propagation": "rprivate"}],"Config": {"Hostname": "df36b3ee868d","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,
lemon@DockerVolume:~$

當 -v 參數將宿主機的目錄和容器內的目錄關聯起來時,默認會用宿主機的目錄替換容器內部的目錄數據,使用該種方式,需要注意空掛載現象。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73338.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73338.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73338.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單片機和微控制器知識匯總——《器件手冊--單片機、數字信號處理器和可編程邏輯器件》

目錄 四、單片機和微控制器 4.1 單片機(MCU/MPU/SOC) 一、定義 二、主要特點 三、工作原理 四、主要類型 五、應用領域 六、選型與設計注意事項 七、發展趨勢 4.2 數字信號處理器(DSP/DSC) ?編輯?編輯 一、定義 二、工作原理 三、結構特點 四、應用領域 五、選型與設計注…

macOS 安裝 Miniconda

macOS 安裝 Miniconda 1. Quickstart install instructions2. 執行3. shell 上初始化 conda4. 關閉 終端登錄用戶名前的 base參考 1. Quickstart install instructions mkdir -p ~/miniconda3 curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o…

高數下---8.1平面與直線

目錄 平面的確定 直線的確定 若要求某一直線或平面就根據要素來求。 例題 平面中的特殊情況 平面中的解題思路 直線的解題思路 平面的確定 兩要素 一 一點 二 傾斜角 即法向量 點法式 可化為一般式 Ax By Cz D 0; (A,B,C) 即法向量&#xff1b; 改變D 即…

CMS遷移中SEO優化整合步驟詳解

內容概要 在CMS遷移過程中&#xff0c;系統化的規劃與執行是保障SEO排名穩定性的核心。首先需明確遷移流程的關鍵階段&#xff0c;包括數據備份、URL適配、元數據同步及安全配置等環節。其中&#xff0c;數據備份不僅需覆蓋原始數據庫與靜態資源&#xff0c;還需驗證備份文件的…

存儲過程、存儲函數與觸發器詳解(MySQL 案例)

存儲過程、存儲函數與觸發器詳解&#xff08;MySQL 案例&#xff09; 一、存儲過程&#xff08;Stored Procedure&#xff09; 定義 存儲過程是預先編譯好并存儲在數據庫中的一段 SQL 代碼集合&#xff0c;可以接收參數、執行邏輯操作&#xff08;如條件判斷、循環&#xff09;…

Python:進程間的通信,進程的操作隊列

進程間的隊列&#xff1a; 隊列的基本操作&#xff1a; 入隊&#xff1a;將數據放到隊列尾部 出隊&#xff1a;從隊列的頭部取出一個元素 maxsize&#xff1a;隊列中能存放數據個數的上限(整數)&#xff0c;一旦達到上限插入會導致阻塞&#xff0c;直到隊列中的數據被消費掉 …

【C++初階】--- 類與對象(中)

1.類的默認成員函數 默認成員函數就是??沒有顯式實現&#xff0c;編譯器會?動?成的成員函數稱為默認成員函數。?個類&#xff0c;我們不寫的情況下編譯器會默認?成以下6個默認成員函數&#xff0c;我們主要需要掌握前4個&#xff0c;后兩個了解以下即可&#xff0c;默認…

python處理音頻相關的庫

1 音頻信號采集與播放 pyaudio import sys import pyaudio import wave import timeCHUNK 1024 FORMAT pyaudio.paInt16 CHANNELS 1#僅支持單聲道 RATE 16000 RECORD_SECONDS 3#更改錄音時長#錄音函數&#xff0c;生成wav文件 def record(file_name):try:os.close(file_…

[M模擬] lc2711. 對角線上不同值的數量差(對角線遍歷+前后綴分解)

文章目錄 1. 題目來源2. 題目解析 1. 題目來源 鏈接&#xff1a;2711. 對角線上不同值的數量差 前置題&#xff1a; [M模擬] lc3446. 按對角線進行矩陣排序(對角線遍歷公式推導模板題) 矩形的對角線遍歷的基礎題。 題單&#xff1a; 待補充 2. 題目解析 2025年03月25日…

設計一個基于機器學習的光伏發電功率預測模型,以Python和Scikit - learn庫為例

下面為你設計一個基于機器學習的光伏發電功率預測模型&#xff0c;以Python和Scikit - learn庫為例。此模型借助歷史氣象數據和光伏發電功率數據來預測未來的光伏發電功率。 模型設計思路 數據收集&#xff1a;收集歷史氣象數據&#xff08;像溫度、光照強度、濕度等&#xf…

洛谷 P1351 [NOIP 2014 提高組] 聯合權值(樹)

題目描述 無向連通圖 G 有 n 個點&#xff0c;n?1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為 Wi?&#xff0c;每條邊的長度均為 1。圖上兩點 (u,v) 的距離定義為 u 點到 v 點的最短距離。對于圖 G 上的點對 (u,v)&#xff0c;若它們的距離為 2&#xff0c;則它們之間…

YoloV8訓練和平精英人物檢測模型

概述 和平精英人物檢測&#xff0c;可以識別游戲中所有人物角色&#xff0c;并通過繪制框將人物選中&#xff0c;訓練的模型僅僅具有識別功能&#xff0c;可以識別游戲中的視頻、圖片等文件&#xff0c;搭配Autox.js可以推理&#xff0c;實現實時繪制&#xff0c;但是對手機性…

智能汽車圖像及視頻處理方案,支持視頻實時拍攝特效能力

在智能汽車日新月異的今天&#xff0c;美攝科技作為智能汽車圖像及視頻處理領域的先行者&#xff0c;憑借其卓越的技術實力和前瞻性的設計理念&#xff0c;為全球智能汽車制造商帶來了一場視覺盛宴的革新。美攝科技推出智能汽車圖像及視頻處理方案&#xff0c;一個集高效性、智…

架構設計之自定義延遲雙刪緩存注解(下)

架構設計之自定義延遲雙刪緩存注解(下) 小薛博客官方架構設計之自定義延遲雙刪緩存注解(下)地址 為了保證Cache和ClearAndReloadCache的靈活性&#xff0c;特意加入EL表達式解析 1、Cache package com.xx.cache;import java.lang.annotation.*; import java.util.concurren…

rosbag|ROS中.bag數據包轉換為matlab中.mat數據類型

代碼見代碼 msg_dict中設置自定義消息類型 test_config中設置需要記錄的具體的值 test_config中topic_name以及message_type照搬plotjuggler打開時的參數 最后生成.mat文件在matlab中進行使用

基于動態 FOF(基金中的基金)策略的基金交易推薦系統的設計與實現思路

下面為你呈現一個基于動態 FOF&#xff08;基金中的基金&#xff09;策略的基金交易推薦系統的設計與實現思路&#xff0c;同時給出一個簡單的 Python 示例代碼。 系統設計 1. 需求分析 收集各類基金的歷史數據&#xff0c;涵蓋凈值、收益率、風險指標等。依據動態 FOF 策略…

搭建主從DNS、nfs、nginx

任務需求&#xff1a; 客戶端通過訪問 www.nihao.com 后&#xff0c;能夠通過 dns 域名解析&#xff0c;訪問到 nginx 服務中由 nfs 共享的首頁文件&#xff0c;內容為&#xff1a;Very good, you have successfully set up the system. 各個主機能夠實現時間同步&#xff0c;…

JS 對象轉數組,數組轉對象

數據格式 objMap : {apiP: 8000, sder: true, host: "1.111", wPort: "1335" }要求&#xff1a;將 objMap 轉化為 數組 const equipArray Object.keys(objMap ).map(key > {return {name: key,value: objMap [key]}打印結果 數組轉為對象 let equipAr…

vue - [Vue warn]: Duplicate keys detected: ‘0‘. This may cause an update error.

問題描述&#xff1a; vue項目中&#xff0c;對表單數組賦值時&#xff0c;控制臺拋出警告&#xff1a; 問題代碼&#xff1a; 問題分析&#xff1a; 1、Vue 要求每個虛擬 DOM 節點必須有唯一的 key。該警告信息通常出現在使用v-for循環的場景中&#xff0c;多個同級節點使用…

DeepSeek V3–0324 vs DeepSeek-V3, 排名最高非推理模型

最近DeepSeek V3 升級。 本文將帶您了解該模型的核心特性、基準表現,以及如何通過Hugging Face推理終端和OpenRouter平臺親身體驗。我們還將通過創意生成與邏輯分析兩大測試案例,直觀展示其卓越性能。 DeepSeek-V3-0324 2025年3月24日,深度求索(DeepSeek)AI正式發布了V3…