当前位置:   article > 正文

【Docker】Docker存储卷

【Docker】Docker存储卷


一、什么是存储卷

存储卷 就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。在宿主机上的这个与容器形成绑定关系的目录被称作存储卷。卷的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上。

宿主机的 /data/web 目录与容器中的 /container/data/web 目录绑定关系,然后容器中的进程向这个目录中写数据时,是直接写在宿主机的目录上的,绕过容器文件系统与宿主机的文件系统建立关联关系,使得可以在宿主机和容器内共享数据库内容,让容器直接访问宿主机中的内容,也可以宿主机向容器写入内容, 容器和宿主机的数据读写是同步的。

在这里插入图片描述

生活案例

存储卷就相当于租了个地下室,建立对应的映射就相当于有了这个地下室的钥匙,能够使用房子以外的空间。

在这里插入图片描述

如果有一天龙卷风来了,房子被吹毁了,但是地下室依然安然无恙,就相当于容器销毁了我们的这个地下室依然没有影响。

在这里插入图片描述


二、为什么需要存储卷

  1. 数据丢失问题
    容器按照业务类型,总体可以分为两类:
    • 无状态的(数据不需要被持久化)
    • 有状态的(数据需要被持久化)

显然,容器更擅长无状态应用。因为未持久化数据的容器根目录的生命周期与容器的生命周期一样,容器文件系统的本质是在镜像层上面创建的读写层,运行中的容器对任何文件的修改都存在于该读写层,当容器被删除时,容器中的读写层也会随之消失。

虽然容器希望所有的业务都尽量保持无状态,这样容器就可以开箱即用,并且可以任意调度,但实际业务总是有各种需要数据持久化的场景,比如 MySQL、 Kafka 等有状态的业务。因此为了解决有状态业务的需求, Docker 提出了 卷(Volume) 的概念。

  1. 性能问题
    UnionFS 对于修改删除等,一般效率非常低,如果对一于 I/O 要求比较高的应用,如redis 在实现持化存储时,是在底层存储时的性能要求比较高。
  2. 宿主机和容器互访不方便
    宿主机访问容器,或者容器访问要通过 docker cp 来完成,应用很难操作
  3. 容器和容器共享不方便

三、存储卷分类

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

  • volume docker 管理卷,默认映射到宿主机的 /var/lib/docker/volumes 目录下, 只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎 daemon 自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定那些使用目录,临时存储比较适合。
  • bind mount 绑定数据卷,映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径, 在容器中也需要指定一个特定的路径, 两个已知的路径建立关联关系。
  • tmpfs mount 临时数据卷,映射到于宿主机内存中,一旦容器停止运行, tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。

在这里插入图片描述


四、管理卷Volume

创建卷

存储卷可以通过命令方式创建,也可以在创建容器的时候通过 -v and --mount 指定。

方式一:Volume 命令操作

命令清单如下:

在这里插入图片描述

docker volume create 创建存储卷

  • 语法
docker volume create [OPTIONS] [VOLUME]
  • 1
  • 关键参数
    • -d, --driver: 指定驱动,默认是 local
    • --label: 指定元数据
  • 样例
  1. 创建匿名卷
# 创建匿名卷
docker volume create
# 遍历卷
docker volume ls
# 查看卷的详细信息
docker volume inspect 1a9eb041a8b3b0143b6a58e0470366dfaf6c67ef05715a6d907d00b24e059193
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

  1. 创建有名卷
docker volume create myvoltest1
  • 1

在这里插入图片描述

docker volume create --label MYTEST=1 myvoltest2
  • 1

在这里插入图片描述


docker volume inspect 查看卷详细信息

  • 功能
    查看卷的详细信息
  • 语法
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
  • 1
  • 关键参数
    • -f :指定相应个格式,如json
  • 样例
docker volume inspect myvotest3 myvotest4
  • 1

在这里插入图片描述


docker volume ls 列出卷

  • 语法
docker volume ls [OPTIONS]
  • 1
  • 关键参数
    • --format: 指定相应个格式,如 json,table
    • --filter,-f: 过滤
    • -q: 仅显示名称
  • 样例
#列出所有存储卷
docker volume ls
#指定存储卷格式
docker volume ls --format json
#过滤存储卷
docker volume ls -f label=MYTEST
#仅显示存储卷名称
docker volume ls -q
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述


docker volume rm 删除卷,需要容器不使用

  • 语法
docker volume rm [OPTIONS] VOLUME [VOLUME...]
  • 1
  • 关键参数
    • -f,--force:强制删除
  • 样例
# 删除存储卷
docker volume rm myvotest7 myvotest8
#写文件到宿主机目录下
echo "123" > /data/var/lib/docker/volumes/myvotest7/_data/1.txt
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述


docker volume prune 删除不使用的本地卷(匿名卷)

  • 语法
docker volume prune [OPTIONS]
  • 1
  • 关键参数
    • --filter:过滤
    • -f, --force :不提示是否删除
  • 样例
docker volume prune
  • 1

在这里插入图片描述


方式二:-v 或者–mount 指定

-v 和-mount 都可以完成管理卷的创建。

-v参数:完成目录映射

  • 语法
docker run -v name:directory[:options] .........
  • 1
  • 参数
    • 第一个参数:卷名称
    • 第二个参数:卷映射到容器的目录
    • 第三个参数:选项,如 ro 表示 readonly
  • 样例
  1. 创建容器时指定参数
docker run -d --name myvolnginx1 -v volnginx1:/usr/share/nginx/html/ nginx:1.24.0
  • 1

在这里插入图片描述

  1. 进入容器中做首页的删除
docker exec -it myvolnginx1 bash
cd /usr/share/nginx/html/
rm index.html
  • 1
  • 2
  • 3

在这里插入图片描述

  1. 查看宿主机存储卷目录下的文件
ls /data/var/lib/docker/volumes/volnginx1/_data
  • 1

在这里插入图片描述

如果指定ro选项,那么容器中的文件是不能删除的。

在这里插入图片描述


--mount 参数 完成目录映射

  • 语法
--mount '<key>=<value>,<key>=<value>'
  • 1
  • 关键参数
    • type : 类型表示 bind, volume, or tmpfs
    • source , src :对于命名卷,这是卷的名称。对于匿名卷,省略此字段
    • destination, dst,target:文件或目录挂载在容器中的路径
    • ro,readonly: 只读方式挂载
  • 样例

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/151328
推荐阅读
相关标签