docker持久化存储

Build, Ship, and Run Any App, Anywhere

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

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

volume是如何被使用的呢?

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持久化存储_第2张图片
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中的方法就可以了。

    docker持久化存储_第3张图片
    image

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

    其中一个Mount方法

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

总结

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

参考

  • 窥探Docker中的Volume plugin内幕

你可能感兴趣的:(docker持久化存储)