容器分类
从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器。
无状态是指容器在运行过程中不需要保存数据,每次访问的结果不依赖上一次访问,比如提供静态页面的 web 服务器。
有状态是指容器需要保存数据,而且数据会发生变化,访问的结果依赖之前请求的处理结果,最典型的就是数据库服务器
volume driver
volume driver可以实现跨主机管理 data volume 方案
任何一个 data volume 都是由 driver 管理的,创建 volume 时如果不特别指定,将使用 local
类型的 driver,即从 Docker Host 的本地目录中分配存储空间。如果要支持跨主机的 volume,则需要使用第三方 driver
Rex-Ray driver
特点
- cep 是开源的,而且社区活跃。
- 支持多种 backend,VirtualBox 的 Virtual Media、Amazon EBS、Ceph RBD、OpenStack Cinder 等。
- 支持多种操作系统,Ubuntu、CentOS、RHEL 和 CoreOS。
- 支持多种容器编排引擎,Docker Swarm、Kubernetes 和 Mesos。
- Rex-Ray 安装使用方法非常简单。
安装配置
Rex-Ray 以 standalone 进程的方式运行在 Docker 主机上
在使用 Rex-Ray driver 的主机 docker1 和 docker2 上运行如下命令
curl -sSL https://rexray.io/install | sh
然后创建并编辑 Rex-Ray 的配置文件 /etc/rexray/config.yml
可以使用图形化的在线 Rex-Ray 配置生成器
VirtualBox backend
在 VirtualBox 宿主机,即笔记本上启动 vboxwebsrv 服务:
vboxwebsrv -H 0.0.0.0
执行如下命令关闭 VirtualBox 的登录认证:VBoxManage setproperty websrvauthlibrary null
在关机状态下修改虚拟机 docker1 和 docker2 的 Storage 配置:
1.删除 IDE
controller。
2.设置 SATA
controller 的 port 数量为最大值 30
。
重启 Rex-Ray 服务:
systemctl restart rexray.service
运行 rexray volume ls
测试 Rex-Ray 是否能够正常工作。
列表中的 volume 是当前 VirtualBox 所有的虚拟磁盘。
创建 Rex-Ray volume
安装插件
从Docker 1.13开始,Docker现在支持一种新的插件架构,其中插件可以作为容器安装。
$ docker plugin install rexray / ebs EBS_ACCESSKEY = access_key EBS_SECRETKEY = secret_key
创建 volume
在 docker1 或 docker2 上执行如下命令创建 volume:
rexray volume create mysql_data --size=2
使用volume启动docker
docker run -dit --name mydb_on_docker1 --volume-driver=rexray -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=passw0rd -d mysql
未创建成功放弃,改用ceph作为后端存储
验证volume
ceph-做后端
1.更改rex-ray的配置文件
其中test-pool是ceph中建的pool
2.重启rex-ray服务
rexray restart
3.创建卷
docker volume create --driver rexray --name=mysqldata --opt=size=2
4.使用卷创建容器
docker run -dit --name mydb_on_docker1 --volume-driver=rexray -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=passw0rd -d mysq
5.写数据测试
6.验证数据一致性
删除mydb_on_docker1
重新创建一个容器
docker run --name mydb_on_docker2 -v mysqldata:/var/lib/mysql -d mysql
新容器也使用相同的卷 mysqldata
,不过这次不需要指定环境变量 MYSQL_ROOT_PASSWORD
,因为密码已经保存到 mysqldata
里面了。
现在 Rex-Ray volume mysqldata
已经挂载到 docker2:
① 进入到容器 mydb_on_docker2
。
② 登录数据库,密码与 mydb_on_docker1
一致。
③ 切换到数据库 mysql
。
④ 确认之前由 mydb_on_docker1
创建的表和写入的数据完好无损。