编者注: 注:本期分享由张朝潞原创,有容云整理发布,转载请注明出处
作者介绍: 本次交流将与大家分享Docker Volume plugin相关的内容。今日主题是窥探Docker中的Volume plugin内幕。 因为应用数据对安全,可用性,共享,性能等方面的要求和Root Image的要求完全不一样,所以Docker并不推荐采用Root Image的存储方式来存储应用数据,而是采用了Volume这样一个独立的数据访问接口。 应用通过Volume去访问相关的数据,Volume的实现和CoW的分层文件系统完全独立,通过Volume plugin机制可轻易驱动外部存储。 下面我们就围绕Volume Plugin Introduction、Container and Volume、Docker Volume Plugin、自定义Volume Plugin四个方面来展开。
一. Volume Plugin Introduction
二. Container and Volume
1 .Container如何使用Volume? Docker使用Container结构管理容器,Container结构中有map类型的MountPoints变量,用于存储Container中所有已挂载的Volume即是MountPoint结构,MountPoint结构保存挂载目录和Volume结构的基本信息,并且管理目录的权限控制、挂载传播方式等特性。
Volume是个interface,Docker实现两种Volume:①基于主机文件系统。②基于Volume Plugin。
2.基于主机文件系统提供Volume
/etc/resolv.conf、/etc/hostname和/etc/hosts三个文件是为了解决每个Container都拥有自己的Hostname和DNS配置,使用了bind mount将主机的文件,挂载到Container内部。/data也是使用了同样的方式将主机的目录挂载到Container中。下面是主机挂载到Container的文件: 查看/dev/disk/by-uuid/88f22c9e-9d5d-4c7e-8984-eba8446361e6是链接文件指向/dev/sda2,这是主机的根目录文件系统。
3 .Container中的Volume 此时挂载卷信息:
三. Docker Volume Plugin
1. Docker Volume Plugin框架
如上图,Docker Daemon结构中有个成员Volumes,类型是VolumeStore类型,包含一组管理Volume的函数:Create、Remove、List、Get、Refs …。通过两个变量,管理Container和Volume的关系。
2.) docker volume 管理 Docker提供两个接口Volume和Driver,所有提供给Docker使用的Volume必须实现Volume接口。后端驱动需要实现Driver接口。Driver是对提供出去的Volume进行管理。目前Docker实现了两种Volume &Driver。 ① 基于本地文件系统的Volume
可以在执行Docker create或Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理。上图中蓝色部分LocalVolume和Root。这两个结构就是对主机目录和文件进行管理,具体的对应关系如下图: 从上图可以看出,基于本地文件系统的卷管理,Driver便是卷的根目录/var/lib/docker/volumes。一个卷就是根目录下的一个子目录。
② 适配Plugin的Volume 基于本地文件系统的Volume框架中,全局变量drivers保存了所有注册到Docker Daemon的Driver。Docker Daemon需要对Volume进行管理操作时,通过GetDriver函数从drivers变量中获取指定名称的Driver,通过Driver可以通过Create,Remove,List,Get对Driver中Volume进行管理。通过Get函数获取Volume结构,可以对卷进行管理操作:Name,DriverName,Path,Mount,Unmount。
3 .) docker plugin 实现原理
Volume Plugin实现原理
Volume Driver Adapter : 实现Driver接口,用于抽象各种Plugin的驱动,该类型可以适配所有符合规范的Volume Plugin,对Plugin进行管理。 上述两个类型都有一个Volume Driver Proxy结构变量proxy,用于与Plugin进行通信。Volume Driver Proxy结构实现了与plugin通信的接口volume Driver,提供Create、Remove、Path、Mount、Unmount、List、Get接口与通信。Volume Driver Proxy结构的client变量,使用这个变量与Plugin Daemon进行通信。client变量是Plugin结构中的Client变量是Client结构类型,包含了http.Client类型对象。
Docker Daemon通过Unix域套接字与Plugin Daemon进行通信。所以Plugin需要让Docker Daemon知道Plugin的Unix域套接字文件的路径。再执行命令:docker run … -v volumename:/data –volume-driver=convoy
发现步骤:
Plugin.Activate : 发送一个请求到Plugin,Plugin返回其类型,如convoy就返回Volume Driver。相当于Docker和Plugin Daemon直接的连接建立的握手报文。
例子:GlusterFS就是使用这个包,基于GlusterFS提供Volume。https://github.com/calavera/docker-volume-glusterfs 关于Docker存储方面的内容,我们之前分享过一篇叫《Docker容器对存储的定义(Volume 与 Volume Plugin) 》的文章,感兴趣的朋友可以关注有容云搜索下。好的,我们今天的分享先告一个段落,谢谢大家! 温馨提示: 对Docker容器技术或容器生产实施感兴趣的朋友欢迎加群讨论。我们汇集了Docker容器技术落地实施团队精英及业内技术派高人,在线为您分享Docker技术干货。我们的宗旨是为了大家拥有更专业的平台交流Docker实战技术,我们将定期邀请嘉宾做各类话题分享及回顾,共同实践研究Docker容器生态圈。 (责任编辑:IT) |