Docker Volume(存储卷)——7

目录:

  1. 什么是存储卷?
  2. 生活案例
  3. 为什么需要存储卷?
  4. 存储卷分类
  5. 管理卷 Volume
    1. 创建卷
      1. 方式一: Volume 命令操作
      2. 方式二: -v 或者--mount 指定
      3. 方式三: Dockerfile 匿名卷
    2. 操作案例
      1. Docker 命令创建管理卷
      2. Docker -v 创建管理卷
      3. Docker mount 创建管理卷
      4. Docker 卷生命周期
      5. Docker 卷共享
  6. 绑定卷 bind mount
    1. 创建卷
      1. -v 参数创建卷
      2. --mount 参数创建绑定卷
    2. 操作案例
      1. mount 创建绑定卷
      2. -v 创建绑定卷
      3. 绑定卷共享
  7. 临时卷 tmpfs
    1. 创建卷
      1. 方式一:指定--tmpfs 创建
      2. 方式二: --mount 指定参数创建
    2. 操作案例
      1. tmpfs 参数创建临时卷
      2. mount 创建临时卷
      3. tmpfs 失踪了
  8. 综合实战-MySQL 灾难恢复
  9. 常见问题

1.什么是存储卷?

存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。在宿主机上的这个与容器形成绑定关系的目录被称作存储卷。卷的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上。宿主机的/data/web 目录与容器中的/container/data/web 目录绑定关系,然后容器中的进程向这个目录中写数据时,是直接写在宿主机的目录上的,绕过容器文件系统与宿主机的文件系统建立关联关系,使得可以在宿主机和容器内共享数据库内容,让容器直接访问宿主机中的内容,也可以宿主机向容器写入内容, 容器和宿主机的数据读写是同步的。


 

2.生活案例

存储卷就相当于租了个地下室,建立对应的映射就相当于有了这个地下室的钥匙,能够使用房子以外的空间.

如果有一天龙卷风来了,房子被吹毁了,但是地下室依然安然无恙,就相当于容器销毁了我们的这个地下室依然没有影响。

3.为什么需要存储卷?

1. 数据丢失问题

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

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

显然,容器更擅长无状态应用。因为未持久化数据的容器根目录的生命周期与容器的生命周期一样,容器文件系统的本质是在镜像层上面创建的读写层,运行中的容器对任何文件的修改都存在于该读写层,当容器被删除时,容器中的读写层也会随之消失。虽然容器希望所有的业务都尽量保持无状态,这样容器就可以开箱即用,并且可以任意调度,但实际业务总是有各种需要数据持久化的场景,比如 MySQL、 Kafka 等有状态的业务。因此为了解决有状态业务的需求, Docker 提出了卷(Volume)的概念。

2. 性能问题

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

3. 宿主机和容器互访不方便

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

4. 容器和容器共享不方便

4.存储卷分类

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

  • volume docker 管理卷,默认映射到宿主机的/var/lib/docker/volumes 目录下, 只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎 daemon 自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定那些使用目录,临时存储比较适合;
  • bind mount 绑定数据卷,映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径, 在容器中也需要指定一个特定的路径, 两个已知的路径建立关联关系
  • tmpfs mount 临时数据卷,映射到于宿主机内存中,一旦容器停止运行, tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。
     

5.管理卷 Volume

创建卷
方式一: Volume 命令操作

命令清单如下

docker volume create

功能

创建存储卷

语法


 

关键参数

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

样例


 

docker volume inspect

功能

查看卷详细信息

语法

关键参数

-f: 指定相应个格式,如 json

样例


 

docker volume ls

功能

列出卷

语法


 

关键参数

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

样例

docker volume rm

功能

删除卷,需要容器不使用。

语法

关键参数

-f,--force:强制删除

样例

方式二: -v 或者--mount 指定

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

-v 参数

功能:

完成目录映射

语法

参数

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

样例

 通过 docker inspect 可以看到

 --mount 参数

功能:

完成目录映射

语法

关键参数

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

完成目录映射

样例

采用 mount 创建 volume

通过 docker inspect 可以看到

方式三: Dockerfile 匿名卷

通过 Dockerfile 的 VOLUME 可以创建 docker 管理卷。这个我们后续在 Dockerfile中详细讲解。
我们也可以通过 dockerfile 的 VOLUME 指令在镜像中创建 Data Volume,这样只要通过该镜像创建的容器都会存在挂载点,但值得注意的是通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,而是由 docker 随机生成的。
 

操作案例
Docker 命令创建管理卷

命令创建管理卷

查看我们的 docker 管理卷

我们查看其中一个管理卷,可以看到对应的宿主机目录如下

我们进入宿主机目录,可以放到容器里面的内容已经放到该目录了

查看容器内容,可以看到我们的具体的 mount 信息

我们修改 index.html

通过浏览器查看(可以看到宿主机和容器是同步的)

停止容器释放空间

 结论:宿主机和容器之间数据是同步的

Docker -v 创建管理卷

-v 创建管理卷,并且启动容器

进入卷目录

修改 index.html

浏览器查看

容器中修改提示无法修改

清理释放空间

Docker mount 创建管理卷

mount 创建管理卷,并且启动容器

查看卷创建成功

查看卷挂载点

浏览器查看

宿主机上修改文件内容

 

查看页面

清理释放空间

docker stop nginx3
docker rm nginx3

结论: mount 创建的卷数据也会完成同步。

Docker 卷生命周期

-v 创建管理卷,并且启动容器

进入卷目录, 注意此时可以看到容器里面的内容自动的放到了宿主机里面,也就是说宿主机上没有容器会拷贝过去。


 

修改 index.html

浏览器查看

 

清理释放空间

 

进入卷目录查看可以看到文件并没有被删除

 

删除卷,可以看到我们的卷被删除掉了

 

Docker 卷共享

-v 创建管理卷,并且启动 2 容器,指定同一个卷

进入卷目录

 

修改 index.html

 

浏览器查看,可以看到两个都是一样的首页

 

清理释放空间

 

6.绑定卷 bind mount

创建卷
-v 参数创建卷

功能:

完成卷映射

语法

参数

第一个参数: 宿主机目录,这个和管理卷是不一样的
第二个参数:卷映射到容器的目录
第三个参数:选项,如 ro 表示 readonly

样例

docker run -d --name mynginx6 -v /data/maxhou/testbind:/usr/share/nginx/html/ 2a06ffcd98fb

--mount 参数创建绑定卷

功能:

完成目录映射

语法

关键参数

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

样例


 

操作案例
mount 创建绑定卷

使用-mount 方式创建容器: 创建 nginx 容器,并将宿主机/webapp1 目录挂载至容器/usr/share/nginx/html 目录,注意如果 webapp1 目录不存在会启动报错

查看挂载信息

 

进入容器的终端,查看挂载点目录,和在宿主机上查看里面都是没有文件

 

可以发现容器该目录本身存在的文件消失不见, 这是 bind mount 模式和 volume 模式最大的不同点.

我们在宿主机上添加 index.html

通过浏览器访问,可以看到,容器已经读取到宿主机的共享内容了


 

删除容器,然后查看宿主机上的文件,还是存在,说明容器删除并不影响 bind 映射。

释放空间

 

-v 创建绑定卷

使用-v 方式创建容器: 创建 nginx 容器,并将宿主机/webapp2 目录挂载至容器
/usr/share/nginx/html 目录,注意如果 webapp2 目录不存在,启动不会报错,这是-
v 和--mount 方式的区别

查看挂载信息

 

进入容器的终端,查看挂载点目录,和在宿主机上查看里面都是没有文件

可以发现容器该目录本身存在的文件消失不见, 这是 bind mount 模式和 volume 模式最大的不同点

我们在宿主机上添加 index.html

通过浏览器访问,可以看到,容器已经读取到宿主机的共享内容了。

 

删除容器,然后查看宿主机上的文件,还是存在,说明容器删除并不影响 bind 映射。

绑定卷共享

我们启动两个绑定卷,都绑定到宿主机的同一个目录

我们访问者 2 个页面可以看到相应内容一样

我们修改 index.html

再次访问两个页面,可以看到我们实现了容器间的数据共享。

清理空间

7.临时卷 tmpfs

创建卷
方式一:指定--tmpfs 创建

功能:

完成临时卷映射

语法

样例

docker run -d --name mynginx15 --tmpfs /test1 2a06ffcd98fb 

方式二: --mount 指定参数创建

功能:

完成目录映射

语法

关键参数

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

样例

docker run -d --name mynginx16 --mount type=tmpfs,dst=/test2 2a06ffccd98fb

操作案例
tmpfs 参数创建临时卷

创建临时卷并启动容器

进入容器可以看到 nginx 里面的文件被覆盖了,也就是说 tmpfs 也会覆盖容器里面的文件

添加一个首页

浏览器查看

停止容器

 

启动容器 再次进入,可以看到 tmpfs 的内容完全消失了,也就是说内容是存在内存里面的。

清理空间

 

mount 创建临时卷

创建临时卷并启动容器

进入容器可以看到 nginx 里面的文件被覆盖了,也就是说 tmpfs 也会覆盖容器里面的文件


 

添加一个首页

浏览器查看

拷贝一个大文件到容器里面,dockerdemo-1.0-SNAPSHOT.jar 约 17M

拷贝文件到我们的卷目录, 超过了限制,空间限制为了 1m,会提示没有空间

停止容器

启动容器 再次进入,可以看到 tmpfs 的内容完全消失了,也就是说内容是存在内存里面的。

tmpfs 失踪了

实战目的

掌握临时卷的创建方式,了解临时卷的特殊存储方式

实战步骤

创建一个普通的容器

在容器里面写入一个文件 mylabel.txt

 

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

我们创建个临时卷

进入容器在/app 目录下创建 mynewlabel.txt

在宿主机上查找 mynewlabel.txt,可以发现, 文件找不到

 

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

释放资源

 

8.综合实战-MySQL 灾难恢复

实战目的

掌握挂载卷的使用,将 mysql 的业务数据存储到外部

实战步骤

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

准备镜像

创建容器

 

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

查看容器挂载信息

 

连接 MySQL 的 shell, 创建数据库, 密码是 bite

 

创建了一个 user 数据库,并在该数据库中创建一个 student 表,在表中插入了两条数据。

在宿主机中查看 volume

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

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

幸好我们的数据还在,这个时候怎么恢复呢,我们再次启动我们的运行命令,确保目录映射一致就能找回我们的数据了。



我们通过 mysql 的客户端进去,再次查看我们的数据

我们的数据还在!!!!

释放空间

9.常见问题

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

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

10.扩展思考:存储卷在实际研发中带来了哪些问题

1. 跨主机使用
docker 存储卷是使用其所在的宿主机上的本地文件系统目录,也就是宿主机有一块磁盘,这块磁盘并没有共享给其他的 docker 主机,容器在这宿主机上停止或删除,是可以重新再创建的,但是不能调度到其他的主机上,这也是 docker 本身没有解决的问题,所以 docker 存储卷默认就是 docker 所在主机的本地,但是自己搭建一个共享的 NFS来存储 docker 存储的数据,也可以实现, 但是这个过程强依赖于运维人员的能力。所以未来应用的存储和数据往往分离,越来越多的分布式存储方案出现,如 s3 系列,nfs 等。

2. 启动参数未知
容器有一个问题,一般与进程的启动不太一样,就是容器启动时选项比较多,如果下次再启动时,很容器会忘记它启动时的选项,所以最好有一个文件来保存容器的启动,这就是容器编排工具的作用。一般情况下,是使用命令来启动操作 docker,但是可以通过文件来读,也就读文件来启动,读所需要的存储卷等,但是它也只是操作一个容器,如果要几十上百个容器操作,就需要专业的容器编排工具这种一般像开源的 k8s,各个云厂商也有自己的企业版编排软件。

3. 复杂场景仍然需要运维
对于有状态要持久的集群化组件,如 mysql 的主从。部署维护一个 Mysql 主从需要运维知识、经验整合进去才能实现所谓的部署,扩展或缩容,出现问题后修复,必须要了解集群的规模有多大,有多少个主节点,有多少个从节点,主节点上有多少个库,这些都要一清二楚,才能修复故障,这些就强依赖于运维经验这种复杂的场景往往还是需要人力,很难有完美的工具出现。
 

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

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

相关文章

Conda 搭建简单的机器学习 Python 环境

文章目录 Conda 概述Conda 常用命令Conda 自身管理查看 Conda 版本更新 Conda清理索引缓存添加镜像源设置搜索时显示通道地址查看镜像源删除镜像源 环境管理创建虚拟环境删除虚拟环境查看所有虚拟环境复制虚拟环境激活虚拟环境关闭虚拟环境导入、导出环境 包管理虚拟环境下安装…

springboot框架的客制化键盘个性化商城网站

客制化键盘网站是从客制化键盘的各部分统计和分析,在过程中会产生大量的、各种各样的数据。本文以客制化键盘管理为目标,采用B/S模式,以Java为开发语言,Jsp为开发技术、idea Eclipse为开发工具,MySQL为数据管理平台&am…

外网访问内网服务器使用教程

如何在任何地方都能访问自己家里的笔记本上的应用?如何让局域网的服务器可以被任何地方访问到?有很多类似的需求,我们可以统一用一个解决方案:内网穿透。内网穿透的工具及方式有很多,如Ngrok、Ssh、autossh、Natapp、F…

接触huggingface

接触huggingface finetuning llama 按照https://github.com/samlhuillier/code-llama-fine-tune-notebook/tree/main中的教程一步一步了解。 pip install !pip install githttps://github.com/huggingface/transformers.gitmain bitsandbytes # we need latest transforme…

react Hooks(useEffect)实现原理 - 简单理解

useEffect 语法: useEffect(setup, dependencies?) 含义: useEffect 是一个 React Hook,它允许你 将组件与外部系统同步。 useEffect 源码简单理解 一、mountEffect 和 upadateEffect useEffect 与其它 hooks 一样分为 mountEffect 和 upadateEffec…

iOS——定位与地图

平时在写项目的时候可能会遇到需要使用定位服务的地方,比如说获取位置和导航等。因此这里我会使用OC自带的库以及苹果系统的地图来获取定位以及显示在地图上。 开始前的设置 在获取定位前,需要在项目文件的info中添加两个关键字,用于向用户…

SpringBoot AOP切面实现对自定义注解的属性动态修改

文章目录 需求问题解决方案示例代码 需求 项目中共用了一个redis,而项目中部分代码使用了JetCache的Cached注解。所以需要给Cached动态配置area属性值,用来区分dev和test环境。 问题 自定义注解的属性值需要常量值,即static final修饰&…

2013年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2013 级考研管理类联考数学真题一、问题求解(本大题共 15 小题,每小题 3 分,共 45 分)下列每题给出 5 个选项中,只有一个是符合要求的,请在答题卡上将所选择的字母涂黑。真题(2013-01&…

【Amis Low Code 结合FastAPI进行前端框架开发】

官方文档 封装思想 直接复制官网json数据即可开发每个json中的接口由fastapi 转发(透传)使其开发模式与前端思维一致 基础组件 from amis import Page, Service, App from pydantic import BaseModel, Field from fastapi import FastAPI, Request, …

【计算机网络】TCP|IP协议

目录 前言 什么是TCP/IP协议? TCP/IP协议的层次结构 TCP/IP协议的工作原理 TCP/IP协议的重要性 结语 前言 TCP/IP协议是当今互联网世界中最重要的网络协议之一,它是网络通信的基石,为数据在网络中的传输提供了可靠性和有效性。本文将深…

将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制

将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制 2023/12/9 22:07 应该也可以适用于RK3399的Android12系统 --- a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/frameworks/base/packages/SettingsProvider/res/values/defaults.xml -2…

Java王者荣耀火柴人

主要功能 键盘W,A,S,D键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小…

go自带rpc框架生产环境使用demo

基础使用 序列化使用自带gob协议 server package mainimport ("net""net/rpc" )// 定义一个handler结构体 type HelloService struct { }// 定义handler方法,大小写,参数,返回值都是固定的,否则无法注册 func (receiv…

Axure网页端高交互组件库, 下拉菜单文件上传穿梭框日期城市选择器

作品说明 组件数量:共 11 套 兼容软件:Axure RP 9/10,不支持低版本 应用领域:web端原型设计、桌面端原型设计 作品特色 本作品为「web端组件库」,高保真高交互 (带仿真功能效果);运用了动态面板、中继…

【智能家居】八、监控摄像采集、人脸识别比对进行开门功能点

一、使用 fswebcam 测试 USB 摄像头 二、根据demo来实现功能点 三、功能点编写编译运行实现 一、使用 fswebcam 测试 USB 摄像头 a. 安装 fswebcam orangepiorangepi:~$ sudo apt update orangepiorangepi:~$ sudo apt-get install -y fswebcamb. 安装完 fswebcam 后可以使用…

【探索Linux】—— 强大的命令行工具 P.21(多线程 | 线程同步 | 条件变量 | 线程安全)

阅读导航 引言一、线程同步1. 竞态条件的概念2. 线程同步的概念 二、条件变量1. 条件变量函数⭕使用前提(1)初始化条件变量(2)等待条件满足(3)唤醒等待pthread_cond_broadcast()pthread_cond_signal() &…

golang学习笔记——sync.Pool

文章目录 sync.Pool示例sync.Pool数据结构TCP连接池总结参考资料 sync.Pool示例 代码 sync.Pool对外提供的New、Get和Put方法。 var buffers sync.Pool{New: func() interface{} { return new(bytes.Buffer)}, }func GetBuffer() *bytes.Buffer {return buffers.Get().(*byt…

附录C 流水线:基础与中级概念

1. 引言 1.1 什么是流水线? 流水线爱是一种将多条指令重叠执行的实现技术,它利用了一条指令所需的多个操作之间的并行性。(指令操作的非原子性和指令类型的多样性) 在计算流水线中,每个步骤完成指令的一部分&#x…

UML概扩知识点

UML是一个重要的知识点,考察的频度也很高。我们需要了解的是UML的一系列的图,红框里的是最核心的。 其次是对各种关系有了解(红框里的: 依赖关系,关联关系,泛化关系,实现关系) UM…

重点车辆安全监测预警技术方案

目录 1.系统架构 2.详细设计 2.1驾驶员信息监控 2.1.1驾驶员基本信息管理 2.1.2人车匹配信息 2.1.3驾驶员在线状态管理 2.2车辆状态信息管理 2.2.1车辆信息管理 2.1.2车辆在路状态管理 2.3重点车辆安全监测预警系统云平台 2.3.1云平台需求分析 2.3.2 设计思想 2.4.…