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

  虽然我们能够在Swarm集群当中部署任意数量的服务,但这并不代表各项服务全部可为用户所访问。而新的Swarm网络使得各项服务之间能够更为轻松地实现彼此通信。

  下面我们将共同探讨如何利用其对各服务进行公开。我们还将尝试将一套代理机制整合至Swarm网络当中,从而更为充分地发挥1.12版本带来的优势。

  在开始进行之前,我们需要设置一套用于演示的集群。

  环境设置

  要完成本示例,我们假定大家已经拥有一套版本为v0.8或者更高的Docker Machine,其中包含版本为v1.12或者更高的Docker Engine。最便捷的获取方法就是通过Docker Toolbox下载。

  如果您是Windows用户,请利用Git Bas运行全部示例(通过Docker Toolbox安装)。

  docker-machine create -d virtualbox node-1 docker-machine create -d virtualbox node-2 docker-machine create -d virtualbox node-3 eval $(docker-machine env node-1) docker swarm init \ --advertise-addr $(docker-machine ip node-1) \ --listen-addr $(docker-machine ip node-1):2377 TOKEN=$(docker swarm join-token -q worker) eval $(docker-machine env node-2) docker swarm join \ --token $TOKEN \ $(docker-machine ip node-1):2377 eval $(docker-machine env node-3) docker swarm join \ --token $TOKEN \ $(docker-machine ip node-1):2377

  现在我们已经拥有了一套Swarm集群,接下来是部署一项服务。

物联网

包含三个节点的Docker Swarm集群

  向集群中部署服务

  为了检验新的Docker Swarm网络功能,我们首先创建以下两套网络。

  eval $(docker-machine env node-1) docker network create --driver overlay proxy docker network create --driver overlay go-demo

  其一(proxy)将用于代理与面向API公开的服务之间的通信。而其二(go-demo)则面向全部用于构建go-demo服务的容器。该服务包含两套容器,且利用MongoDB用于存储数据,而vfarcic/go-demo则作为配备API的后端。

  我们将从数据库起步。由于其不会公共开放,因此不需要将其添加至代理当中。这里,我们直接将其附加至go-demo网络。

  docker service create --name go-demo-db \ --network go-demo \ mongo

  数据库上线并开始运行后,我们接下来部署后端。由于我们希望外部用户能够使用该API,因此应当将其纳入代理。我们将其同时附加至两套网络(proxy与go-demo)。

docker service create --name go-demo \ -e DB=go-demo-db \ --network go-demo \ --network proxy \ vfarcic/go-demo

物联网

由三台节点、两套网络与多套容器构成的Docker Swarm集群

  现在两套容器都运行在集群当中,且能够彼此通过go-demo网络进行通信。下面将代理引入其中。我们这里使用HAProxy。

  需要注意的是,我们并没有指定端口,这意味着没有任何一套容器能够为go-demo网络之外的请求所访问。

  设置一项代理服务

  我们可以通过多种方式建立代理机制。其一利用HAProxy创建一套新镜像,其中包含各配置文件。这种方式比较适合服务数量相对固定的情况。否则,我们应当创建一套每当有新服务(而非新版本发布)出现时即进行新配置的镜像。

  通过第二种方法,其将以分卷形式存在,我们能够在必要时仅修改配置文件而非整套新镜像。然而,这种作法也存在弊端。在部署至一套集群时,我们应当尽可能避免使用分卷。接下来大家会看到,代理就是不需要分卷的机制之一。另外,--volume可替换为docker service命令中的—mount参数。

  第三种选项是使用专门与Docker Swarm协作的代理之一。在这种情况下,我们将使用vfarcic/docker-flow-proxy容器,其由Docker Flow: Proxy项目创建而成。其基于HAProxy且拥有多项其它功能,允许我们通过发送HTTP请求对其进行重新配置。

  下面一起来看:

  docker service create --name proxy \ -p 80:80 \ -p 443:443 \ -p 8080:8080 \ --network proxy \ -e MODE=swarm \ vfarcic/docker-flow-proxy

  我们开启的端口80与443将负责处理互联网流量(HTTP与HTTPS)。第三个端口则为8080,我们将利用它向代理发送配置请求。另外,我们强调其应当归属于proxy网络。如此一来,由于go-demo也被附加至同一套网络,意味着代理能够通过SDN对其进行访问。

  在这套代理的帮助下,我们实现了最实用的网络路由功能之一。无论大家在哪台服务器上运行该代理,我们都能够向任意节点发送请求,而Docker网络会确保其被重新定向至代理之一。