您的位置:首页 > 运维架构 > Docker

Docker Volume Plugin 开发及Golang实现

2016-07-05 19:13 645 查看
 原文地址:http://www.damonyi.cc/?p=232
      

       前期的项目需求,需要合理利用宿主机的存储,利用在宿主机部署Agent的方式,实现了基于LVM分配Docker数据卷的方式,随着开发的进行,项目想要集成docker compose 完成应用的自动编排,需要在docker compose中为容器创建数据卷并且指定卷大小,之前的采用agent的模式已经无法满足目前的需求。参考docker
官方文档 和Local-Persist项目,实现了一个基于LVM的volume
插件 docker-volume-plugin-lvm

      Docker Volume Plugin 提供了标准的卷管理API,第三方只需要实现这些API就可以了。

     插件加载方式,将自己实现的Driver注册,启动main函数,实际上是启动了一个监听端口,sock文件:/var/run/docker/plugins/LVM.sock

     
func main() {
driver := NewLvmPersistDriver()

handler := volume.NewHandler(driver)
fmt.Println(handler.ServeUnix("root", driver.Name))
}


 查询卷API:

 
func (driver *LvmPersistDriver) Get(req volume.Request) volume.Response


       创建卷API:根据入参获取卷名称和卷大小,在LVM的VG中分配LV,并将卷的元数据保存到内存并持久化,若没有设置卷大小,可以设置默认值(目前只能通过代码修改) PS:在使用docker create 命令创建容器时,无法指定卷大小比较坑,还好docker compose支持

func (driver *LvmPersistDriver) Create(req volume.Request) volume.Response


    挂载卷API:根据入参获取卷名称,校验该卷是否已经存在,若存在,将该LV格式化,并挂载到宿主机的目录(宿主机目录由卷插件指定)(若宿主机目录已经被挂载,则不执行该步骤),将挂载点,也就是宿主机目录以volume.Response的方式返回,PS:支持多个容器挂载同一个数据卷,但是读写控制目前没有实现,需要Container自己控制。

func (driver *LvmPersistDriver) Mount(req volume.Request) volume.Response


  

  卸载卷API:
func (driver *LvmPersistDriver) Unmount(req volume.Request) volume.Response


删除卷API:

func (driver *LvmPersistDriver) Remove(req volume.Request) volume.Response


具体实现可以参考代码实现。docker-volume-plugin-lvm

代码目前不是很完善,测试代码,部署运行代码 还没有实现。我比较懒。。。

原文地址:http://www.damonyi.cc/?p=232

转载时必须以链接形式注明原始出处及本声明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: