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

相关文章

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

docker如何删除悬空镜像

《docker如何删除悬空镜像》文章介绍了如何使用Docker命令删除悬空镜像,以提高服务器空间利用率,通过使用dockerimage命令结合filter和awk工具,可以过滤出没有Tag的镜像,并将... 目录docChina编程ker删除悬空镜像前言悬空镜像docker官方提供的方式自定义方式总结docker

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

如何在一台服务器上使用docker运行kafka集群

《如何在一台服务器上使用docker运行kafka集群》文章详细介绍了如何在一台服务器上使用Docker运行Kafka集群,包括拉取镜像、创建网络、启动Kafka容器、检查运行状态、编写启动和关闭脚本... 目录1.拉取镜像2.创建集群之间通信的网络3.将zookeeper加入到网络中4.启动kafka集群

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

Java架构师知识体认识

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