代码级干货 | 进军Docker 1.12,将代理与Swarm完美整合

  最后一项参数为环境变量MODE,其负责告知该代理,各容器将被部署至Swarm集群当中。请参阅项目的README文件以了解更多细节信息。

物联网

配合代理服务的Docker Swarm集群

  需要注意的是,该代理即使已经运行在某一节点当中,仍会被放置于其外以表达其在逻辑上的分离特性。

  在开始之前,首先确认代理正在运行。

  docker service ps proxy

  如果其“最新状态(Last state)”为“运行(Running)”,则可继续。如果不然,请等待直到该服务上线并开始运行。

  现在代理已经部署完成,我们应当确保其知晓go-demo服务的存在。

  curl "$(docker-machine ip node-1):8080/v1/docker-flow-proxy/reconfigure?serviceName=go-demo&servicePath=/demo&port=8080"

  这条请求的作用是重新配置代理以指定服务名称(go-demo)、API的URL路径(/demo)以及该服务的内部端口(8080)。从现在开始,所有指向该代理且使用以/demo开头路径的请求都将被重新定向至go-demo服务。

  现在我们可以测试代理是否按预期运行——发送一条HTTP请求进行验证。

  curl -i $(docker-machine ip node-1)/demo/hello

  该curl命令的输出结果如下所示。

  HTTP/1.1 200 OK

  Date: Mon, 18 Jul 2016 23:11:31 GMT

  Content-Length: 14

  Content-Type: text/plain; charset=utf-8

  hello, world!

  代理正常起效!它响应了HTTP status 200并向API返回了hello,world!

  需要注意的是,这一过程与我们执行操作所在的具体节点无关。由于Docker网络(路由体系)负责实现负载均衡,因此我们能够前往任意服务器。作为示例,下面我们发送同样的请求,但这一次立足于node-3。

  curl -i $(docker-machine ip node-3)/demo/hello

  结果仍然完全相同。

  下面让我们一起了解由该代理生成的配置。

  代理配置

  如果大家选择自行构建代理解决方案,那么当然需要了解如何配置代理并利用Docker网络中的各项新功能。

  下面首先检查Docker Flow: Proxy为我们创建的配置。我们可以进入当前运行的容器并通过/cfg/haproxy.cfg文件查看这部分信息。不过问题是,找到由Docker Swarm运行的一套容器需要配合一点技巧。举例来说,如果我们利用Docker Compose部署此容器,那么其名称会存在一定规律,即使用__格式。而docker service命令会利用散列后的名称运行容器。在我的笔记本上,docker-flow-proxy的创建名称为proxy.1.e07jvhdb9e6s76mr9ol41u4sn。因此,要进入由Docker Swarm部署并运行的容器,我们需要对镜像名称进行过滤。

  第一步,我们需要找到代理运行所在的具体节点。

  docker service ps proxy

  需要注意的是该node列中的值,同时确保在以下命令中使用该正确值。

  eval $(docker-machine env node-1) # Change node-1 with the node value previously obtained

  此命令将给出以下代理配置输出结果。

  docker exec -it \ $(docker ps -q --filter "ancestor=vfarcic/docker-flow-proxy") \ cat /cfg/haproxy.cfg exit

  配置信息中最重要的部分如下所示。

  frontend services bind *:80 bind *:443 option http-server-close acl url_go-demo path_beg /demo use_backend go-demo-be if url_go-demo backend go-demo-be server go-demo go-demo:8080

  对于第一部分(frontend),熟悉HAProxy的朋友应该不会感到陌生。其接收来自端口80(HTTP)以及443(HTTPS)的请求。如果路径以/demo开头,其会被重新定向至后端go-demo处。在这里,各请求会被发送至go-demo在端口8080上的地址。此地址同时亦是我们所部署的服务名称。由于go-demo同proxy存在于同一网络当中,因此Docker能够确保该请求被重新定向至目标容器。很简单,对吧?我们无需再另行指定IP以及外部端口。

  接下来的问题是,如何实现负载均衡。举例来说,我们要如何指定该代理跨越全部实例执行循环?

  负载均衡

  在开始进行负载均衡解释之前,首先创建几个go-demo服务实例。

  eval $(docker-machine env node-1) docker service scale go-demo=5

  稍等一会儿,就将有5个go-demo服务实例开始运行。

物联网

包含规模化go-demo服务与代理实例的Docker Swarm集群