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

相关文章

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

关于Docker Desktop的WSL报错问题解决办法

《关于DockerDesktop的WSL报错问题解决办法》:本文主要介绍关于DockerDesktop的WSL报错问题解决办法的相关资料,排查发现是因清理%temp%文件夹误删关键WSL文件,... 目录发现问题排查过程:解决方法其实很简单:重装之后再看就能够查到了:最后分享几个排查这类问题的小www.cp