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

优质内容筛选与推荐>>
1、项目进展03
2、json模块
3、CASE WHEN用法
4、Em和Px的区别
5、watch命令


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn