【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
exitfind / -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.7docker 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:用于敏感文件存储,文件不想存储在宿主机和容器的可写层之中

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 中hash 模式与 history 模式的区别

hash 模式&#xff1a; - 地址中永远带着 # 号&#xff0c;不美观。 - 兼容性比较好。 - 通过手机 app 分享地址时&#xff0c;如果 app 效验严格&#xff0c;该地址会被标记为不合法。 history 模式&#xff1a; - 地址干净&#xff0c;美观。 - 兼容性和 hash 模式相比…

es和数据库同步方案

5.5 课程信息索引同步 5.5.1 技术方案 通过向索引中添加课程信息最终实现了课程的搜索&#xff0c;我们发现课程信息是先保存在关系数据库中&#xff0c;而后再写入索引&#xff0c;这个过程是将关系数据中的数据同步到elasticsearch索引中的过程&#xff0c;可以简单成为索引…

nginx基于端口如何配置虚拟主机

在 Nginx 中配置基于端口的虚拟主机&#xff08;也称为服务器块&#xff09;与配置基于域名的虚拟主机类似&#xff0c;但是你需要指定监听的端口。以下是基于端口的虚拟主机配置示例&#xff1a; 假设我们要配置两个不同的虚拟主机&#xff0c;一个监听 8080 端口&#xff0c…

机器学习---常见的距离公式(欧氏距离、曼哈顿距离、标准化欧式距离、余弦距离、杰卡德距离、马氏距离、切比雪夫距离、闵可夫斯基距离、K-L散度)

1. 欧氏距离 欧几里得度量&#xff08;euclidean metric&#xff09;&#xff08;也称欧氏距离&#xff09;是一个通常采用的距离定义&#xff0c;指在m维空 间中两个点之间的真实距离&#xff0c;或者向量的自然长度&#xff08;即该点到原点的距离&#xff09;。在二维和三维…

分布式锁系列之zookeeper分布式锁和mysql分布式锁

目录 介绍 下载安装 基本指令​编辑 java集成zookeeper 官方提供版 永久节点 临时节点​编辑 永久序列化节点 判断当前节点是否存在 获取当前节点中的数据内容 获取当前节点的子节点 更新节点内容 删除节点 zookeeper实现分布式锁 Mysql实现分布式锁 总结 介绍 ZooK…

在家构建您的迷你 ChatGPT

ChatGPT 玩起来很有趣。您很可能还希望拥有自己的私下运行的副本。实际上,这是不可能的,因为 ChatGPT 不是一个可供下载的软件,并且它需要强大的计算机能力才能运行。但是您可以构建一个可以在商用硬件上运行的精简版本。在这篇文章中,您将了解 什么语言模型可以表现得像 C…

HDLBits-Verilog学习记录 | Verilog Language-Basics(2)

文章目录 9.Declaring wires | wire decl10. 7458 chip 9.Declaring wires | wire decl problem:Implement the following circuit. Create two intermediate wires (named anything you want) to connect the AND and OR gates together. Note that the wire that feeds the …

类加载器与双亲委派

类加载器与双亲委派 Java 类加载器&#xff08;Class Loader&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;的一部分&#xff0c;负责将类的字节码加载到内存中&#xff0c;并将其转换为可执行的 Java 对象。类加载器在 Java 应用程序中起着重要的作用&#xff0c;它…

【校招VIP】TCP/IP模型之常用协议和端口

考点介绍&#xff1a; 大厂测试校招面试里经常会出现TCP/IP模型的考察&#xff0c;TCP/IP协议是网络基础知识&#xff0c;是互联网的基石&#xff0c;不管你是做开发、运维还是信息安全的&#xff0c;TCP/IP 协议都是你绕不过去的一环&#xff0c;程序员需要像学会看书写字一样…

java.lang.UnsupportedOperationException解决方法

java.lang.UnsupportedOperationException解决方法 先放错误信息业务场景报错分析先看报错代码位置进入源码查看至此 真相大白 解决方法总结 先放错误信息 业务场景 已知有学生 张三李四王五赵六 等人 private List<String> nameList Arrays.asList("张三", &…

Nginx前后端服务器部署

Nginx作为正反向代理的中转站&#xff0c;是连接前后端网络服务的媒介 Nginx下载&#xff1a;http://nginx.org/download/http://nginx.org/download/ 一、上传到服务器固定路径下并解压 上传到/opt/software/nginx-1.19.0.tar.gz cd /opt/software/ tar -zxvf nginx-1.19.0.…

Orchestrator自身高可用性方案

目录 获得 HA 的方法 一 没有高可用性 &#xff08;No high availability&#xff09; 使用场景 架构组成 架构图 二 半高可用性&#xff08;Semi HA&#xff09; 三 基于共享数据库后端高可用&#xff08;HA via shared backend&#xff09; 四 基于Raft协议高可用 五…

【Terraform学习】使用 Terraform 从 EC2 实例访问 S3 存储桶(Terraform-AWS最佳实战学习)

使用 Terraform 从 EC2 实例访问 S3 存储桶 实验步骤 前提条件 安装 Terraform&#xff1a; 地址 下载仓库代码模版 本实验代码位于 task_ec2_s3connet 文件夹中。 变量文件 variables.tf 在上面的代码中&#xff0c;您将声明&#xff0c;aws_access_key&#xff0c;aws_…

shell 11(shell重定向输入输出)

一、标准输入输出 标准输入介绍 从键盘读取用户输入的数据&#xff0c;然后再把数据拿到Shell程序中使用; 标准输出介绍 Shell程序产生的数据&#xff0c;这些数据一般都是呈现到显示器上供用户浏览查看

数字 IC 设计职位经典笔/面试题(三)

共100道经典笔试、面试题目&#xff08;文末可全领&#xff09; 1. IC 设计中同步复位与异步复位的区别&#xff1f; 同步复位在时钟沿变化时&#xff0c;完成复位动作。异步复位不管时钟&#xff0c;只要复位信号满足条件&#xff0c;就完成复位动作。异步复位对复位信号要求…

第1章:计算机网络体系结构

文章目录 1.1 计算机网络 概述1.概念2.组成3.功能4.分类5.性能指标1.2 计算机网络 体系结构&参考模型1.分层结构2.协议、接口、服务3.ISO/OSI模型:七层4.TCP/IP模型:四层1.1 计算机网络 概述 1.概念

Arduino 入门学习笔记12 读写外置EEPROM

Arduino 入门学习笔记12 读写外置EEPROM 一、准备工作1. 外置 EEPROM 简介2. Arduino操作外置 EEPROM 流程 二、读写操作流程1. 写操作流程2. 读操作 三、示例代码 一、准备工作 1. 外置 EEPROM 简介 外置I2C接口的EEPROM是一种常用的非易失性存储器&#xff0c;通过I2C总线与…

石油和天然气行业如何实现数字化转型和工业4.0

石油和天然气行业的数字化转型正面临着前所未有的挑战和机遇。尽管过去相对滞后&#xff0c;这个复杂而庞大的行业正逐渐意识到数字化的紧迫性&#xff0c;以应对市场变化、降低运营成本、提高效率和确保可持续性。然而&#xff0c;数字化转型的进程并非一帆风顺&#xff0c;行…

echarts 之 科技感进度条

1.图片展示 2.代码实现 /* ng qty 进度条 */ <template><div class"ngqty-progress"><div class"ngqty-info"><span>X4</span><span>50%</span></div><div :id"barNgQtyProgress index" c…

【校招VIP】产品行测考点之图的推理和分析

考点介绍&#xff1a; 大厂产品校招笔试里经常会出现行测的考察&#xff0c;而图的推理是行测里面稍微有难度的一部分。因为时间有限&#xff0c;很多同学因为没有解题思路而丢分。 『产品行测考点之图的推理和分析』相关题目及解析内容可点击文章末尾链接查看&#xff01; 一…