容器使用镜像时,在多个镜像分层的最上面还添加了一个读写层。每一个容器在运行时,都会基于当前镜像在其最上层挂载一个读写层,用户针对容器的所有操作都在读写层中完成。一旦容器销毁,这个读写层也随之销毁。
如上图所示例子,一个节点上共有 3 个容器,分别基于 2 个镜像运行。
镜像存储层说明如下:
该节点上共包含 6 个镜像层:Layer 1~6。 镜像 1 由:Layer 1、3、4、5 组成; 镜像 2 由:Layer 2、3、5、6 组成。 所以两个镜像共享了 Layer 3、5 两个镜像层; |
容器 1:使用镜像 1 启动 容器 2:使用镜像 1 启动 容器 3:使用镜像 2 启动 容器 1 和容器 2 共享镜像 1,且每个容器有自己的可写层; 容器 1(2)和容器 3 共享镜像 2 个层(Layer3、5); |
对于读:容器由这么多层的数据组合而成,当不同层次的数据重复时,读取的原则是上层数据覆盖下层数据; 对于写:容器修改某个文件时,都是在最上层的读写层进行。主要实现技术有:写时复制、用时配置。 |
AUFS 是一种联合文件系统(UFS),是文件级的存储驱动。
AUFS 是一个能透明叠加一个或多个现有文件系统的层状文件系统,把多层文件系统合并成单层表示。即:支持将不同目录挂载到同一个虚拟文件系统下的文件系统。 可以一层一层地叠加修改文件,其底层都是只读的,只有最上层的文件系统是可写的。 当需要修改一个文件时,AUFS 创建该文件的一个副本,使用 CoW 将文件从只读层复制到可写层进行修改,结果也保存在可写层。 在 Docker 中,底下的只读层就是 image,可写层就是 Container 运行时。 |
3. Docker 数据卷介绍
容器中的应用读写数据都是发生在容器的读写层,镜像层+读写层映射为容器内部文件系统、负责容器内部存储的底层架构。当我们需要容器内部应用和外部存储进行交互时,需要一个类似于计算机 U 盘一样的外置存储,容器数据卷即提供了这样的功能。
另一方面:容器本身的存储数据都是临时存储,在容器销毁的时候数据会一起删除。而通过数据卷将外部存储挂载到容器文件系统,应用可以引用外部数据,也可以将自己产出的数据持久化到数据卷中,所以容器数据卷是容器进行数据持久化的实现方式。
容器存储组成:只读层(容器镜像) + 读写层 + 外置存储(数据卷)
数据卷可以一直存在,直到没有容器使用。
1)Docker 数据卷类型
Bind:将主机目录/文件直接挂载到容器内部。
需要使用主机的上的绝对路径,且可以自动创建主机目录; 容器可以修改挂载目录下的任何文件,是应用更具有便捷性,但也带来了安全隐患。 |
Volume命令行指令:docker volume (create/rm); 是Docker提供的功能,所以在非 docker 环境下无法使用; 分为命名数据卷和匿名数据卷,其实现是一致的,区别是匿名数据卷的名字为随机码; 支持数据卷驱动扩展,实现更多外部存储类型的接入。 |
数据易丢失。 |
Src:表示卷映射源,主机目录或文件,需要是绝对地址; Dst:容器内目标挂载地址; Opts:可选,挂载属性:ro, consistent, delegated, cached, z, Z; Consistent, delegated, cached:为mac系统配置共享传播属性; Z、z:配置主机目录的selinux label。 |
|
3)Volume 挂载方式语法
-v: src:dst:opts 只支持单机版。
Src:表示卷映射源,数据卷名、空; Dst:容器内目标目录; Opts:可选,挂载属性:ro(只读)。 |
|
匿名数据卷:docker run –d -v /data3 nginx; 会主机上默认创建目录:/var/lib/docker/volumes/{volume-id}/_data进行映射; 命名数据卷:docker run –d -v nas1:/data3 nginx; 如果当前找不到nas1卷,会创建一个默认类型(local)的卷。 |
docker run -d -v /test:/data nginx 如果主机上没有/test目录,则默认创建此目录。 |
docker run -d --volumes-from nginx1 -v /test1:/data1 nginx 继承所有来自配置容器的数据卷,并包含自己定义的卷。 |
Private:挂载不传播,源目录和目标目录中的挂载都不会在另一方体现; Shared:挂载会在源和目的之间传播; Slave:源对象的挂载可以传播到目的对象,反之不行; Rprivate:递归 Private,默认方式; Rshared:递归 Shared; Rslave:递归 Slave。 |
示例:
|
本地空目录、镜像空目录:无特殊处理; 本地空目录、镜像非空目录:镜像目录的内容拷贝到主机;(是拷贝,不是映射;即使容器删除内容也会保存); 本地非空目录、镜像空目录:本地目录内容映射到容器; 本地非空目录、镜像非空目录:本地目录内容映射到容器,容器目录的内容被隐藏。 |
本地空目录、镜像空目录:无特殊处理; 本地空目录、镜像非空目录:容器目录变成空; 本地非空目录、镜像空目录:本地目录内容映射到容器; 本地非空目录、镜像非空目录:本地目录内容映射到容器,容器目录的内容被隐藏。 |
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; |
|