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.mzph.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…