• Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)


    service 的容器副本会 scale up/down,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果 service 有要管理的数据,那么这些数据应该如何存放呢?

    选项一:打包在容器里。

    显然不行。除非数据不会发生变化,否则,如何在多个副本直接保持同步呢?

    选项二:数据放在 Docker 主机的本地目录中,通过 volume 映射到容器里。

    位于同一个主机的副本倒是能够共享这个 volume,但不同主机中的副本如何同步呢?

    选项三:利用 Docker 的 volume driver,由外部 storage provider 管理和提供 volume,所有 Docker 主机 volume 将挂载到各个副本。

    这是目前最佳的方案。volume 不依赖 Docker 主机和容器,生命周期由 storage provider 管理,volume 的高可用和数据有效性也全权由 provider 负责,Docker 只管使用。

    我们将以 Rex-Ray 为例来实践第三种方案。

    Rex-Ray

    Rex-Ray 是开源的容器存储管理解决方案。支持主流的容器编排引擎 Docker Swarm、 Kubernetes 和 Mesos,为容器集群提供自动化的存储编排功能。

    在《每天5分钟玩转Docker容器技术》的数据管理章节中已经详细讨论了 Rex-Ray 如何跨 Docker 主机管理 data volume,本节内容也是建立在这些基础知识之上。为节省篇幅,建议大家先阅读这些内容,然后回到这里继续实践。

    我们将在部署如下的 Rex-Ray 实验环境:

    526.png

    1. swarm 中的所有 node 都安装部署 Rex-Ray。

    2. Rex-Ray 使用 VirtualBox backend。

    3. 具体的安装部署方法请参考前面 Docker 数据管理章节,这里不再赘述。

    实践

    接下来,我们将:

    1. 创建 httpd 服务,并使用 Rex-Ray data volume。

    2. 修改 volume 中的数据,并验证更新同步到所有副本。

    3. 验证 failover 发生时,更新的数据不会丢失。

    创建 service

    执行如下命令:

    docker service create --name my_web 
    --publish 8080:80
    --mount "type=volume,volume-driver=rexray,source=web_data,target=/usr/local/apache2/htdocs"
    httpd
    1. --mount 指定数据卷的 volume-driver  rexray

    2. source 指定数据卷的名字为 web_data,如果不存在,则会新建。

    3. target 指定将数据卷 mount 到每个副本容器的 /usr/local/apache2/htdocs,即存放静态页面的目录。

    527.png
     

    访问 service:

    528.png

    权限有些问题,需要进容器修改 /usr/local/apache2/htdocs 的权限。

    529.png

    service 已经可以访问了:

    530.png

    当前 Rex-Ray volume web_data 被挂载到 node swarm-worker1

    531.png

    mount 到 /var/lib/libstorage/volumes/web_data/data 目录。

    532.png

    通过 docker inspect my_web.1.2j7dgzuyk9hodseej707t97su 可以确认 /var/lib/libstorage/volumes/web_data/data 已经映射到容器目录 /usr/local/apache2/htdocs

    533.png

    当前的实验环境如图所示:

    534.png

    下一节我们验证在故障情况 Volume 的持久性。

    书籍:

    1.《每天5分钟玩转Docker容器技术》
    https://item.jd.com/16936307278.html

    2.《每天5分钟玩转OpenStack》
    https://item.jd.com/12086376.html

  • 相关阅读:
    EasyUI左边树菜单和datagrid分页
    Linux上安装Redis教程
    TreeMap和TreeSet的区别与联系
    将Map<String, List<Map<String,Object>>>进行排序
    Linux系统安装JDK和Tomcat
    点击添加按钮,使用ajax动态添加一行和移除一行,并且序号重新排序和数据不重复操作判断
    23种设计模式汇总整理
    SSH架构BaseDao实现
    双击Table表格td变成text修改内容
    用户找回密码功能JS验证邮箱通过点击下一步隐藏邮箱输入框并修改下一步按钮的ID
  • 原文地址:https://www.cnblogs.com/CloudMan6/p/8000906.html
Copyright © 2020-2023  润新知