最后一項參數(shù)為環(huán)境變量MODE,其負責(zé)告知該代理,各容器將被部署至Swarm集群當(dāng)中。請參閱項目的README文件以了解更多細節(jié)信息。

配合代理服務(wù)的Docker Swarm集群
需要注意的是,該代理即使已經(jīng)運行在某一節(jié)點當(dāng)中,仍會被放置于其外以表達其在邏輯上的分離特性。
在開始之前,首先確認代理正在運行。
docker service ps proxy
如果其“最新狀態(tài)(Last state)”為“運行(Running)”,則可繼續(xù)。如果不然,請等待直到該服務(wù)上線并開始運行。
現(xiàn)在代理已經(jīng)部署完成,我們應(yīng)當(dāng)確保其知曉go-demo服務(wù)的存在。
curl "$(docker-machine ip node-1):8080/v1/docker-flow-proxy/reconfigure?serviceName=go-demo&servicePath=/demo&port=8080"
這條請求的作用是重新配置代理以指定服務(wù)名稱(go-demo)、API的URL路徑(/demo)以及該服務(wù)的內(nèi)部端口(8080)。從現(xiàn)在開始,所有指向該代理且使用以/demo開頭路徑的請求都將被重新定向至go-demo服務(wù)。
現(xiàn)在我們可以測試代理是否按預(yù)期運行——發(fā)送一條HTTP請求進行驗證。
curl -i $(docker-machine ip node-1)/demo/hello
該curl命令的輸出結(jié)果如下所示。
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!
代理正常起效!它響應(yīng)了HTTP status 200并向API返回了hello,world!
需要注意的是,這一過程與我們執(zhí)行操作所在的具體節(jié)點無關(guān)。由于Docker網(wǎng)絡(luò)(路由體系)負責(zé)實現(xiàn)負載均衡,因此我們能夠前往任意服務(wù)器。作為示例,下面我們發(fā)送同樣的請求,但這一次立足于node-3。
curl -i $(docker-machine ip node-3)/demo/hello
結(jié)果仍然完全相同。
下面讓我們一起了解由該代理生成的配置。
代理配置
如果大家選擇自行構(gòu)建代理解決方案,那么當(dāng)然需要了解如何配置代理并利用Docker網(wǎng)絡(luò)中的各項新功能。
下面首先檢查Docker Flow: Proxy為我們創(chuàng)建的配置。我們可以進入當(dāng)前運行的容器并通過/cfg/haproxy.cfg文件查看這部分信息。不過問題是,找到由Docker Swarm運行的一套容器需要配合一點技巧。舉例來說,如果我們利用Docker Compose部署此容器,那么其名稱會存在一定規(guī)律,即使用__格式。而docker service命令會利用散列后的名稱運行容器。在我的筆記本上,docker-flow-proxy的創(chuàng)建名稱為proxy.1.e07jvhdb9e6s76mr9ol41u4sn。因此,要進入由Docker Swarm部署并運行的容器,我們需要對鏡像名稱進行過濾。
第一步,我們需要找到代理運行所在的具體節(jié)點。
docker service ps proxy
需要注意的是該node列中的值,同時確保在以下命令中使用該正確值。
eval $(docker-machine env node-1) # Change node-1 with the node value previously obtained
此命令將給出以下代理配置輸出結(jié)果。
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的朋友應(yīng)該不會感到陌生。其接收來自端口80(HTTP)以及443(HTTPS)的請求。如果路徑以/demo開頭,其會被重新定向至后端go-demo處。在這里,各請求會被發(fā)送至go-demo在端口8080上的地址。此地址同時亦是我們所部署的服務(wù)名稱。由于go-demo同proxy存在于同一網(wǎng)絡(luò)當(dāng)中,因此Docker能夠確保該請求被重新定向至目標(biāo)容器。很簡單,對吧?我們無需再另行指定IP以及外部端口。
接下來的問題是,如何實現(xiàn)負載均衡。舉例來說,我們要如何指定該代理跨越全部實例執(zhí)行循環(huán)?
負載均衡
在開始進行負載均衡解釋之前,首先創(chuàng)建幾個go-demo服務(wù)實例。
eval $(docker-machine env node-1) docker service scale go-demo=5
稍等一會兒,就將有5個go-demo服務(wù)實例開始運行。

包含規(guī)模化go-demo服務(wù)與代理實例的Docker Swarm集群