Docker:认识Docker Managed Volumes管理卷

2024-06-11 16:20

本文主要是介绍Docker:认识Docker Managed Volumes管理卷,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 什么是存储卷
  • 为什么需要存储卷?
    • 数据丢失问题
    • 性能问题
    • 容器和宿主机访问不方便
    • 容器和容器共享不方便
  • 存储卷类型
    • volume docker管理卷
    • bind mount绑定数据卷
    • tmpfs mount临时数据卷
  • 管理卷
    • 创建卷
    • 1. 使用volume命令创建
      • docker volume create
      • docker volume inspect
      • docker volume ls
      • docker volume prune
      • docker volume rm
    • 2. 使用-v或者是--mount来进行制定信息
    • 3. Dockerfile匿名卷
    • 具体操作
    • Docker管理卷共享

什么是存储卷

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

在宿主机上的这个与容器形成绑定关系的目录就被叫做是存储卷,卷的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或者目录的形式存储在宿主机上

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

在这里插入图片描述

为什么需要存储卷?

数据丢失问题

容器按照业务进行分类,大体可以分为:

  1. 无状态
  2. 有状态

所谓状态,其实就是需不需要被持久化,而容器更加适用于进行无状态应用,因为未持久化数据的容器根目录的生命周期与容器的生命周期一样,容器文件系统的本质是在镜像层上面创建的读写层,运行中的容器对任何文件的修改都存在于读写层,当容器被删除时,容器中的读写层就会随之消失

而容器是希望,业务可以保持无状态的,可以做到开箱即用,并且可以任意调度,但是实际上,业务总是需要有持久化的情况出现,比如有MySQL这样的情况,那为了解决有状态业务的问题,就引入了卷的概念

性能问题

联合文件系统在进行修改删除的效率很低,而不得不承认有些场景是需要进行IO密集型,例如Redis的持久化,对于底层存储的性能要求就很高,因此要有卷

容器和宿主机访问不方便

在前面的命令中可以看到,实际上宿主机和容器的相互访问要借助Docker中的docker cp命令,其实还是有点麻烦的

容器和容器共享不方便

存储卷类型

就目前而言,Docker提供了三种方式,来把数据从宿主机挂载到容器当中

volume docker管理卷

默认映射到宿主机上的/var/lib/docker/volumes目录下,只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是会由容器引擎自己创建的一个空的目录,或者是一个已经存在的目录,与存储卷建立一个存储关系,缺点是,用户不能指定那些使用目录,这个适合于进行临时存储

bind mount绑定数据卷

映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个指定的路径,在容器中也要指定一个特定的路径,建立一个映射关系

tmpfs mount临时数据卷

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

在这里插入图片描述

管理卷

创建卷

存储卷可以通过命令的方式进行创建,也可以在创建容器的时候通过-v选项或者是–mount选项来进行指定

1. 使用volume命令创建

docker volume create

功能:创建存储卷

docker volume inspect

功能:显示存储卷的详细信息

docker volume ls

功能:列出所有的存储卷

docker volume prune

清理没有用的数据卷

docker volume rm

删除卷,如果某个卷在使用中是不可以被删除的

2. 使用-v或者是–mount来进行制定信息

对于-v选项来说,基本用法如下所示:

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

对于上述命令的参数来说,第一个参数表示的是卷的名称,第二个参数表示的是卷映射到容器的目录,第三个参数表示的是选项,比如说有ro,表示的是read only

样例:

执行下面的命令,创建一个容器:

root@VM-24-7-ubuntu:~# docker run -d --name mynginx -v myvol:/app nginx
97e3937c1def0d36d36bda2e4379ca3a8ca2b99adf3ad0cc0871ec5cfdd57f41

上述的命令表示的意思是,以后台运行一个容器,把这个容器的名字命名为mynginx,然后指定一个卷,这个卷的名字是myvol,把这个卷映射到/app这个目录下,使用的是nginx的镜像,这个镜像使用的版本是最后的版本内容

下面运行命令去查看容器的具体信息如下:

        "Mounts": [{"Type": "volume","Name": "myvol","Source": "/var/lib/docker/volumes/myvol/_data","Destination": "/app","Driver": "local","Mode": "z","RW": true,"Propagation": ""}]

下面介绍的是–mount参数

功能是完成目录映射

语法体现为:

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

其中比较重要的参数有:

  1. type:指定对应的类型,比如说有bind, volume,或者是tmpfs
  2. source,src:对于命名卷来说,这个参数表示的意思是卷的名称,对于匿名卷来说就会选择忽略这个字段
  3. destination:表示的是文件或者是目录挂载到容器中的路径
  4. ro:表示的是read only只读等

样例体现如下:

使用mount来进行volume的创建

root@VM-24-7-ubuntu:~# docker run -d --name mynginx --mount source=myvol,target=/app nginx
19efb10eaffb513314070d1bb9d1321435ed652b199803bb898d0cab5139128f

对于上述创建出的容器来说,创建的存储卷的方式是使用了–mount的方式进行创建,在进行创建的时候是使用的键值对这样的方式,指定了source表示的是命名卷,把这个存储卷的名字命名为myvol,同时把target,也就是文件挂载的路径制定在了/app上

3. Dockerfile匿名卷

通过Dockerfile也能创建出一个docker管理卷,这个在进行后续的Dockerfile的内容中进行解释

具体操作

下面使用例子来具体的演示出,是如何使用命令进行Docker volume的创建的

命令创建管理卷

root@VM-24-7-ubuntu:~# docker volume create myvol
myvol
root@VM-24-7-ubuntu:~# docker container run --name mynginx -d -p 80:80 -v myvol:/usr/share/nginx/html nginx
feea94668b4f57b90e726387b1ef7953d75695051c9a928f2420245a544cab8b

这样就创建好了一个管理卷

查看Docker的管理卷

root@VM-24-7-ubuntu:~# docker volume ls
DRIVER    VOLUME NAME
local     myvol
root@VM-24-7-ubuntu:~# docker volume inspect myvol
[{"CreatedAt": "2024-06-10T15:44:06+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/myvol/_data","Name": "myvol","Options": null,"Scope": "local"}
]

现在进入到这个目录中,就可以向这个目录中存放内容了

root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# echo hello docker volume > index.html 
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# cat index.html 
hello docker volume

现在访问主页,其实就能访问到容器中的nginx界面了:

在这里插入图片描述
因此就能看出的是,宿主机的内容和容器中的内容是同步的

删除容器

root@VM-24-7-ubuntu:~# docker rm -f mynginx
mynginx

现在容器被删除了,但是卷还没删除:

root@VM-24-7-ubuntu:~# cd /var/lib/docker/volumes/myvol/_data
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# ls
50x.html  index.html

那卷怎么删除呢?需要把卷也删除:

root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# docker volume rm myvol
myvol
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# ls /var/lib/docker/volumes/myvol/_data
ls: cannot access '/var/lib/docker/volumes/myvol/_data': No such file or directory

此时再进行查看,就能看到对应的内容已经不存在了

由此也能看出,卷的生命周期和容器是不同步的,是需要单独把卷进行删除的

Docker管理卷共享

现在我们创建两个容器,共享一个卷

root@VM-24-7-ubuntu:~# docker container run --name nginx1 -d -p 80:80 -v myvol:/usr/share/nginx/html nginx
8c3359496860befb845513d7cb59547bc5e5239991f1ff22b9efe58a3530fae9
root@VM-24-7-ubuntu:~# docker container run --name nginx2 -d -p 8088:80 -v myvol:/usr/share/nginx/html nginx
6cc9e8b6e3705647c815a93ef26b8ce5ef7d19779918f0df870f319064aad615

进入宿主机中进行合适的修改

root@VM-24-7-ubuntu:~# docker volume inspect myvol
[{"CreatedAt": "2024-06-10T16:15:56+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/myvol/_data","Name": "myvol","Options": null,"Scope": "local"}
]
root@VM-24-7-ubuntu:~# cd /var/lib/docker/volumes/myvol/_data
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# ls
50x.html  index.html
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# echo hello docker volume share > index.html 
root@VM-24-7-ubuntu:/var/lib/docker/volumes/myvol/_data# cat index.html 
hello docker volume share

此时进行查看,会发现这两个端口访问到的容器是一样的

在这里插入图片描述

这篇关于Docker:认识Docker Managed Volumes管理卷的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051678

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

禅道Docker安装包发布

禅道Docker安装包发布 大家好, 禅道Docker安装包发布。 一、下载地址 禅道开源版:   /dl/zentao/docker/docker_zentao.zip  备用下载地址:https://download.csdn.net/download/u013490585/16271485 数据库用户名: root,默认密码: 123456。运行时,可以设置 MYSQL_ROOT_P

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应