关注新技术,学习新知识!
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
还有更多好文章……
请查看历史文章和官网,
↓有分享,有收获~




