Docker Volume Plugin 开发及Golang实现

 原文地址: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

转载时必须以链接形式注明原始出处及本声明。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值