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对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

linux服务之NIS账户管理服务方式

《linux服务之NIS账户管理服务方式》:本文主要介绍linux服务之NIS账户管理服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、所需要的软件二、服务器配置1、安装 NIS 服务2、设定 NIS 的域名 (NIS domain name)3、修改主

ubuntu如何部署Dify以及安装Docker? Dify安装部署指南

《ubuntu如何部署Dify以及安装Docker?Dify安装部署指南》Dify是一个开源的大模型应用开发平台,允许用户快速构建和部署基于大语言模型的应用,ubuntu如何部署Dify呢?详细请... Dify是个不错的开源LLM应用开发平台,提供从 Agent 构建到 AI workflow 编排、RA

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启

debian12安装docker的实现步骤

《debian12安装docker的实现步骤》本文主要介绍了debian12安装docker的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录步骤 1:更新你的系统步骤 2:安装依赖项步骤 3:添加 docker 的官方 GPG 密钥步骤