Docker在上周的DockerCon技術大會上發布了1.12版核心產品Docker Engine,最大的新特性是Docker Swarm已經被整合到了Docker Engine里面而不再是一個單獨的工具了,這樣就可以更容易的把多個Docker主機組合成一整個規模更大可靠性更高的邏輯單元。Docker的掌舵者Adrian Mouat相信這種新的集群模式可以大大增強Docker在相關領域的競爭力。
把Docker Swarm整合進Docker Engine是一個重大改進,但它也只是一個附加功能,你可以只在需要的時候才使用它。你可以用和以前一樣的方式來安裝、運行和升級Docker 1.12,而且它也對已有的容器鏡像和工具向后兼容。
在一臺主機上運行Docker和在使用Docker Compose來部署應用程序方法都是和以前一樣的。你甚至可以在已有的Docker Swarm上使用1.12版Docker Engine。除非你是顯式地使用新引擎來創建一個集群,否則運行時行為仍然和以前版本一樣。
舊的Docker Swarm產品是以套件形式提供的,本身沒有什么核心功能。Docker Swarm進程在各個節點上做為容器運行,而且還需要許多其他技術來輔助它,比如用Consul或etcd來做服務發現,用Nginx做負載均衡等。集群實際上要先運行一堆基礎設施容器,然后才能運行你自己的應用程序容器。
搭建起一個舊的集群也并非易事,因為在你創建集群之前服務發現組件就要就位,可是之后你又想讓它作為集群的一個部分來運行,所以你什么事情都沒開始干就要先解決一個“先有雞還是先有蛋”的問題。Jacob Blain Christen在他的文章“Toward a Production-Ready Docker Swarm Cluster with Consul”里面很好的解釋了這個問題。
在新的集群模式下用一個'init'命令即可創建集群,用'join'命令可以把工作者加入集群。創建和加入集群的命令一般一兩秒鐘就可以執行完畢。Mouat說“與把Kubernetes或Mesos集群啟動起來相比,啟動Docker集群就是一閃的事”。
節點之間的通信安全由傳輸層安全協議(TLS)來保證。為了安裝簡便,Docker 1.12會在創建集群時生成自簽名證書,當然也可以換成你從自己的證書頒發機構獲得的證書。這些證書在節點內部通信時會被用到,但所有對外的服務仍然是和以前一樣使用你原來的證書。
Nigel Poulton在DockerCon大會上分享了舊版和1.12版啟動集群的對比圖:
Docker建議在一個L3子網內運行所有集群節點,但根據你自己的實際情況,也可以把節點劃分到不同的子網里,把運行對外服務容器的節點和內部節點隔離開來。
這種隔離方法也許你已經在獨立的生產集群上使用過了。我在貼子“在Azure上部署Docker生產集群”中已經結合微軟的云服務寫了文檔。
集群的自我認知能力是最重大的改變。集群中的每個節點都可以連接其他任何一個節點,并且可以把請求路由到它需要去的地方。你再也不必自己運行負載均衡器并把它與動態服務發現代理結合起來了,對這點以前的方式通常是Nginx加Interlock。
如果一個節點收到了一條處理不了的請求,它就會找到運行了可以處理這條請求的容器的節點,并把這條請求路由過去。這個過程對用戶是透明的,他們最終只能收到一條響應消息,完全不知道在集群內部是否發生過消息轉發。
這個Docker叫作“路由網”的功能支持外部負載均衡。你可以在集群前面放一個對外的負載均衡器,并把它配置成所有服務的唯一入口,它就會把流入的消息在集群內部隨意分發,然后收到了消息的節點就會智能的把它處理不了的消息轉發到合適的地方去。Docker核心工程組解釋路由網用到了Linux的核心功能,即一個已經在Linux內核中存在了至少15年的負載均衡功能。
路由網和調度器的組合可以保證即使有節點發生故障也不會造成服務中斷。負載均衡器不會把任何請求發送到出故障的節點上。如果因為故障導致服務所需要的最小副本數達不到要求,調度器就會自動在別的節點上運行起新的副本來。
Docker Swarm仍然是原生的Docker集群的名字,但在1.12版的集群模式下它也是Docker Egnine的一個組成部分,不再是一個單獨的產品了。你可以獲得服務發現服務,可以給集群配置多個管理者來增強可靠性,以及配置滿足你需要的足夠數量的工作者。
在這個版本里,Docker Engine脫離了其他Docker產品跑到前面了。現在還不能用Docker Machine來部署一個新式的集群,也不能用Docker Compose來部署服務。但Docker社區總是動作很快,所以期待它們也很快被整合進來吧。
查看英文原文:Docker Swarm Is Dead. Long Live Docker Swarm.