本文講的是<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架構