從主機層面來看,Docker Swarm 管理的是 Docker Host 集羣。因此先來討論一個重要的概念 - 集羣化(Clustring)
服務器集羣有一組網絡上互相鏈接的服務器組成,他們一塊兒協同工做。一個集羣和一堆服務器最顯著的區別在於:
集羣可以將單個系統那樣工做,同事提供高可用、負載均衡 和 並行處理。
若是咱們部署應用和服務時選擇的是多個獨立的服務器而非集羣,資源的整理利用率則很難達到最優,由於咱們沒法提早知道如何分佈這些應用才能達到資源利用的最大化。並且,應用使用資源的趨勢是有波動的,早上某些服務器可能須要大量的內存,而下午使用量就降下來了。提早指定應用應該運行在哪一個服務器會喪失業務的彈性,當某個服務器宕機了,咱們不得不手工將受影響的應用遷移到其餘服務器上。
實現集羣化後咱們的思惟方式就必須改變了:再也不考慮一個一個的服務器,而是將集羣看作是一個總體。
部署應用時,咱們只考慮須要多少內存和CPU,而不是考慮會使用哪臺的CPU和內存。咱們不該該關心應用會被部署在哪裏,咱們關心的是運行這個應用須要哪些資源,而後將它部署到集羣,集羣管理程序(好比Docker Swarm)會幫你搞定這些細節。
集羣整理容量的調整是經過往集羣中添加和刪除主機節點實現的。但無論作怎麼樣的操做,集羣始終是一個總體。
本章,咱們會建立 Docker Swarm 集羣、部署應用、伸縮擴展應用,以及對應用執行滾動升級。
Docker Swarm Mode
Docker v.112是一個很是重要的版本,Docker從新實現了集羣的編排方式。在此以前,提供集羣功能的Docker Swarm 是一個單獨的軟件,並且依賴外部數據庫(好比 Consul、etcd 或者 Zookeeper)
從 v1.12 開始,Docker Swarm 的功能已經徹底與 Docker Engine 集成,要管理集羣,只須要啓動Swarm Mode。安裝好 Docker ,Swarm就已經在那裏了,服務發現也在那裏了,並且不須要安裝Consul等外部數據庫。
相比Kubernetes ,用Docker Swarm 建立集羣很是簡單,不須要額外安裝任何軟件,也不須要作任何額外的配置,很適合做爲學習容器編排引擎的七點。
重要概念 - swarm
swarm 是運行Docker Engine的多個主機組成的集羣
從 v1.12開始,集羣管理和編排功能已經集成到 Docker Engine 中。當Docker Engine 初始化了一個swarm 或者加入到一個存在的swarm時,他就會啓動 swarm mode。
沒啓動 swarm mode 時,Docker 執行的是容器命令。運行swarm mode 後,Docker 增長了編排service的能力。
Docker 容許在同一個Docker Host 上即運行 swarm service,又運行單獨的容器。
重要概念 - node
swarm 中的每一個 Docker Engine 都是一個node,有兩種類型的node:
manager 和 worker 。
爲了向swarm 中部署應用,咱們須要在manager mode 上執行部署命令,manager node 會將部署任務拆解並分配給一個或者多個 worker node 完成部署。
manager node 負責執行編排和集羣管理工做,保持並維護swarm 處於指望的狀態。swarm中若是有多個manager node,他們會自動協商並選舉出一個leader執行編排任務。
worker node 接受並執行由manager node 派發的任務。默認配置下manager node 同時也是一個 worker node,不過能夠將其配置成manager-only mode,讓其專職負責編排和集羣管理工做。
worker node 會按期向manager node 報告本身的狀態和他正在執行的任務狀態,這樣,manager 就能夠維護整個集羣的狀態。
重要概念 - service
service 定義了 worker node 上要執行的任務,swarm的主要編排任務就是要保證service 處於指望的狀態下。
舉一個 service 的例子: 在swarm 中啓動一個http訪問,使用的鏡像是httpd:lastes,副本數是3
manager node 負責建立這個service ,通過分析指導須要啓動3個httpd 容器,根據當前各worker node 的狀態將運行容器的任務分配下去,好比worker1 上運行兩個容器,worker2上運行一個容器。
運行了一段時間,worker2 忽然宕機了,manager 監控到這個故障,因而當即在worker3 上啓動了一個新的httpd容器。
這樣就保證了 service 處於指望的三個副本狀態。