【Docker】存储卷Volume

news2025/3/13 3:08:52

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1139. 最大的以 1 为边界的正方形;2087. 网格图中机器人回家的最小代价;1145. 二叉树着色游戏

1139. 最大的以 1 为边界的正方形 核心思想&#xff1a;枚举正方向的右下角坐标&#xff08;i&#xff0c;j&#xff09;&#xff0c;然后你只需要判断四条边的连续一的最小个数即可&#xff0c;这里是边求连续一的个数同时求解结果。 087. 网格图中机器人回家的最小代价 核心…

PHP自己的框架实现操作成功失败跳转(完善篇四)

1、实现效果&#xff0c;操作成功后失败成功自动跳转 2、创建操作成功失败跳转方法CrlBase.php /**成功后跳转*跳转地址$url* 跳转显示信息$msg* 等待时间$wait* 是否自动跳转$jump*/protected function ok($urlNULL,$msg操作成功,$wait3,$jump1){$code1;include KJ_CORE./tp…

FPGA原理与结构——可配置逻辑块CLB(Configurable Logic Block)

一、什么是CLB 1、CLB简介 可配置逻辑块CLB&#xff08;Configurable Logic Block&#xff09;是xilinx系类FPGA的基本逻辑单元&#xff08;在各系列中CLB可能有所不同&#xff0c;以下我们主要讨论Xilinx 7系类&#xff09;&#xff0c;是实现时序逻辑电路和组合逻辑电…

基于Pytorch构建DenseNet网络对cifar-10进行分类

DenseNet是指Densely connected convolutional networks&#xff08;密集卷积网络&#xff09;。它的优点主要包括有效缓解梯度消失、特征传递更加有效、计算量更小、参数量更小、性能比ResNet更好。它的缺点主要是较大的内存占用。 DenseNet网络与Resnet、GoogleNet类似&#…

如何下载英伟达NVIDIA旧版本驱动,旧版本驱动官方网址

https://www.nvidia.cn/Download/Find.aspx?langcn 也可以直接搜索英伟达官网&#xff0c;点击驱动程序&#xff0c;然后点击试用版驱动程序&#xff0c;里面不但有试用版的驱动&#xff0c;还有之前发布的所有驱动

redis乐观锁+启用事务解决超卖

乐观锁用于监视库存&#xff08;watch&#xff09;&#xff0c;然后接下来就启用事务。 启用事务&#xff0c;将减库存、下单这两个步骤&#xff0c;放到一个事务当中即可解决秒杀问题、防止超卖。 但是&#xff01;&#xff01;&#xff01;乐观锁&#xff0c;会带来" …

Docker 使用归纳总结

mongodb 的 terminal 可执行的命令是基于这个文件夹

【LeetCode】剑指 Offer Ⅱ 第4章:链表(9道题) -- Java Version

题库链接&#xff1a;https://leetcode.cn/problem-list/e8X3pBZi/ 类型题目解决方案双指针剑指 Offer II 021. 删除链表的倒数第 N 个结点双指针 哨兵 ⭐剑指 Offer II 022. 链表中环的入口节点&#xff08;环形链表&#xff09;双指针&#xff1a;二次相遇 ⭐剑指 Offer I…

5.7.webrtc线程的启动与运行

那在上一节课中呢&#xff1f;我向你介绍了web rtc的三大线程&#xff0c;包括了信令线程&#xff0c;工作线程以及网络线程。那同时呢&#xff0c;我们知道了web rtc 3大线程创建的位置以及运行的时机。 对吧&#xff0c;那么今天呢&#xff1f;我们再继续深入了解一下&#…

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第一天)Mybatis的学习

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第一天&#xff09;Mybatis的学习 一、当前的主流框架介绍(这就是后期我会发出来的框架学习) Spring框架 ​ Spring是一个开源框架&#xff0c;是为了解决企业应用程序开发复杂…

【2023最新爬虫】用python爬取知乎任意问题下的全部回答

老规矩&#xff0c;先上结果&#xff1a; 爬取了前200多页&#xff0c;每页5条数据&#xff0c;共1000多条回答。&#xff08;程序设置的自动判断结束页&#xff0c;我是手动break的&#xff09; 共爬到13个字段&#xff0c;包含&#xff1a; 问题id,页码,答主昵称,答主性别,…

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的Bufferlist序列(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的Bufferlist序列&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的Bufferlist序列功能的技术背景CameraExplorer如何查看相机Bufferlist功能在BGAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过BGAPI SDK…

文件同步工具rsync

文章目录 作用特性安装命令服务端启动增加安全认证及免密登录 实时推送源服务器配置结合inotify实现实时推送 参数详解 学些过程中遇到的问题 作用 rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步&#xff0c;支持本地复制&#xff0c;或…

05有监督学习——神经网络

线性模型 给定n维输入&#xff1a; x [ x 1 , x 1 , … , x n ] T x {[{x_1},{x_1}, \ldots ,{x_n}]^T} x[x1​,x1​,…,xn​]T 线性模型有一个n维权重和一个标量偏差: w [ w 1 , w 1 , … , w n ] T , b w {[{w_1},{w_1}, \ldots ,{w_n}]^T},b w[w1​,w1​,…,wn​]T,b 输…

Elasticsearch 处理地理信息

1、GeoHash ​ GeoHash是一种地理坐标编码系统&#xff0c;可以将地理位置按照一定的规则转换为字符串&#xff0c;以方便对地理位置信息建立空间索引。首先要明确的是&#xff0c;GeoHash代表的不是一个点而是一个区域。GeoHash具有两个显著的特点&#xff1a;一是通过改变 G…

7-6 统计字符出现次数

分数 20 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 本题要求编写程序&#xff0c;统计并输出某给定字符在给定字符串中出现的次数。 输入格式&#xff1a; 输入第一行给出一个以回车结束的字符串&#xff08;少于80个字符&#xff09;&#xff1b;第二行输入一个…

Android JNI系列详解之JNI、NDK环境搭建和编译工具安装

本文主要介绍JNI、NDK环境变量的搭建&#xff0c;以及CMake工具的安装和ndk-build工具的安装。 一、JNI环境 JNI属于Java中的一部分&#xff0c;所以只需要搭建Java环境就有了JNI的环境&#xff0c;安装Java的环境可以网上查找教程&#xff0c;很多的安装JDK的博客。我电脑是安…

检测输电线上的鸟巢,用SSD结合HSV色彩空间滤波器相结合的检测方法--论文中图还少一张,欠点意思

Detection of Bird Nests on Power Line Patrol Using Single Shot Detector Abstract 电力塔上鸟巢的存在对输电线路的安全稳定构成了威胁。近年来&#xff0c;利用无人机探测输电线路上的鸟巢已成为电力巡检的重要任务之一。图像处理方法从计算机视觉向功率图像识别的迁移日…

MySQL数据库第十四课--------sql优化---------层层递进

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Git问题:解决“ssh:connect to host github.com port 22: Connection timed out”

操作系统 Windows11 使用Git IDEA 连接方式&#xff1a;SSH 今天上传代码出现如下报错&#xff1a;ssh:connect to host github.com port 22: Connection timed out 再多尝试几次&#xff0c;依然是这样。 解决 最终发现两个解决方案&#xff1a;&#xff08;二选一&#xf…