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 参数将宿主机的目录和容器内的目录关联起来时,默认会用宿主机的目录替换容器内部的目录数据,使用该种方式,需要注意空挂载现象。
相关文章:
Docker-Volume数据卷详讲
Docker数据卷-Volume 一:Volume是什么,用来做什么的 当删除docker容器时,容器内部的文件就会跟随容器所销毁,在生产环境中我们需要将数据持久化保存,就催生了将容器内部的数据保存在宿主机的需求,volume …...
SpringMVC 配置
一、MVC 模式简介 在软件开发的广袤天地中,MVC 模式宛如一座明亮的灯塔,指引着开发者构建高效、可维护的应用程序。Spring MVC 作为基于 Spring 框架的重要 web 开发模块,更是将 MVC 模式的优势发挥得淋漓尽致,堪称 Servlet 的强…...
Python 3.8 Requests 爬虫教程(2025最新版)
遵守网站的爬虫规则、避免爬取敏感信息、保护个人隐私! 一、环境配置与基础验证 # 验证 Python 版本(需 ≥3.8) import sys print(sys.version) # 应输出类似 3.8.12 的信息# 安装 requests 库(若未安装) # 命令行执…...
蓝桥杯备考之 最长上升子序列问题(挖地雷)
这道题其实就是正常的最长上升子序列问题,但是我们还要把最优方案输出出来,我们可以用个pre数组来维护就行了,每当我们更新以i为结尾的最长子序列,如果i是接在1到i-1某个点后面的话就把前面的点存到pre里面 最后我们把pre倒着打印…...
华为OD机试2025A卷 - 游戏分组/王者荣耀(Java Python JS C++ C )
最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 2020年题: 英雄联盟是一款十分火热的对战类游戏。每一场对战有10位玩家参与,分为两组,每组5人。每位玩家都有一个战斗力,代表着这位玩家的厉害程度。为了对战尽可能精彩,我们需要…...
【Python Cookbook】字符串和文本(二)
字符串和文本(二) 6.字符串忽略大小写的搜索替换7.最短匹配模式8.多行匹配模式9.将 Unicode 文本标准化10.在正则式中使用 Unicode 6.字符串忽略大小写的搜索替换 你需要以忽略大小写的方式搜索与替换文本字符串。 为了在文本操作时忽略大小写…...
Redisson 实现分布式锁简单解析
目录 Redisson 实现分布式锁业务方法:加锁逻辑LockUtil 工具类锁余额方法:工具类代码枚举代码 RedisUtil 工具类tryLock 方法及重载【分布式锁具体实现】Supplier 函数式接口调用分析 Redisson 实现分布式锁 业务方法: 如图,简单…...
六十天Linux从0到项目搭建(第五天)(file、bash 和 shell 的区别、目录权限、默认权限umask、粘滞位、使用系统自带的包管理工具)
1. file [选项] 文件名 用于确定文件类型的实用工具。它会通过分析文件内容(而不仅仅是文件扩展名)来判断文件的实际类型 示例输出解析 $ file /bin/bash /bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, i…...
信源的分类及数学模型
信源的分类及数学模型 按照信源发出的时间和消息分布分为离散信源和连续信源 按照信源发出符号之间的关系分为无记忆信源和有记忆信源 单符号离散信源(一维离散信源) 信源输出的消息数有限或可数,且每次只输出符号集的一个消息 样本空间&…...
嵌入式硬件工程师从小白到入门-PCB绘制(二)
PCB绘制从小白到入门:知识点速通与面试指南 一、PCB设计核心流程 需求分析 明确电路功能(如电源、信号处理、通信)。确定关键参数(电压、电流、频率、接口类型)。 原理图设计 元器件选型:匹配封装、电压、…...
抽象工厂设计模式及应用案例
引言 在软件开发中,合理的设计模式可以有效地提高代码的可维护性、可扩展性和可重用性。抽象工厂模式(Abstract Factory Pattern)便是一个重要的创建型设计模式,它允许我们在不指定具体类的情况下,创建一系列相关或相…...
LVS NAT模式实现三台RS的轮询访问
节点规划: 配置RS: RS1-RS3的网关配置均为 192.168.163.8 配置RS1: [rootlocalhost ~]# hostnamectl hostname rs1 [rootlocalhost ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.163.7/24 ipv4.gateway 192.168.163.8 conne…...
LSM-Tree(Log-Structured Merge-Tree)详解
1. 什么是 LSM-Tree? LSM-Tree(Log-Structured Merge-Tree)是一种 针对写优化的存储结构,广泛用于 NoSQL 数据库(如 LevelDB、RocksDB、HBase、Cassandra)等系统。 它的核心思想是: 写入时只追加写(Append-Only),将数据先写入内存缓冲区(MemTable)。内存数据满后…...
uni-app jyf-parser将字符串转化为html 和 rich-text
uni-app jyf-parser将字符串转化为html-CSDN博客 方法二: rich-text | uni-app...
Docker+Ollama+Xinference+RAGFlow+Dify部署及踩坑问题
目录 一、Xinference部署 (一)简介 (二)部署 (三)参数 (四)错误问题 (五)Xinference配置Text-embedding模型 (六)Xinference配…...
CentOS 7 搭建基于匿名用户的 FTP 服务
1. 安装 VSFTPD yum install vsftpd -y 2. 配置 VSFTPD 编辑主配置文 vi /etc/vsftpd/vsftpd.conf 以下配置项存在或修改为对应值 anonymous_enableYES # 启用匿名用户 local_enableNO # 禁用本地用户 write_enableYES # 允许写入(若需要匿名上传࿰…...
【机器学习】什么是线性回归?
什么是线性回归? 线性回归是一种 监督学习算法,它通过拟合一个直线(或平面,高维空间下是超平面)来建立 输入特征 和 输出目标 之间的关系。简单来说,线性回归就是找出一个数学方程(通常是线性方…...
零、ubuntu20.04 安装 anaconda
1.anaconda下载 地址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择:Anaconda3-2023.07-2-Linux-x86_64.sh 2.anaconda安装 选择下载目录,选在在终端中打开,然后在终端输入安装命…...
Web纯前端实现在线打开编辑保存PPT幻灯片
很多项目中有时会需要在线打开PPT并编辑保存到服务器。猿大师办公助手可以完美调用本地office在线打开ppt文件,跟本地打开效果一样。还可以在线打开word、excel、pdf等文件,支持本机OFFICE完整嵌入模式,本机OFFICE所有功能基本都可以在网页上…...
LeetCode热题100精讲——Top3:最长连续序列【哈希】
你好,我是安然无虞。 文章目录 题目背景最长连续序列C解法Python解法 题目背景 如果大家对于 哈希 类型的概念并不熟悉, 可以先看我之前为此专门写的算法详解: 蓝桥杯算法竞赛系列第九章巧解哈希题,用这3种数据类型足矣 最长连续序列 题目链接&#x…...
vue2相关 基础命令
vue2 基础命令 vue简介,Vue 2 已于 2023 年 12 月 31 日停止维护。详见 Vue 2 终止支持 (EOL)。 安装完 Visual Studio Code后,打开项目目录, 在目录位置输入cmd,然后在命令行输入 code . 就可以在VScode打开项目。 公司的前后端…...
2025年渗透测试面试题总结-某 长亭(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 长亭 一、Spring SpEL表达式注入漏洞 1. 技术原理 2. 利用条件 3. 攻击方法 4. 防御策略 二、Jav…...
【web3】
检测钱包是否安装 方法一 // npm install metamask/detect-provider import detectEthereumProvider from metamask/detect-provider// 检测钱包是否安装 const isProvider await detectEthereumProvider() if(!isProvider) {proxy.$modal.msgError("请安装钱包")…...
Ubuntu部署Dufs文件服务器
安装dufs 安装cargo apt install cargo升级rust工具链 apt install rustup rustup update stable查看rust版本,需要>1.81 rustc --version安装dufs cargo install dufs将dufs加入环境变量 sudo vim ~/.bashrc export PATH"$HOME/.cargo/bin:$PATH" sou…...
速卖通API数据清洗实战:从原始JSON到结构化商品数据库
下面将详细介绍如何把速卖通 API 返回的原始 JSON 数据清洗并转换为结构化商品数据库。 1. 数据获取 首先要借助速卖通 API 获取商品数据,以 Python 为例,可使用requests库发送请求并得到 JSON 数据。 import requests# 替换为你的 API Key 和 Secret …...
前端模拟 websocket 请求小工具
背景: 后端写好websocket 接口后,用postman的某些版本无法直接模拟websocket请求,所以想着自制一个小工具。 使用方法: 直接复制以下代码到文本文件中,修改服务端端地址,保存为 .html的后缀名,…...
docker安装hyperf环境,连接本机redis问题处理
错误信息显示“Connection refused”,这通常说明 Docker 容器内的 Hyperf 项目无法连接到你本机的 Redis 服务。 1. 容器内的 127.0.0.1 指向问题 在 Docker 容器中,127.0.0.1 指的是容器本身,而不是宿主机(你的 Mac)…...
【极速版 -- 大模型入门到进阶】快速了解大型语言模型
文章目录 🌊 大模型作为一种生成式人工智慧,厉害在哪儿?-> 通用能力🌊 LLM 如何生成输出:简而言之就是文字接龙🌊 GPT 之前 ...:模型规模和数据规模概览🌊 ChatGPT 有三个训练阶段…...
精选10个好用的WordPress免费主题
10个好用的WordPress免费主题 1. Astra Astra 是全球最受欢迎的 WordPress 主题。它功能丰富,易于使用,SEO友好,是第一个安装量突破100万的非默认主题,并获得了5000多个五星好评。 它完美集成了Elementor、Beaver,古…...
算法日常刷题笔记(6)
重整旗鼓 第六篇笔记 第一天 使字符串平衡的最小交换次数 给你一个字符串 s ,下标从 0 开始 ,且长度为偶数 n 。字符串 恰好 由 n / 2 个开括号 [ 和 n / 2 个闭括号 ] 组成。 只有能满足下述所有条件的字符串才能称为 平衡字符串 : 字符串…...
