目录
1.什么是存储卷?
- 存储卷是一个虚拟目录,他将宿主机目录映射到容器内目录,方便用户操作容器内文件,或者方便迁移容器产生的数据,是容器内目录于宿主机目录之间映射的桥梁- 这意味着,在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录- 容器直接访问宿主机中的内容,宿主机也可以向容器写入内容,容器和宿主机的数据读写是同步的
- 卷的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上
2.为什么需要存储卷?
1.数据丢失问题
- 容器按照业务类型,总体可以分为两类- 无状态的 --> 数据不需要被持久化- 有状态的 --> 数据需要被持久化
- 容器更擅长无状态应用 - 因为未持久化数据的容器根目录的生命周期与容器的生命周期一样- 容器文件系统的本质是在镜像层上面创建的读写层,运行中的容器对任何文件的修改都存在于该读写层,当容器被删除时,容器中的读写层也会随之消失
- 虽然容器希望所有的业务都尽量保持无状态,这样容器就可以开箱即用,并且可以任意调度,但实际业务总是有各种需要数据持久化的场景,比如MySQL、Kafka等有状态的业务
- 为了解决有状态业务的需求,Docker提出了卷(Volume)的概念
2.性能问题
- Union FS对于修改删除等,一般效率非常低
- 如果对于I/O要求比较高的应用,如Redis在实现持化存储时,是在底层存储时的性能要求比较高
3.宿主机和容器互访不方便
- 宿主机访问容器,或者容器访问要通过
docker cp
来完成,应用很难操作
4.容器和容器共享不方便
3.存储卷分类
- 目前Docker提供了三种方式将数据从宿主机挂载到容器中
1.volume docker 管理卷
- 默认映射到宿主机的
/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
:类型表示bind
,volume
,tmpfs
-src, 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
:类型表示bind
,volume
,tmpfs
-src, source
:宿主机目录,这个和管理卷是不一样的-dst, destination, target
:文件或目录挂载在容器中的路径-ro, readonly
:只读方式挂载 - 示例:
docker run -d-it--name devtest \--mounttype=bind,src="$(pwd)"/target,dst=/app \ 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
:类型表示bind
,volume
,tmpfs
-dst, 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:用于敏感文件存储,文件不想存储到宿主机和容器的可写层之中
本文转载自: https://blog.csdn.net/qq_37281656/article/details/140816567
版权归原作者 DieSnowK 所有, 如有侵权,请联系我们删除。
版权归原作者 DieSnowK 所有, 如有侵权,请联系我们删除。