本文讲的是<b>使用Docker、Registrator、Consul、Consul Template和Nginx实现高可扩展的Web框架</b>,【编者的话】Consul是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用Go语言开发,基于 Mozilla Public License 2.0 的协议开源。本文介绍了如何使用Consul将多个Docker容器组合起来,以提供一个高可扩展的Web服务。

在这篇文章中,我将会讲述如何使用Docker将Consul、Consul Template、Registrator和Nginx组装成一个值得信任且可扩展的框架——DR CoN。一旦组装完成,DR CoN就可以让你在这个框架中添加和移除服务,关键是你不需要重写任何配置,也不需要重启任何服务,一切都能正常运行!
执行之后,将在Ubuntu上启一个虚拟机来运行Docker daemon。为了连上daemon,执行以下命令:
你可以通过执行下述命令来验证Docker是否成功安装:
在Dockerfile文件所在目录下执行以下命令:
执行后,将创建一个名为 <code>python/server</code> 的镜像,通过执行以下命令运行一个容器:
我们可以通过<code>curl</code>命令调用这个简单服务来测试它是否能够正常运行:
Consul是一个拥有DNS和HTTP API的服务。它还有很多其它功能,例如服务健康检测、跨主机集群构建和“键-值”对存储库。执行以下命令在Docker container中运行Consul:
如果你通过浏览器能够访问<code>$DOCKER_IP:8500</code>,你将在控制面板上看到Consul中已经注册的所有服务。
我们能够通过<code>curl</code>向Consul的Web API注册一个服务:
然后,我们可以通过 <code>dig</code> 命令查询Consul为这个提供的DNS API:
执行后,结果如下:
等等,这有个问题,服务的端口号在哪?很遗憾,DNS的记录中并没有返回服务的端口号。为了获取端口号,我们必须检查SRV记录:
SRV记录很难用,因为很多技术不支持它们。
在Docker容器启动后,Registrator配置好相应的环境变量并将这个容器注册到Consul上,示例如下:
Registrator启动后,我们运行一个服务:
命令执行后,这个服务被自动添加到Consul,同理,如果我们关闭这个服务,它在Consul上会被自动移除。由于Registrator不需要我们手动将服务注册到Consul,因此它是DR CoN需要组装的第一部分。
比如说,它能够重写<code>nginx.conf</code>这个文件,将所有服务的路由信息列入其中,然后重新加载Nginx的配置,使得多个相似服务达到负载均衡,或者给多种服务提供一个单一的终端。
注意: 上面的 <code>\n\</code> 表示另起一行,并且为Docker的多行命令去除换行。
这个Docker容器将会运行Consul Template和Nginx,当服务有变化时,它将重写Nginx的<code>app.conf</code>文件并且重新加载Nginx。
通过以下命令构建这个容器:
然后,启动容器:
<code>SERVICE</code> 选项用来指定Consul上的服务。因此,上面这个DR CoN 容器将会通过所有命名为 <code>simple</code> 的服务来达到负载均衡。
现在让我们把一切都组装起来。
运行Consul:
运行Registrator:
运行DR CoN:
执行 <code>curl $DOCKER_IP:80</code> 命令,结果如下:
现在开启 <code>simple</code> 的服务:
执行后,将发生:
Registrator将这个服务注册到Consul;
Consul Template重写nginx.conf,然后重新加载配置。
现在执行<code>curl $DOCKER_IP:80</code>将成功路由到这个服务。
如果我们在其他端口上启动另一个simple服务:
请求将通过这两个simple服务进行负载均衡。
有趣的是,我们可以执行<code>while true; do curl $DOCKER_IP:80; sleep 1; done</code>这个脚本,当关闭或者启动simple服务时,脚本仍在快速运行且所有请求都能正常进行。
借助Docker,描述、分布和实现DR CoN这类框架变得更加容易,当然也少不了Consul这么好用的工具。使用Docker更加强大的工具来组装服务是非常有趣和有用的,现在我就能创建一种横向可扩展的框架,并且一切都能正常运行。
注[1]: Docker在1.2版本之后就默认使用libcontainer,而不是LXC,虽然Docker支持LXC。由于不论libcontainer和LXC都是基于Linux Kernel中的namespace和Cgroup,所以现在只能运行在Linux上。
===========================
译者介绍
肖远昊,硕士研究生,就读于北京航空航天大学计算机学院ACT实验室,目前从事虚拟化、云计算方向的研究。希望通过DockerOne与大家一起交流和学习Docker。
原文发布时间为:2015-03-26
本文作者:xiaoyh
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:使用Docker、Registrator、Consul、Consul Template和Nginx实现高可扩展的Web框架