概述
为了能够实现容器数据的持久化,Docker提出了卷(volume)的概念。卷就是目录或者文件,由docker Daemon挂载到容器中,卷中的数据在容器被删除之后还是可以访问,从而实现持久化。
Docker提供了两种管理数据的方式,数据卷和数据卷容器。
基础管理
- 数据卷
在启动镜像的时候,通过-v标签来创建新卷或者挂载已有的数据卷。 - 容器卷
通过create命令创建新的容器卷,然后在启动应用镜像时,使用-volume-from来挂在容器卷。
Docker卷管理的问题:
- 只支持本地数据卷,不能挂在远程服务器的卷。
- 缺乏对数据卷生命周期的有效关系,例如不能使用Docker命令查看系统上的所有卷。会浪费空间。
卷插件
通过插件可以解决Docker卷自身的一些不足。
卷插件的工作原理:
Docker定义了一套标准的卷插件REST API,Docker自身实现了这套API的客户端,它会按照步骤发现、激活插件。当Docker需要完成创建、挂载、删除等操作的时候,它会向插件发送对应的REST API,然后由插件完成真在的数据底层工作。
本质上,卷插件就是一个服务器,接收Docker的命令,名给予相应的操作。因为它们通过REST API实现的,所以,可以进行远程主机的卷管理,也很灵活方便。
卷插件的API接口:
- Plugin.Active:用于激活一个插件,是Docker与卷插件的握手报文。
- VolumeDriver.Create:创建一个卷,Docker会发送卷的名称和参数给插件,然后插件在本地创建一个卷。
- VolumeDriver.Mount:挂在一个卷到本机,Docker把卷的名称和参数发给插件,插件会返回一个本地路径给Docker,这个路径就是卷的位置,然后Docker就会将这个路径挂载到容器。
- VolumeDriver.Path:一个卷创建成功之后,Docker调用这个API来获取卷的路径。
- VolumeDriver.Unmount:卸载卷,Docker告诉插件这个卷不用了,插件就可能做相应的清理工作。
- VolumeDriver.Remove:删掉特定的卷。
整个卷插件体系是通过卷的名称来管理的。
已有的卷插件:
- Convoy:一种基于本地存储的单机版插件。
- FLocker:支持多种后台驱动,包括OpenStack等,不支持卷共享,单点问题。