在最新發布的 1.12.0 版本中,當在集群中啟動服務時,Docker 通過 DNS 和 IP 虛擬服務器(IPVS)為服務的負載均衡引入了新的參數。
新版 Docker 引入了內置的 DNS 服務器,當啟動一個容器時,可以通過它使用 --net-alias 參數來為容器的 IP 地址映射別名。這個特性從 1.10 后就可使用。從 1.11 版本之后,Docker 也支持了基于循環 DNS 的負載均衡。
在基于 DNS 的負載均衡中,一個服務的名稱(別名)會被映射到多個 IP 地址。在這樣的情形下,服務其實是運行在容器的 IP 地址背后。當進行 DNS 查詢時,DNS 服務器將會響應多個 IP 地址,同時,它也會打亂返回的 IP 地址的順序,這使得從不同客戶端發送的請求將會命中不同的 IP。但必須通過手動映射一個別名到多個容器的 IP 地址才能實現循環負載均衡。
在 1.12.0 版本中,Docker添加了內置的對于服務的負載均衡的支持,原理是使用了稱為 IPVS 的 Linux 特性。使用 Docker 的集群引擎,一個服務可以通過命令行和必須的數個復制品(容器)來聲明。再也不用為服務手動地指定別名。在內部,該服務的 DNS 名稱被映射到了一個虛擬 IP(VIP),在這里這個特性與 IPVS 聯系了起來。當進行 DNS 查找時,VIP 將被返回。
IPVS 是一個 Linux 內核特性,它可以使得第四層(傳輸層) TCP/UDP 流量 被轉發到后端服務器。它是基于網絡過濾模塊的,其形成了在 Linux 內核中的包過濾和網絡地址轉換實現的基礎。
當一個服務請求到達了 VIP,它會被轉發到一個托管服務的后端容器中。通過這樣的方式,流量會被均勻地分發到容器之中。這種負載均衡服務的方式和 Consul 非常相似,它是服務發現軟件。Consul 也提供一個 DNS 服務器,它可以在每次查詢完成時返回多個 IP 地址。
查看英文原文:Improved Options for Service Load Balancing in Docker 1.12.0