雖然我們能夠在Swarm集群當(dāng)中部署任意數(shù)量的服務(wù),但這并不代表各項(xiàng)服務(wù)全部可為用戶所訪問(wèn)。而新的Swarm網(wǎng)絡(luò)使得各項(xiàng)服務(wù)之間能夠更為輕松地實(shí)現(xiàn)彼此通信。
下面我們將共同探討如何利用其對(duì)各服務(wù)進(jìn)行公開。我們還將嘗試將一套代理機(jī)制整合至Swarm網(wǎng)絡(luò)當(dāng)中,從而更為充分地發(fā)揮1.12版本帶來(lái)的優(yōu)勢(shì)。
在開始進(jìn)行之前,我們需要設(shè)置一套用于演示的集群。
環(huán)境設(shè)置
要完成本示例,我們假定大家已經(jīng)擁有一套版本為v0.8或者更高的Docker Machine,其中包含版本為v1.12或者更高的Docker Engine。最便捷的獲取方法就是通過(guò)Docker Toolbox下載。
如果您是Windows用戶,請(qǐng)利用Git Bas運(yùn)行全部示例(通過(guò)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
現(xiàn)在我們已經(jīng)擁有了一套Swarm集群,接下來(lái)是部署一項(xiàng)服務(wù)。

包含三個(gè)節(jié)點(diǎn)的Docker Swarm集群
向集群中部署服務(wù)
為了檢驗(yàn)新的Docker Swarm網(wǎng)絡(luò)功能,我們首先創(chuàng)建以下兩套網(wǎng)絡(luò)。
eval $(docker-machine env node-1) docker network create --driver overlay proxy docker network create --driver overlay go-demo
其一(proxy)將用于代理與面向API公開的服務(wù)之間的通信。而其二(go-demo)則面向全部用于構(gòu)建go-demo服務(wù)的容器。該服務(wù)包含兩套容器,且利用MongoDB用于存儲(chǔ)數(shù)據(jù),而vfarcic/go-demo則作為配備API的后端。
我們將從數(shù)據(jù)庫(kù)起步。由于其不會(huì)公共開放,因此不需要將其添加至代理當(dāng)中。這里,我們直接將其附加至go-demo網(wǎng)絡(luò)。
docker service create --name go-demo-db \ --network go-demo \ mongo
數(shù)據(jù)庫(kù)上線并開始運(yùn)行后,我們接下來(lái)部署后端。由于我們希望外部用戶能夠使用該API,因此應(yīng)當(dāng)將其納入代理。我們將其同時(shí)附加至兩套網(wǎng)絡(luò)(proxy與go-demo)。
docker service create --name go-demo \ -e DB=go-demo-db \ --network go-demo \ --network proxy \ vfarcic/go-demo

由三臺(tái)節(jié)點(diǎn)、兩套網(wǎng)絡(luò)與多套容器構(gòu)成的Docker Swarm集群
現(xiàn)在兩套容器都運(yùn)行在集群當(dāng)中,且能夠彼此通過(guò)go-demo網(wǎng)絡(luò)進(jìn)行通信。下面將代理引入其中。我們這里使用HAProxy。
需要注意的是,我們并沒有指定端口,這意味著沒有任何一套容器能夠?yàn)間o-demo網(wǎng)絡(luò)之外的請(qǐng)求所訪問(wèn)。
設(shè)置一項(xiàng)代理服務(wù)
我們可以通過(guò)多種方式建立代理機(jī)制。其一利用HAProxy創(chuàng)建一套新鏡像,其中包含各配置文件。這種方式比較適合服務(wù)數(shù)量相對(duì)固定的情況。否則,我們應(yīng)當(dāng)創(chuàng)建一套每當(dāng)有新服務(wù)(而非新版本發(fā)布)出現(xiàn)時(shí)即進(jìn)行新配置的鏡像。
通過(guò)第二種方法,其將以分卷形式存在,我們能夠在必要時(shí)僅修改配置文件而非整套新鏡像。然而,這種作法也存在弊端。在部署至一套集群時(shí),我們應(yīng)當(dāng)盡可能避免使用分卷。接下來(lái)大家會(huì)看到,代理就是不需要分卷的機(jī)制之一。另外,--volume可替換為docker service命令中的—mount參數(shù)。
第三種選項(xiàng)是使用專門與Docker Swarm協(xié)作的代理之一。在這種情況下,我們將使用vfarcic/docker-flow-proxy容器,其由Docker Flow: Proxy項(xiàng)目創(chuàng)建而成。其基于HAProxy且擁有多項(xiàng)其它功能,允許我們通過(guò)發(fā)送HTTP請(qǐng)求對(duì)其進(jìn)行重新配置。
下面一起來(lái)看:
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將負(fù)責(zé)處理互聯(lián)網(wǎng)流量(HTTP與HTTPS)。第三個(gè)端口則為8080,我們將利用它向代理發(fā)送配置請(qǐng)求。另外,我們強(qiáng)調(diào)其應(yīng)當(dāng)歸屬于proxy網(wǎng)絡(luò)。如此一來(lái),由于go-demo也被附加至同一套網(wǎng)絡(luò),意味著代理能夠通過(guò)SDN對(duì)其進(jìn)行訪問(wèn)。
在這套代理的幫助下,我們實(shí)現(xiàn)了最實(shí)用的網(wǎng)絡(luò)路由功能之一。無(wú)論大家在哪臺(tái)服務(wù)器上運(yùn)行該代理,我們都能夠向任意節(jié)點(diǎn)發(fā)送請(qǐng)求,而Docker網(wǎng)絡(luò)會(huì)確保其被重新定向至代理之一。