【Docker】存储卷Volume

Docker Volume概念

什么是存储卷

存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。

宿主机的/data/web 目录与容器中的/container/data/web 目录绑定关系,然后容器中的进程向这个目录中写数据时,是直接写在宿主机的目录上的,绕过容器文件系统与宿主机的文件系统建立关联关系,使得可以在宿主机和容器内共享数据库内容,让容器直接访问宿主机中的内容,也可以宿主机向容器写入内容, 容器和宿主机的数据读写是同步的。

image-20230717235619277

为什么需要存储卷

数据丢失问题

容器按照业务类型,总体可以分为两类:

  • 无状态的(数据不需要被持久化)
  • 有状态的(数据需要被持久化)

实际业务总是有各种需要数据持久化的场景,比如 MySQL、 Kafka 等有状态的业务。因此为了解决有状态业务的需求, Docker 提出了卷(Volume)的概念。

性能问题

UnionFS 对于修改删除等,一般效率非常低,如果对一于 I/O 要求比较高的应用,如redis 在实现持化存储时,是在底层存储时的性能要求比较高 。

宿主机和容器互访不方便

宿主机访问容器,或者容器访问要通过 docker cp 来完成,应用很难操作。

存储卷分类

目前docker提供了三种方式将数据从宿主机挂载到容器中

volume docker管理卷

volume docker 管理卷,默认映射到宿主机的/var/lib/docker/volumes 目录下, 只需要在容器内指定容器的挂载点是什么。

而被绑定宿主机下的那个目录,是由容器引擎 daemon 自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系。

这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定那些使用目录,临时存储比较适合;

bind mount绑定数据卷

bind mount 绑定数据卷,映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径, 在容器中也需要指定一个特定的路径, 两个已知的路径建立关联关系。

tmpfs mount临时数据卷

tmpfs mount 临时数据卷,映射到于宿主机内存中,一旦容器停止运行, tmpfsmounts 会被移除,数据就会丢失,用于高性能的临时数据存储。

image-20230718001953297

volume docker管理卷

基本命令

创建卷:存储卷可以通过命令方式创建,也可以在创建容器的时候通过 -v and --mount 指定。

基本命令

命令别名功能备注
docker volume create创建存储卷
docker volume inspect显示存储卷详细信息
docker volume lsdocker volume list列出存储卷
docker volume prune清理所有无用数据卷
docker volume rm删除卷,使用中的无法 删除

docker volume create

功能:创建存储卷

语法:

docker volume create [OPTIONS] [VOLUME]

关键参数:

  • -d,–driver:指定驱动,默认是local
  • –lable:指定元数据

创建一个匿名卷

image-20230726001142832

创建一个命名卷

image-20230726001345223

增加标签信息:日期date

image-20230726001814264

docker volume inspect

功能:查看卷详细信息

语法:

docker volume inspect [OPTIONS] VOLUME [VOLUME...]

docker volume ls

功能:列出卷

语法:

docker volume ls [OPTIONS]

关键参数:

  • –format:指定相应格式,比如json,table
  • –filter,-f:过滤
  • -q:仅显示名称

docker rm

功能:删除卷,需要容器没有使用该卷

语法:

docker volume rm [OPTIONS] VOLUME [VOLUME...]

关键参数:

  • -f,–force:强制删除

docker volume prune

功能:删除不使用的本地卷

语法:

docker volume prune [OPTIONS]

关键参数:

  • –filter:过滤
  • -f,–force:不提示是否删除

管理卷创建方式二

-v 和-mount 都可以完成管理卷的创建

-v 参数

• 功能:完成目录映射
• 语法

Shell
docker run -v name:directory[:options] .........

参数
○ 第一个参数:卷名称
○ 第二个参数:卷映射到容器的目录
○ 第三个参数:选项,如 ro 表示 readonly

案例

docker images
docker run -d --name myvolnginx2 -v volnginx2:/usr/share/nginx/html/ nginx:1.21.1  # 创建一个存储卷,并映射到容器myvolnginx2的/usr/share/nginx/html目录下
docker ps
docker volume ls

image-20230813230720661

接下来我们查看volume对应目录下的内容

docker volume inspect volnginx2
ls -l /var/lib/docker/volumes/volnginx2/_data

image-20230813231605439

下面我们进入到容器中,并删除对应目录下的文件。如何查看存储卷对应目录下的内容:

docker exec -it myvolnginx2 bash
cd /usr/share/nginx/html
ls
rm -r *.html
ls
exit
ls -l /var/lib/docker/volumes/volnginx2/_data

image-20230813232021974

存储卷目录下的文件被成功删除,说明容器中的目录成功和宿主机目录关联在一起。

-mount参数

功能:完成目录映射

语法:

--mount '<key>=<value>,<key>=<value>'

关键参数

  • type : 类型表示 bind, volume, or tmpfs
  • source , src :对于命名卷,这是卷的名称。对于匿名卷,省略此字段。
  • destination, dst,target:文件或目录挂载在容器中的路径
  • ro,readonly: 只读方式挂载

样例

docker images nginx
docker run -d --name myvolnginx3 --mount 'src=volnginx3,dst=/usr/share/nginx/hmtl' nginx:1.21.1
docker ps
docker volume inspect volnginx3
ls -l /var/lib/docker/volumes/volnginx3/_data

image-20230813233253046

docker 绑定卷

bind mount 绑定数据卷,映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径, 在容器中也需要指定一个特定的路径, 两个已知的路径建立关联关系。

-v创建绑定卷

功能:完成卷映射
• 语法

docker run -v name:directory[:options] .........

参数
○ 第一个参数: 宿主机目录,这个和管理卷是不一样的;如果是存储卷的名字创建的就是管理卷,如果是存储卷的目录,创建的就是存储卷
○ 第二个参数:卷映射到容器的目录
○ 第三个参数:选项,如 ro 表示 readonly

案例:

docker run -d --name 容器的名字 -v 宿主机目录:容器的目录 镜像id/镜像名称
docker exec -it 容器的名字 bash

–mount 创建绑定卷

功能:完成目录映射
• 语法

--mount '<key>=<value>,<key>=<value>'

关键参数
○ type : 类型表示 bind, volume, or tmpfs
○ source , src : 宿主机目录,这个和管理卷是不一样的。
○ destination, dst,target:文件或目录挂载在容器中的路径
○ ro,readonly: 只读方式挂载

案例

docker run -d --name 容器名 --mount type=bind,src=宿主机目录,target=容器目录 镜像id/镜像名称

docker exec -it 容器的名字 bash

注意事项

  • 使用-mount 方式创建容器: 如果宿主机对应的目录不存在,容器会启动报错;
  • 使用-v 方式创建容器:如果宿主机对应的目录不存在,启动不会报错,这是-
    v 和–mount 方式的区别 ;宿主机会自动创建对应的目录;

docker 临时卷

tmpfs mount 临时数据卷,映射到于宿主机内存中,一旦容器停止运行, tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。

tmpfs 局限性:

  • 因为临时卷是映射到内存中,不同于卷和绑定挂载,因此不能在容器之间共享 tmpfs 挂载。
  • 这个功能只有在 Linux 上运行 Docker 时才可用。

–tmpfs 创建临时卷

功能:完成临时卷映射
语法:

--tmpfs /app

案例

docker run -d --name 容器名 --tmpfs 容器目录

一旦容器重新启动,临时卷的数据就会丢失。

–mount 创建临时卷

功能:完成目录映射

语法:

--mount '<key>=<value>,<key>=<value>

关键参数
○ type : 类型表示 bind, volume, or tmpfs
○ destination, dst,target:挂载在容器中的路径
○ tmpfs-size: tmpfs 挂载的大小(以字节为单位)。默认无限制。
○ tmpfs-mode: tmpfs 的八进制文件模式。例如, 700 或 0770。默认为 1777或全局可写。

案例

docker run -d --name 容器名 --mount type=tmpfs dst=容器目录 镜像名

tmpfs消失现象

实验结论:普通容器是在可写层写入文件,而tmpfs的内容不是存储在容器的可写层里面

步骤一:创建一个普通容器,写入文件,并在宿主机上面查找文件

docker run -d --name tmptest1 nginx:1.21.1
docker ps

# 进入容器
docker exec -it tmptest1 bash
mkdir -p /app
echo 1 > /app/mylabel.txt
exit

find / -name mylabel.txt

image-20230821010442184

我们在宿主机上查找文件,文件被找到了,是因为他在容器的可写层

步骤二:创建一个临时卷,写入文件,并在宿主机上查找文件

docker run -d --name tmptest2 --tmpfs /app nginx:1.21.1
docker ps
# 进入容器
docker exec -it tmptest2 bash
echo 222 > /app/mynewlabel.txt
exit

# 在宿主机上面查找文件
find / -name mynewlabel.txt

image-20230821010908851

所以 tmpfs 的内容不是存储在我们的容器的可写层里面的。

MYSQL灾难恢复

​ 使用 MySQL 5.7 的镜像创建容器并创建一个普通数据卷 mysql-data 用来保存容器中产生的数据。需要在容器中连接 MySQL 服务, 并创建数据库 test, 并在在该数据库中创建一个简单的表并插入一些数据进来。

步骤一:创建数据库容器,并登入数据库

docker run -d --name mysql-demo -e MYSQL_ROOT_PASSWORD=root -p 8200:3306  -v /home/west/myworkdir/mysqldata:/var/lib/mysql mysql:5.7

docker exec -it mysql-demo bash
mysql -u root -p
#这里输入的密码,就是MYSQL_ROOT_PASSWORD后面的值 

-e 选项通过参数 MYSQL_ROOT_PASSWORD 来传递 MySQL 密码

image-20230821013226810

查看挂载信息:

docker container inspect mysql-demo | grep "Mounts" -A 10

image-20230821013249300

步骤二:向数据库中插入数据

create database user;
use user;
create table student(sno char(3), sname varchar(10));
insert into student values('1', 'zs'),('2', 'ls');

select * from student;

image-20230821012643554

在宿主机上面查看volume:

ls -l /home/west/myworkdir/mysqldata

image-20230821013519021

可以看到容器中 MySQL 创建的数据库和表数据以及持久化到宿主机挂载的目录下了

第三步:MYSQL灾难恢复

有一天莫名其妙停电了, 然后服务器重启了,这个时候 Mysql 没有起来;由于磁盘空间不够,把所有停止的容器都删除了。结果我们的 Mysql容器也没有了 ,我们的数据也丢失了。

docker ps
docker stop mysql-demo
docker rm mysql-demo

image-20230821013833583

如何恢复数据?只需要重新启动容器,并挂载相应的管理卷

docker run -d --name mysql-demo -e MYSQL_ROOT_PASSWORD=root -p 8200:3306  -v /home/west/myworkdir/mysqldata:/var/lib/mysql mysql:5.7

# 连接数据库并查看数据是否恢复
docker exec -it mysql-demo bash
mysql -u root -p

image-20230821014322722

可以看到数据成功恢复

Volume面试题

什么时候用 Volume,什么时候用 bind、 tmpfs?

  • volume: volume 是 docker 的宿主机文件系统一部分,用于不需要规划具体目录的场景
  • bind: bind mount 完全是依赖于主机的目录结构和操作系统,用于目录需要提前规划,比如 mysql 的目录需要个空间大的,其他服务有不占用的时候,用 volume 就不太合适了
  • tmpfs:用于敏感文件存储,文件不想存储在宿主机和容器的可写层之中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/87070.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

裂缝检测,只依赖OPENCV,基于YOLO8S

裂缝检测&#xff0c;只依赖OPENCV&#xff0c;YOLOV8S 现在YOLOV8S训练目标非常方便&#xff0c;可以直接转换成ONNX让OPENCV调用&#xff0c;支持C/PYTHON&#xff0c;原理很简单&#xff0c;自己找博客&#xff0c;有兴趣相互交流

数字化技术无限延伸,VR全景点亮智慧生活

随着互联网的发展&#xff0c;我们无时无刻不再享受着互联网给我们带来的便利&#xff0c;数字化生活正在无限延伸&#xff0c;各行各业也开始积极布局智能生活。要说智慧生活哪个方面应用的比较多&#xff0c;那应该就是VR全景了&#xff0c;目前VR全景已经被各个行业广泛应用…

Mesa 23.2 开源图形栈现已可供下载

作为 Mesa 23 系列的第二个重要版本&#xff0c;Mesa 23.2 开源图形栈现已可供下载&#xff0c;它为 AMD GPU 的 RADV Vulkan 驱动程序带来了新功能&#xff0c;改进了 Linux 游戏&#xff0c;并新增了 Asahi 功能。 Mesa 23.2 的亮点包括 Asahi 上的 OpenGL 3.1 和 OpenGL ES …

前端需要理解的HTML知识

HTML&#xff08;超文本标记语言&#xff0c;HyperText Markup Language&#xff09;不是编程语言&#xff0c;而是定义了网页内容的含义和结构的标记语言。。“超文本”&#xff08;hypertext&#xff09;是指连接单个网站内或多个网站间的网页的链接。HTML 使用“标记”&…

怎么检测UI卡顿?(线上及线下)

什么是UI卡顿&#xff1f; 在Android系统中&#xff0c;我们知道UI线程负责我们所有视图的布局&#xff0c;渲染工作&#xff0c;UI在更新期间&#xff0c;如果UI线程的执行时间超过16ms&#xff0c;则会产生丢帧的现象&#xff0c;而大量的丢帧就会造成卡顿&#xff0c;影响用…

无限计算力:探索云计算的无限可能性

这里写目录标题 前言云计算介绍服务模型&#xff1a; 应用领域&#xff1a;云计算主要体现在生活中的地方云计算未来发展的方向 前言 云计算是一种基于互联网的计算模型&#xff0c;通过它可以实现资源的共享、存储、管理和处理。它已经成为许多个人、企业和组织的重要技术基础…

lvs实现DR模型搭建

一&#xff0c;实现DR模型搭建 1&#xff0c; 负载调度器配置 1.1调整ARP参数 vim /etc/sysctl.conf net.ipv4.conf.all.send_redirects 0 net.ipv4.conf.default.send_redirects0 net.ipv4.conf.ens33.send_redirects 0 sysctl -p 1.2 配置虚拟IP地…

UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.1->1.4

目录 1.1-Simple Sprite Emitter ​编辑 发射器更新 粒子生成 粒子更新 1.2-Simple Sprite Emitter 发射器更新 粒子生成 粒子更新 渲染 1.3-Simple GPU Emitter 属性 发射器更新 粒子生成 粒子更新 1.4-Sprite Facing 发射器更新 粒子生成 粒子更新 通过对官方…

opencv进阶19-基于opencv 决策树cv::ml::DTrees 实现demo示例

opencv 中创建决策树 cv::ml::DTrees类表示单个决策树或决策树集合&#xff0c;它是RTrees和 Boost的基类。 CART是二叉树&#xff0c;可用于分类或回归。对于分类&#xff0c;每个叶子节点都 标有类标签&#xff0c;多个叶子节点可能具有相同的标签。对于回归&#xff0c;每…

高品质的运动耳机有哪些、高端运动耳机推荐

随着健康生活理念的广泛普及&#xff0c;对于很多人来说&#xff0c;运动已经成为他们日常生活不可或缺的重要组成部分。在激情四溢的健身运动中&#xff0c;我们既能够放松身心&#xff0c;减轻工作压力&#xff0c;又能够强健身体&#xff0c;增强免疫力&#xff0c;可谓一举…

流媒体内容分发终极解决方案:当融合CDN与P2P视频交付结合

前言 随着互联网的发展&#xff0c;流媒体视频内容日趋增多&#xff0c;已经成为互联网信息的主要承载方式。相对传统的文字&#xff0c;图片等传统WEB应用&#xff0c;流媒体具有高数据量&#xff0c;高带宽、高访问量和高服务质量要求的特点&#xff0c;而现阶段互联网“尽力…

Vulnhub系列靶机--- Hackadmeic.RTB1

系列&#xff1a;Hackademic&#xff08;此系列共2台&#xff09; 难度&#xff1a;初级 信息收集 主机发现 netdiscover -r 192.168.80.0/24端口扫描 nmap -A -p- 192.168.80.143访问80端口 使用指纹识别插件查看是WordPress 根据首页显示的内容&#xff0c;点击target 点击…

TCP最大连接数问题总结

最大TCP连接数量限制有&#xff1a;可用端口号数量、文件描述符数量、线程、内存、CPU等。每个TCP连接都需要以下资源&#xff0c;如图所示&#xff1a; 1、可用端口号限制 Q&#xff1a;一台主机可以有多少端口号&#xff1f;端口号与TCP连接&#xff1f;是否能修改&#x…

RTP/RTCP的 NACK, PLI,SLI,FIR

1&#xff0c;概述 在网络环境不是太好的情况下&#xff0c;比如网络拥塞比较严重&#xff0c;丢包率可能比较高&#xff0c;简单实用NACK重传的机制&#xff0c;这样就会有大量的RTCP NACK报文&#xff0c;发送端收到相应的报文&#xff0c;又会发送大量指定的RTP报文&#x…

H.265视频无插件流媒体播放器EasyPlayer.js播放webrtc断流重连的异常修复

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

小说图文实现构想

1、当前小说盈利模式 当前大部分小说平台盈利模式主要依赖于小说IP的实现&#xff0c;如影视、动漫及书籍出版等&#xff0c;其中通过VIP等充值阅读方式从部分用户获取收入&#xff0c;当然由于盗版横行&#xff0c;通过VIP获取收益往往不是很理想想&#xff0c;广告收入在整个…

Django REST framework实现api接口

drf 是Django REST framework的简称&#xff0c;drf 是基于django的一个api 接口实现框架&#xff0c;REST是接口设计的一种风格。 一、 安装drf pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install …

Mongodb两种启动方法

一、命令行启动 1.修改存放数据库的位置 说明&#xff1a;E:\data\mongodb&#xff1b;我在E盘创建的文件夹mongodb mongod --dbpathE:\data\mongodb 2.成功启动 说明&#xff1a;默认端口27017&#xff0c;代表已经启动成功 &#xff0c;并在mongodb自动创建文件 二、配置项…

JFrog Artifactory介绍

JFrog Artifactory 1. 简介2. 安装3. 使用说明3.1 界面展示3.2 仓库搭建流程&#xff08;本地库&#xff09;3.3 普通用户界面展示3.4 上传制品&#xff0c;可单传或多传3.5 下载制品3.6 支持搜索3.7 单个制品复制移动删除3.8 用户管理3.9 存储信息3.10 基本设置 4. 前期调研被…

什么是软件压力测试?软件压力测试工具和流程有哪些?

软件压力测试 一、含义&#xff1a;软件压力测试是一种测试应用程序性能的方法&#xff0c;通过模拟大量用户并发访问&#xff0c;测试应用程序在压力情况下的表现和响应能力。软件压力测试的目的是发现系统潜在的问题&#xff0c;如内存泄漏、线程锁、资源泄漏等&#xff0c;…