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 实验环境:
-
swarm 中的所有 node 都安装部署 Rex-Ray。
-
Rex-Ray 使用 VirtualBox backend。
-
具体的安装部署方法请参考前面 Docker 数据管理章节,这里不再赘述。
实践
接下来,我们将:
-
创建 httpd 服务,并使用 Rex-Ray data volume。
-
修改 volume 中的数据,并验证更新同步到所有副本。
-
验证 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
-
--mount
指定数据卷的volume-driver
为rexray
。 -
source
指定数据卷的名字为web_data
,如果不存在,则会新建。 -
target
指定将数据卷 mount 到每个副本容器的/usr/local/apache2/htdocs
,即存放静态页面的目录。
访问 service:
权限有些问题,需要进容器修改 /usr/local/apache2/htdocs 的权限。
service 已经可以访问了:
当前 Rex-Ray volume web_data
被挂载到 node swarm-worker1
。
mount 到 /var/lib/libstorage/volumes/web_data/data
目录。
通过 docker inspect my_web.1.2j7dgzuyk9hodseej707t97su
可以确认 /var/lib/libstorage/volumes/web_data/data
已经映射到容器目录 /usr/local/apache2/htdocs
当前的实验环境如图所示:
下一节我们验证在故障情况 Volume 的持久性。
书籍:
1.《每天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html
2.《每天5分钟玩转OpenStack》
https://item.jd.com/12086376.html
本文转自CloudMan6 51CTO博客,原文链接:http://blog.51cto.com/cloudman/2048580

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何滚动更新 Service?- 每天5分钟玩转 Docker 容器技术(102)
在前面的实验中,我们部署了多个副本的服务,本节将讨论如何滚动更新每一个副本。 滚动更新降低了应用更新的风险,如果某个副本更新失败,整个更新将暂停,其他副本则可以继续提供服务。同时,在更新的过程中,总是有副本在运行的,因此也保证了业务的连续性。 下面我们将部署三副本的服务,镜像使用 httpd:2.2.31,然后将其更新到 httpd:2.2.32。 创建服务: dockerservicecreate--namemy_web--replicas=3httpd:2.2.31 将 service 更新到 httpd:2.2.32: dockerserviceupdate--imagehttpd:2.2.32my_web --image指定新的镜像。 Swarm 将按照如下步骤执行滚动更新: 停止第一个副本。 调度任务,选择 worker node。 在 worker 上用新的镜像启动副本。 如果副本(容器)运行成功,继续更新下一个副本;如果失败,暂停整个更新过程。 docker service ps查看更新结果。 三个副本都已经更新到 httpd:2.2.32。 默认配置下,Swar...
- 下一篇
神奇的 routing mesh - 每天5分钟玩转 Docker 容器技术(100)
接上一节案例,当我们访问任何节点的 8080 端口时,swarm 内部的 load balancer 会将请求转发给 web_server 其中的一个副本。 这就是 routing mesh 的作用。 所以,无论访问哪个节点,即使该节点上没有运行 service 的副本,最终都能访问到 service。 另外,我们还可以配置一个外部 load balancer,将请求路由到 swarm service。比如配置 HAProxy,将请求分发到各个节点的 8080 端口。 ingress 网络 当我们应用--publish-add 8080:80时,swarm 会重新配置 service,我们看看容器都发生了哪些重要变化。 是不是觉得很诧异?之前的所有副本都被 Shutdown,然后启动了新的副本。我们查看一下新副本的容器网络配置。 容器的网络与--publish-add之前已经大不一样了,现在有两块网卡,每块网卡连接不同的 Docker 网络。 实际上: eth0 连接的是一个 overlay 类型的网络,名字为ingress,其作用是让运行在不同主机上的容器可以相互通信。 eth1 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 设置Eclipse缩进为4个空格,增强代码规范