[Docker][Docker Volume]详细讲解
创始人
2024-10-22 09:11:32
0

目录

  • 1.什么是存储卷?
  • 2.为什么需要存储卷?
    • 1.数据丢失问题
    • 2.性能问题
    • 3.宿主机和容器互访不方便
    • 4.容器和容器共享不方便
  • 3.存储卷分类
    • 1.volume docker 管理卷
    • 2.bind mount 绑定数据卷
    • 3.tmpfs mount 临时数据卷
  • 5.管理卷 Volume
    • 1.创建卷
      • 1.-v 参数
      • 2.--mount 参数
    • 2.Volume命令操作
      • 1.docker volume creatre
      • 2.docker volume inspect
      • 3.docker volume ls
      • 4.docker volume rm
      • 5.docker volume prune
    • 3.Dockerfile 匿名卷
  • 6.绑定卷 bind mount
    • 1.-v 参数
    • 2.--mount 参数
  • 7.临时卷 tmpfs
    • 0.前言
    • 1.创建卷
      • 方式一 指定 --tmpfs 创建
      • 方式二 --mount 指定参数创建
  • 8.何时用Volume,bind,tmpfs?


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 '=,='
  • 关键参数
    • type:类型表示bindvolumetmpfs
    • 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 '=,='
  • 关键参数
    • type:类型表示bindvolumetmpfs
    • src, source宿主机目录,这个和管理卷是不一样的
    • dst, destination, target:文件或目录挂载在容器中的路径
    • ro, readonly:只读方式挂载
  • 示例
    docker run -d -it --name devtest \ 	--mount type=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 '=,='
  • 关键参数
    • type:类型表示bindvolumetmpfs
    • 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用于敏感文件存储,文件不想存储到宿主机和容器的可写层之中

相关内容

热门资讯

推荐一下!青橙竞技卡五星辅助,... 推荐一下!青橙竞技卡五星辅助,新518互游脚本下载,好像是真的有挂(哔哩哔哩)青橙竞技卡五星辅助透视...
总结一下!老友广东麻将辅助,杭... 总结一下!老友广东麻将辅助,杭州都莱辅助,切实真的是有挂(哔哩哔哩)1、在老友广东麻将辅助插件功能辅...
解迷一下!创思维激k怎么开挂,... 解迷一下!创思维激k怎么开挂,创思维辅助软件,切实真的有挂(哔哩哔哩)1、创思维激k怎么开挂辅助器安...
辅助一下!微信微乐游戏辅助脚本... 辅助一下!微信微乐游戏辅助脚本,拱趴大菠萝有辅助吗,总是有挂(哔哩哔哩)辅助一下!微信微乐游戏辅助脚...
辅助一下!时光互娱房卡辅助,新... 辅助一下!时光互娱房卡辅助,新漫游免费辅助器,本来真的有挂(哔哩哔哩)1、让任何用户在无需时光互娱房...
关于一下!多乐跑得快私人房间作... 关于一下!多乐跑得快私人房间作弊视频,来来拼十辅助,都是真的有挂(哔哩哔哩)1、打开软件启动之后找到...
教你一下!卡五星游戏源码,决战... 教你一下!卡五星游戏源码,决战卡五星辅助器,其实是有挂(哔哩哔哩)1)决战卡五星辅助器辅助插件:进一...
普及一下!同乡游有辅助软件码,... 普及一下!同乡游有辅助软件码,老友广东辅助器,总是是有挂(哔哩哔哩)1、上手简单,内置详细流程视频教...
曝光一下!创思维激k有辅助器吗... 曝光一下!创思维激k有辅助器吗,hhpoker辅助是真的吗,好像存在有挂(哔哩哔哩)创思维激k有辅助...
总结一下!边锋干瞪眼小程序辅助... 总结一下!边锋干瞪眼小程序辅助,心悦踢辅助软件,真是存在有挂(哔哩哔哩)1、这是跨平台的边锋干瞪眼小...