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
查询卷API:
创建卷API:根据入参获取卷名称和卷大小,在LVM的VG中分配LV,并将卷的元数据保存到内存并持久化,若没有设置卷大小,可以设置默认值(目前只能通过代码修改) PS:在使用docker create 命令创建容器时,无法指定卷大小比较坑,还好docker compose支持
挂载卷API:根据入参获取卷名称,校验该卷是否已经存在,若存在,将该LV格式化,并挂载到宿主机的目录(宿主机目录由卷插件指定)(若宿主机目录已经被挂载,则不执行该步骤),将挂载点,也就是宿主机目录以volume.Response的方式返回,PS:支持多个容器挂载同一个数据卷,但是读写控制目前没有实现,需要Container自己控制。
卸载卷API:
删除卷API:
具体实现可以参考代码实现。docker-volume-plugin-lvm
代码目前不是很完善,测试代码,部署运行代码 还没有实现。我比较懒。。。
原文地址: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
转载时必须以链接形式注明原始出处及本声明。
相关文章推荐
- 如何使用Dockerfile构建镜像
- docker registry_v2 部署过程中遇到的坑
- PHP项目Docker化指南@KVM云技术社区分享
- docker存储驱动知识汇总
- 进入docker容器推荐的方法
- docker
- 有容云老司机带路, 使用Docker实现丝般顺滑的持续集成
- 运行docker容器
- docker端口映射冲突管理
- linux ECS CentOS 2.6版本内核升级至3.10 安装docker
- .NET core for docker
- centos7 docker mysql56
- docker实践入门之五
- Docker redis安装
- 主机网络切换后,docker toolbox里的容器网络不通了,解决方法
- Kubernetes扫盲
- 使用Docker官方的Django包【转】
- Docker命令行探秘
- CentOS7 docker安装
- [转]你闺女也能看懂的插画版Kubernetes指南