docker基础之七storage-1-rexray
数据管理,即跨主机docker存储
从业务数据角度看,容器分:stateless容器和stateful容器
stateless指容器在运行过程中不需要保存数据,每次访问的结果不依赖上一次访问,如静态页面
stateful指容器需要保存数据,而且数据会发生变化,访问的结果依赖之前请求的处理结果,如数据库服务器
state就是数据,如果容器需要处理并存储数据,它就是有状态的
前面单机docker存储时所用的data volume可以存储容器的状态,本质是docker主机本地目录
本次讨论跨docker主机管理data volume
data volume由storage provider提供
data volume由volume driver管理
创建volume时如果不特别指定,默认使用local类型的driver,即从docker host的本地目录中分配存储空间,如果要支持跨主机的volume,则需要使用第三方driver
rexray、flocker、glusterfs是volume plugin推荐方案top3
cloudman介绍的是Rex-Ray driver,详情转github
安装
在docker主机ceph4和ceph5执行
curl -sSL https://rexray.io/install | sh rexray has been installed to /usr/bin/rexray REX-Ray ------- Binary: /usr/bin/rexray Flavor: client+agent+controller SemVer: 0.11.4 OsArch: Linux-x86_64 Commit: e7414eaa971b27977d2283f2882825393493179d Formed: Wed, 16 Jan 2019 00:03:57 CST
然后创建并编辑 Rex-Ray 的配置文件 /etc/rexray/config.yml
libstorage: # The libstorage.service property directs a libStorage client to direct its # requests to the given service by default. It is not used by the server. service: rbd # 使用rbd作为backend server: services: rbd: driver: rbd rbd: defaultPool: rbd # cephArgs: --id myuser 必须已定义指定的用户/ ID并且其密钥环位于/etc/ceph/<clustername>.client.<id>.keyring,并且任何给定的集群标志必须具有配置文件 /etc/ceph/<clustername>.conf cephArgs: --id admin
后端存储配合:
搭建ceph集群,并创建rbd pool
[root@ceph4 ~]# ceph osd pool create rbd 32 pool 'rbd' created
重启 Rex-Ray 服务:
[root@ceph4 ~]# systemctl restart rexray [root@ceph4 ~]# systemctl status rexray ● rexray.service - rexray Loaded: loaded (/etc/systemd/system/rexray.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2019-09-11 11:23:20 CST; 1s ago Main PID: 9717 (rexray) CGroup: /system.slice/rexray.service └─9717 /usr/bin/rexray start Sep 11 11:23:20 ceph4 systemd[1]: Started rexray.
创建块设备:
[root@ceph4 ~]# rbd create --size 2048 my_data
--size,默认单位M
或者
[root@ceph5 ~]# docker volume create --driver rexray --name=mysqldata --opt=size=2 mysqldata
测试 Rex-Ray 是否能够正常工作。
[root@ceph4 ~]# rexray volume ls ID Name Status Size rbd.my_data my_data available 2 rbd.mysqldata mysqldata available 2
或
[root@ceph4 ~]# docker volume ls DRIVER VOLUME NAME rexray my_data rexray mysqldata
存疑:fast-diff
[root@ceph4 ~]# rbd du mysqldata warning: fast-diff map is not enabled for mysqldata. operation may be slow. NAME PROVISIONED USED mysqldata 2GiB 0B
实验环境:
1.在ceph4上启动 MySQL 容器 mydb_on_ceph4,并使用 mysqldata 作为数据卷。
2.更新数据库,然后销毁 mydb_on_ceph4。
3.在 dokcer2 上启动 MySQL 容器 mydb_on_ceph5,也使用 mysqldata作为数据卷,然后验证数据的有效性。
在ceph4上启动容器 mydb_on_ceph4,并使用mysqldata作为数据卷。
[root@ceph4 ~]# docker run --name mydb_on_ceph4 -v mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 -d mysql 3c6c02334d53ea2ea6b7a6003952cc266b6ca31cfa1eea08cad77d1ec3f299cb
确认rexray volume mysqldata并未被挂载到ceph4上(老版本是要挂载在docker主机上的)
[root@ceph4 ~]# docker volume inspect mysqldata [ { "CreatedAt": "0001-01-01T00:00:00Z", "Driver": "rexray", "Labels": null, "Mountpoint": "", "Name": "mysqldata", "Options": null, "Scope": "global", "Status": { "availabilityZone": "", "fields": null, "iops": 0, "name": "mysqldata", "server": "rbd", "service": "rbd", "size": 2, "type": "rbd" } } ]
mysqldata已被mount到容器mydb_on_ceph4的目录/var/lib/mysql
[root@ceph4 ~]# docker inspect mydb_on_ceph4 "Mounts": [ { "Type": "volume", "Name": "mysqldata", "Source": "", "Destination": "/var/lib/mysql", "Driver": "rexray", "Mode": "", "RW": true, "Propagation": "" } ],
更新数据库
[root@ceph4 ~]# docker exec -it mydb_on_ceph4 bash #进入容器mydb_on_ceph4 root@3c6c02334d53:/# mysql #登录数据库 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 8.0.17 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use mysql #切换到数据库mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> create table my_id(id int(4) ); #创建数据库表my_id Query OK, 0 rows affected, 1 warning (5.64 sec) mysql> insert my_id values( 111 ); #插入一条数据 Query OK, 1 row affected (0.10 sec) mysql> select * from my_id; #查看数据 +------+ | id | +------+ | 111 | +------+ 1 row in set (0.00 sec) mysql>
删除容器
[root@ceph4 ~]# docker rm -f mydb_on_ceph4 mydb_on_ceph4
确认容器已经不存在
[root@ceph4 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
在ceph5上启动容器mydb_on_ceph5,也使用mysqldata作为数据卷,然后验证数据的有效性。
[root@ceph5 ~]# docker run --name mydb_on_ceph5 -v mysqldata:/var/lib/mysql -d mysql e341d6adc223d433f893b8cb2d530e5a04cb18866ac214615be2f65233e09c08
[root@ceph5 ~]# docker exec -it mydb_on_ceph5 bash root@e341d6adc223:/# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.17 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from my_id; +------+ | id | +------+ | 111 | +------+ 1 row in set (0.06 sec) mysql>
新容器也使用相同的卷 mysqldata,不过这次不需要指定环境变量 MYSQL_ROOT_PASSWORD,因为密码已经保存到 mysqldata 里面了。
Rex-Ray可以提供跨主机的volume,其生命周期不依赖Docker Host和容器,是stateful 容器理想的数据存储方式。
如何使用其他storage provider的volume driver,部署和配置 storage provider 会有所不同,不过Docker在使用volume的方式都是一样的:
通过 docker volume create --driver 创建 volume,创建容器时用 -v 指定上一步创建的 volume
优质内容筛选与推荐>>