docker持久化存储

Build, Ship, and Run Any App, Anywhere

可见容器技术的使用给我们带来了效率上的提升,将一个应用直接打包成一个容器就能在各种平台运行,但是,当一个应用带有状态属性的话,使用的时候肯定也需要将状态数据带上。

出于对应用数据对安全,可用性,共享,性能等方面的要求和Root Image的要求完全不一样,所以Docker并不推荐采用Root Image的存储方式来存储应用数据,而是采用了Volume这样一个独立的数据访问接口。通过Volume机制,Docker可以轻易地将主机目录挂载到容器中;通过Docker的Volume Plugin机制,使Docker能够方便地整合第三方存储,为Docker提供Volume。

volume是如何被使用的呢?

WX20170706-155801@2x.png

Volume是个interface,docker daemon通过调用这个接口完成volume的操作;Docker实现两种Volume:基于主机文件系统。基于Volume Plugin。

  • 基于本地文件系统的Volume

    可以在执行Docker create或Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理。

  • 基于Plugin的Volume

    Docker为了支持第三方存储方案,在1.8版本引入Volume Plugin机制。

如何去编写一个docker volume plugin呢?

官方文档中给我们列取了许多第三发的编写的plugin

docker volume plugins.png

docker plugin其实就是一个RPC/JSON的接口,docker daemon直接通过HTTP协议直接与该接口通讯;

  • docker daemon如何发现这个接口:
  1. 接口生成通讯的sock文件
  2. 在/etc/docker/plugins/目录下新建一个spec文件,spec文件内描述了接口的sock文件的地址
{
  "Name": "plugin-example",
  "Addr": "https://example.com/docker/plugin",
  "TLSConfig": {
    "InsecureSkipVerify": false,
    "CAFile": "/usr/shared/docker/certs/example-ca.pem",
    "CertFile": "/usr/shared/docker/certs/example-cert.pem",
    "KeyFile": "/usr/shared/docker/certs/example-key.pem"
  }
}
  • 这个接口需要实现如下一些方法:

    可参见:https://docs.docker.com/engine/extend/plugins_volume/#volumedriver

    • /VolumeDriver.Create: 创建一个卷,Docker会发送卷名称和参数发送给插件,卷插件会根据Docker发送过来的参数创建一个卷,并和这个卷名称关联。
    • /VolumeDriver.Remove:删掉特定的卷时调用,当运行”docker rm -v”命令时,Docker会调用该API发送请求给插件。
    • /VolumeDriver.Mount: 挂载一个卷到本机,Docker会把卷名称和参数发送给参数。插件会返回一个本地路径给Docker,这个路径就是卷所在的位置。Docker在创建容器的时候,会将这个路径挂载到容器中。
    • /VolumeDriver.Path:一个卷创建成功后,Docker会调用Path API来获取这个卷的路径,随后Docker通过调用Mount API,让插件将这个卷挂载到本机。
    • /VolumeDriver.Unmount:当容器退出时,Docker daemon会发送Umount API给插件,通知插件这个卷不再被使用,插件可以对该卷做些清理工作(比如引用计数减一,不同的插件行为不同)。
    • /VolumeDriver.Get: 获取Plugin Volume的详细信息。
    • /VolumeDriver.List: 执行docker volume ls命令时,会向plugin发送该请求,获取volume list。
    • /VolumeDriver.Capabilities

    docker官方提供了一个编写接口的SDK,docker/go-plugins-helpers, 在编写volume plugin的时候,我们只需要实现Driver interface中的方法就可以了。

    image

  • 下面我们一起来看一个第三方的plugin, docker-volume-glusterfs

    其中一个Mount方法

    WX20170706-154238@2x.png

    其实就是在先在容器的宿主机将gluster存储挂载至本地,然后再提供给容器使用

    WX20170706-154303@2x.png

总结

从上面可以看出,无论使用volume还是volume plugin来实现容器的持久化存储,本质上都是将容器所在宿主机上都文件系统挂在至容器内使用,使用volume plugin就是完成了两个动作:1. 首先将存储挂在至本地文件系统;2. 在将本地文件系统挂载至容器使用,完成了容器与共享存储的解耦合,在大型的容器使用环境还是非常有必要的!

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,805评论 19 139
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 13,586评论 0 120
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 9,847评论 0 27
  • 以下原文转载于(https://docs.docker.com/docker-for-mac/)(想找中文版的最新...
    Veekend阅读 12,245评论 0 17
  • 《一步之遥》这部电影看了有一星期了。总想提笔写点东西,事至临头,总是有事耽误了,或许这只是我构思这篇影评的想法,还...
    紫草茵茵阅读 5,043评论 1 4

友情链接更多精彩内容