暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

谈谈容器存储 Docker 数据卷。

时代Java 2020-07-01
548
点击上面 时代Java关注我们,

关注新技术,学习新知识!

Docker 是什么和应用场景这里就不再多说了,不了解的小伙伴可翻翻历史文章或到网站查询更多相关教程。

本文将深入讨论Docker 数据卷的挂载和使用。


1. Docker 数据卷介绍

容器中的应用读写数据都是发生在容器的读写层,镜像层+读写层映射为容器内部文件系统、负责容器内部存储的底层架构。当我们需要容器内部应用和外部存储进行交互时,需要一个类似于计算机 U 盘一样的外置存储,容器数据卷即提供了这样的功能。

另一方面:容器本身的存储数据都是临时存储,在容器销毁的时候数据会一起删除。而通过数据卷将外部存储挂载到容器文件系统,应用可以引用外部数据,也可以将自己产出的数据持久化到数据卷中,所以容器数据卷是容器进行数据持久化的实现方式。

容器存储组成:只读层(容器镜像) + 读写层 + 外置存储(数据卷)

容器数据卷从作用范围可以分为:单机数据卷 和 集群数据卷。单机数据卷即为容器服务在一个节点上的数据卷挂载能力,docker volume 是单机数据卷的代表实现;集群数据卷则关注的是集群级别的数据卷编排能力,K8s 数据卷则是集群数据卷的主要应用方式。

Docker Volume 是一个可供多个容器使用的目录,它绕过 UFS,包含以下特性:

  • 数据卷可以在容器之间共享和重用;

  • 相比通过存储驱动实现的可写层,数据卷读写是直接对外置存储进行读写,效率更高;

  • 对数据卷的更新是对外置存储读写,不会影响镜像和容器读写层;

  • 数据卷可以一直存在,直到没有容器使用。

1)Docker 数据卷类型

Bind:将主机目录/文件直接挂载到容器内部。

  • 需要使用主机的上的绝对路径,且可以自动创建主机目录;

  • 容器可以修改挂载目录下的任何文件,是应用更具有便捷性,但也带来了安全隐患。


Volume:使用第三方数据卷的时候使用这种方式。

  • Volume命令行指令:docker volume (create/rm);

  • 是Docker提供的功能,所以在非 docker 环境下无法使用;

  • 分为命名数据卷和匿名数据卷,其实现是一致的,区别是匿名数据卷的名字为随机码;

  • 支持数据卷驱动扩展,实现更多外部存储类型的接入。


Tmpfs:非持久化的卷类型,存储在内存中。

数据易丢失。

2)Bind 挂载方式语法

-v: src:dst:opts 只支持单机版。

  • Src:表示卷映射源,主机目录或文件,需要是绝对地址;

  • Dst:容器内目标挂载地址;

  • Opts:可选,挂载属性:ro, consistent, delegated, cached, z, Z;

  • Consistent, delegated, cached:为mac系统配置共享传播属性;

  • Z、z:配置主机目录的selinux label。


示例:

    $ docker run -d --name devtest -v home:/data:ro,rslave nginx
    $ docker run -d --name devtest --mount type=bind,source=/home,target=/data,readonly,bind-propagation=rslave nginx
    $ docker run -d --name devtest -v home:/data:z nginx

    3)Volume 挂载方式语法

    -v: src:dst:opts 只支持单机版。

    • Src:表示卷映射源,数据卷名、空;

    • Dst:容器内目标目录;

    • Opts:可选,挂载属性:ro(只读)。


    示例:

      $ docker run -d --name devtest -v myvol:/app:ro nginx
      $ docker run -d --name devtest --mount source=myvol2,target=/app,readonly nginx

      2. Docker 数据卷使用

      Docker 数据卷使用方式:

      1)Volume 类型

      • 匿名数据卷:docker run –d -v data3 nginx;

      • 会主机上默认创建目录:/var/lib/docker/volumes/{volume-id}/_data进行映射;

      • 命名数据卷:docker run –d -v nas1:/data3 nginx;

      • 如果当前找不到nas1卷,会创建一个默认类型(local)的卷。

      2)Bind 方式

      docker run -d -v test:/data nginx
      如果主机上没有/test目录,则默认创建此目录。

      3)数据卷容器

      数据卷容器是一个运行中的容器,其他容器可以继承此容器中的挂载数据卷,则此容器的所有挂载都会在引用容器中体现。

      docker run -d --volumes-from nginx1 -v test1:/data1 nginx
      继承所有来自配置容器的数据卷,并包含自己定义的卷。

      4)数据卷的挂载传播

      Docker volume 支持挂载传播的配置:Propagation。

      • Private:挂载不传播,源目录和目标目录中的挂载都不会在另一方体现;

      • Shared:挂载会在源和目的之间传播;

      • Slave:源对象的挂载可以传播到目的对象,反之不行;

      • Rprivate:递归 Private,默认方式;

      • Rshared:递归 Shared;

      • Rslave:递归 Slave。

      示例:

        $ docker run –d -v home:/data:shared nginx
        表示:主机/home下面挂载的目录,在容器/data下面可用,反之可行;

          $ docker run –d -v home:/data:slave nginx
          表示:主机/home下面挂载的目录,在容器/data下面可用,反之不行;

          5)数据卷挂载的可见性

          Volume 挂载可见性:

          • 本地空目录、镜像空目录:无特殊处理;

          • 本地空目录、镜像非空目录:镜像目录的内容拷贝到主机;(是拷贝,不是映射;即使容器删除内容也会保存);

          • 本地非空目录、镜像空目录:本地目录内容映射到容器;

          • 本地非空目录、镜像非空目录:本地目录内容映射到容器,容器目录的内容被隐藏。

          Bind 挂载可见性:以主机目录为准。

          • 本地空目录、镜像空目录:无特殊处理;

          • 本地空目录、镜像非空目录:容器目录变成空;

          • 本地非空目录、镜像空目录:本地目录内容映射到容器;

          • 本地非空目录、镜像非空目录:本地目录内容映射到容器,容器目录的内容被隐藏。


          3. Docker数据卷插件

          Docker 数据卷实现了将容器外部存储挂载到容器文件系统的方式。为了扩展容器对外部存储类型的需求,docker 提出了通过存储插件的方式挂载不同类型的存储服务。扩展插件统称为 Volume Driver,可以为每种存储类型开发一种存储插件。

          • 单个节点上可以部署多个存储插件;

          • 一个存储插件负责一种存储类型的挂载服务。



          Docker Daemon 与 Volume driver 通信方式有:

          • Sock文件:linux 下放在/run/docker/plugins 目录下

          • Spec文件:/etc/docker/plugins/convoy.spec 定义

          • Json文件:/usr/lib/docker/plugins/infinit.json 定义

          实现接口:

          Create, Remove, Mount, Path, Umount, Get, List, Capabilities;

          使用示例:

            $ docker volume create --driver nas -o diskid="" -o host="10.46.225.247" -o path=”/nas1" -o mode="" --name nas1

            --

            知识分享,时代前行!

            ~~ 时代Java

            还有更多好文章……

            请查看历史文章和官网,

            ↓有分享,有收获~

            文章转载自时代Java,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论