从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器。
无状态:是指容器在运行的过程中不需要保存数据,每次访问的结果不依赖上一次的访问,比如提供静态页面的web服务器。
有状态:是指容器需要保存数据,而且数据会发生变化,访问的结果依赖之前的请求的处理结果,最典型的就是数据库服务器。
状态就是:数据,如果容器需要处理并存储数据,他就是有状态的,反之则无状态
对于有状态的容器,如何保存数据呢?
我们之前学习了data volume可以存储容器的状态,不过当时讨论的volume其本质是docker主机本地目录。
通过我们之前的学习我们知道,本地目录存在一个隐患:如果host主机宕机了,如何恢复容器?
一个办法是定期的备份数据,但这种方案还是会丢失从上次备份到宕机这段时间的数据。更好的方案是由专门的storage provider提供volume,docker从provider哪里获取volume并挂在到容器,这样即使host挂了,也可以立刻从其他可用的host上启动想通镜像的容器,挂载之前使用的volume,这样就不会有数据丢失。
举个栗子:
假设有两个docker 主机,Host1上运行了一个MYSQL容器,为了保护数据,data volume由storage provider提供,如盗图:
当host1发生故障,我们会在host2上启动相同的mysql,并挂载data volume
docker是如何实现跨主机管理data volume方案的呢?
答案是:volume driver
任何一个data volume都是由driver管理的,创建爱你volume时如果不特别指定,将使用local类型的driver,即:从docker host的本地目录中分配存储空间。如果要支持跨主机的volume,则需要使用第三方driver
目前已经有很多可用的driver,比如使用Azure file storage的driver,使用glusterfs的driver,完整的列表可以参考:https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins
我们这里将选择Rex-Ray driver,其原因是:
1.Rex-Ray是开源的,而且社区活跃
2.支持多种backend,virtualbox的virtual media,amazon ebs,ceph rbd,openstack cinder等
3.支持多种操作系统,ubuntu,centos,rhel,coreos
4.支持多种容器编排引擎,docker swarm,kubernetes和mesos
5.Rex-Ray安装使用方法非常简单