从业务数据的角度看,容器能够分为两类:无状态(stateless)容器和有状态(stateful)容器。web
无状态是指容器在运行过程当中不须要保存数据,每次访问的结果不依赖上一次访问,好比提供静态页面的 web 服务器。docker
有状态是指容器须要保存数据,并且数据会发生变化,访问的结果依赖以前请求的处理结果,最典型的就是数据库服务器。数据库
简单来说,状态(state)就是数据,若是容器须要处理并存储数据,它就是有状态的,反之则无状态。服务器
对于有状态的容器,如何保存数据呢?less
前面在 Docker 存储章节咱们学习到 data volume 能够存储容器的状态,不过当时讨论的 volume 其本质是 Docker 主机 本地 的目录。ide
本地目录就存在一个隐患:若是 Docker Host 宕机了,如何恢复容器?学习
一个办法就是按期备份数据,但这种方案仍是会丢失从上次备份到宕机这段时间的数据。更好的方案是由专门的 storage provider 提供 volume,Docker 从 provider 那里获取 volume 并挂载到容器。这样即便 Host 挂了,也能够马上在其余可用 Host 上启动相同镜像的容器,挂载以前使用的 volume,这样就不会有数据丢失。spa
本章将详细讨论如何实现跨 Docker 主机管理 data volume。操作系统
假设有两个 Dokcer 主机,Host1 运行了一个 MySQL 容器,为了保护数据,data volume 由 storage provider 提供,以下图所示。code
当 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,其缘由是:
Rex-Ray 是开源的,并且社区活跃。
支持多种 backend,VirtualBox 的 Virtual Media、Amazon EBS、Ceph RBD、OpenStack Cinder 等。
支持多种操做系统,Ubuntu、CentOS、RHEL 和 CoreOS。
支持多种容器编排引擎,Docker Swarm、Kubernetes 和 Mesos。
Rex-Ray 安装使用方法很是简单。
下一节咱们开始实践 Rex-Ray。