[Docker][Docker Volume]详细讲解

DieSnowK 2024-08-17 14:37:01 阅读 51

目录

1.什么是存储卷?2.为什么需要存储卷?1.数据丢失问题2.性能问题3.宿主机和容器互访不方便4.容器和容器共享不方便

3.存储卷分类1.volume docker 管理卷2.bind mount 绑定数据卷3.tmpfs mount 临时数据卷

5.管理卷 Volume1.创建卷1.-v 参数2.--mount 参数

2.Volume命令操作1.docker volume creatre2.docker volume inspect3.docker volume ls4.docker volume rm5.docker volume prune

3.Dockerfile 匿名卷

6.绑定卷 bind mount1.-v 参数2.--mount 参数

7.临时卷 tmpfs0.前言1.创建卷方式一 指定 --tmpfs 创建方式二 --mount 指定参数创建

8.何时用Volume,bind,tmpfs?


1.什么是存储卷?

存储卷是一个虚拟目录,他将宿主机目录映射到容器内目录,方便用户操作容器内文件,或者方便迁移容器产生的数据,是容器内目录于宿主机目录之间映射的桥梁

这意味着,在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录容器直接访问宿主机中的内容,宿主机也可以向容器写入内容,容器和宿主机的数据读写是同步的 卷的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上

请添加图片描述


2.为什么需要存储卷?

1.数据丢失问题

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

无状态的 --> 数据不需要被持久化有状态的 --> 数据需要被持久化 容器更擅长无状态应用

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

2.性能问题

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

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

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

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


3.存储卷分类

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

请添加图片描述

1.volume docker 管理卷

默认映射到宿主机的<code>/var/lib/docker/volumes目录下只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的哪个目录,是由容器引擎daemon自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系

这种方式极大解脱用户在使用卷时的耦合关系缺陷是用户无法指定那些使用目录临时存储比较适合

2.bind mount 绑定数据卷

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

3.tmpfs mount 临时数据卷

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


5.管理卷 Volume

1.创建卷

1.-v 参数

功能:完成目录映射语法docker run -v name:directory[:OPTIONS] ...参数

name:卷名称directory:卷映射到容器内的目录OPTIONS:选项,如ro表示read-only 注意:容器创建时,如果发现挂载的数据卷不存在时,会自动创建

2.–mount 参数

功能:完成目录映射语法--mount '<key>=<value>,<key>=<value>'关键参数

type:类型表示bindvolumetmpfssrc, source:对于命名卷,这是卷的名称,对于匿名卷,省略此字段dst, destination, target:文件或目录挂载在容器中的路径ro, readonly:只读方式挂载 示例docker run -d --name devtest --mount src=myvol,dst=/app SnowK:latest

2.Volume命令操作

1.docker volume creatre

功能:创建存储卷语法:`docker volume creatre [OPTIONS] [VOLUME]关键参数

-d, --driver:指定驱动,默认是loval--label:指定元数据 示例docker volume creatre SnowK-Vol

2.docker volume inspect

功能:查看卷详细信息语法:`docker volume inspect [OPTIONS] VOLUME [VOLUME…]关键参数-f:指定相应格式,如 json

3.docker volume ls

功能:列出卷语法docker volume ls [OPTIONS]关键参数

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

4.docker volume rm

功能:删除卷,需要容器不使用语法docker volume rm [OPTIONS] VOLUME [VOLUME...]关键参数-f, --force:强制删除

5.docker volume prune

功能:删除未使用的数据卷语法docker volume prune [OPTIONS]关键参数

--filter:过滤-f, --force:不提示是否删除

3.Dockerfile 匿名卷

通过Dockerfile的VOLUME指令在镜像中创建Data Docker

这样只要通过该镜像创建的容器都会存在挂载点但值得注意的是通过VOLUME指令创建的挂载点,无法指定主机上对应的目录,而是由Docker随机生成的


6.绑定卷 bind mount

-v--mount都可以完成绑定卷的创建

1.-v 参数

功能:完成卷映射语法docker run -v name:directory[:OPTIONS] ...参数

name宿主机目录,这个和管理卷是不一样的directory:卷映射到容器内的目录OPTIONS:选项,如ro表示read-only 示例docker run -d -it --name devtest -v "$(pwd)"/target:/app SnowK:latest注意事项:在执行docker run命令时,使用-v 本地目录:容器内目录可以完成本地目录挂载

该目录必须以/./开头,如果直接以名称开头,会被识别为管理卷,而非本地目录-v mysql:/var/lib/mysql:会被识别为一个管理卷,名为mysql-v ./mysql:/var/lib/mysql:会被识别为当前目录下的mysql的目录

2.–mount 参数

功能:完成目录映射语法--mount '<key>=<value>,<key>=<value>'关键参数

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

docker run -d -it --name devtest \

--mount type=bind,src="$(pwd)"/target,dst=/app \code>

SnowK:latest


7.临时卷 tmpfs

0.前言

临时卷数据位于内存中,在容器和宿主机之外tmpfs局限性

不同于卷和绑定挂载,不能在容器之间共享 tmpfs 挂载这个功能只有在Linux上运行Docker时才可用

1.创建卷

方式一 指定 --tmpfs 创建

功能:完成临时卷映射语法--tmpfs /app示例:`docker run -d -it --name tmptest --tmpfs /app SnowK:latest

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

功能:完成目录映射语法--mount '<key>=<value>,<key>=<value>'关键参数

type:类型表示bindvolumetmpfsdst, destination, target:文件或目录挂载在容器中的路径tmpfs-size:tmpfs挂载的大小(以字节为单位),默认无限制tmpfs-mode:tmpfs的八进制文件模式

例如:700 或 0700默认为 1777 或 全局可写 ro, readonly:只读方式挂载 示例docker run -d -it --name tmptest --mount type=tmpfs,dst=/app SnowK:latest


8.何时用Volume,bind,tmpfs?

Volume:volume是Docker的宿主机文件系统一部分,用于不需要规划具体目录的场景bind:bind mount完全是依赖于主机的目录结构和操作系统,用于目录需要提前规划

比如MySQL的目录需要个空间大的,其他服务又不占用的时候,用volume就不太合适了 tmpfs用于敏感文件存储,文件不想存储到宿主机和容器的可写层之中



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。