Swarm是Docker公司在2014年12月初發布的一套較爲簡單的工具,用來管理Docker集羣,它將一羣Docker宿主機變成一個單一的,虛擬的主機。Swarm使用標準的Docker API接口做爲其前端訪問入口,換言之,各類形式的Docker Client(docker client in Go, docker_py, docker等)都可以直接與Swarm通訊。Swarm幾乎所有用Go語言來完成開發,Swarm0.2版本增長了一個新的策略來調度集羣中的容器,使得在可用的節點上傳播它們,以及支持更多的Docker命令以及集羣驅動。Swarm deamon只是一個調度器(Scheduler)加路由器(router),Swarm本身不運行容器,它只是接受docker客戶端發送過來的請求,調度適合的節點來運行容器,這意味着,即便Swarm因爲某些緣由掛掉了,集羣中的節點也會照常運行,當Swarm從新恢復運行以後,它會收集重建集羣信息。javascript
Docker的Swarm(集羣)模式,集成不少工具和特性,好比:跨主機上快速部署服務,服務的快速擴展,集羣的管理整合到docker引擎,這意味着能夠不能夠不使用第三方管理工具。分散設計,聲明式的服務模型,可擴展,狀態協調處理,多主機網絡,分佈式的服務發現,負載均衡,滾動更新,安全(通訊的加密)等等。前端
Swarm做爲一個管理Docker集羣的工具,首先須要將其部署起來,能夠單獨將Swarm部署於一個節點。另外,天然須要一個Docker集羣,集羣上每個節點均安裝有Docker。具體的Swarm架構圖能夠參照下圖:java
Swarm架構中最主要的處理部分天然是Swarm節點,Swarm管理的對象天然是Docker Cluster,Docker Cluster由多個Docker Node組成,而負責給Swarm發送請求的是Docker Client。node
1)Swarm 集羣的管理和編排是使用嵌入到docker引擎的SwarmKit,能夠在docker初始化時啓動swarm模式或者加入已存在的swarm python
2)Node 一個節點(node)是已加入到swarm的Docker引擎的實例 當部署應用到集羣,你將會提交服務定義到管理節點,接着Manager 管理節點調度任務到worker節點,manager節點還執行維護集羣的狀態的編排和羣集管理功能,worker節點接收並執行來自 manager節點的任務。一般,manager節點也能夠是worker節點,worker節點會報告當前狀態給manager節點算法
3)服務(Service) 服務是要在worker節點上要執行任務的定義,它在工做者節點上執行,當你建立服務的時,你須要指定容器鏡像 docker
4)任務(Task) 任務是在docekr容器中執行的命令,Manager節點根據指定數量的任務副本分配任務給worker節點數據庫
docker swarm:集羣管理,子命令有init, join, leave, update。(docker swarm --help查看幫助) docker service:服務建立,子命令有create, inspect, update, remove, tasks。(docker service--help查看幫助) docker node:節點管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm。(docker node --help查看幫助) node是加入到swarm集羣中的一個docker引擎實體,能夠在一臺物理機上運行多個node,node分爲: manager nodes,也就是管理節點 worker nodes,也就是工做節點 1)manager node管理節點:執行集羣的管理功能,維護集羣的狀態,選舉一個leader節點去執行調度任務。 2)worker node工做節點:接收和執行任務。參與容器集羣負載調度,僅用於承載task。 3)service服務:一個服務是工做節點上執行任務的定義。建立一個服務,指定了容器所使用的鏡像和容器運行的命令。 service是運行在worker nodes上的task的描述,service的描述包括使用哪一個docker 鏡像,以及在使用該鏡像的容器中執行什麼命令。 4)task任務:一個任務包含了一個容器及其運行的命令。task是service的執行實體,task啓動docker容器並在容器中執行任務。
1)Node後端
2)Service(服務、任務、容器)centos
3)任務和調度
4)服務副本與全局服務
Swarm在scheduler節點(leader節點)運行容器的時候,會根據指定的策略來計算最適合運行容器的節點,目前支持的策略有:spread, binpack, random。
1)Random 顧名思義,就是隨機選擇一個Node來運行容器,通常用做調試用,spread和binpack策略會根據各個節點的可用的CPU, RAM以及正在運 行的容器的數量來計算應該運行容器的節點。
2)Spread 在同等條件下,Spread策略會選擇運行容器最少的那臺節點來運行新的容器,binpack策略會選擇運行容器最集中的那臺機器來運行新的節點。 使用Spread策略會使得容器會均衡的分佈在集羣中的各個節點上運行,一旦一個節點掛掉了只會損失少部分的容器。
3)Binpack Binpack策略最大化的避免容器碎片化,就是說binpack策略儘量的把還未使用的節點留給須要更大空間的容器運行,儘量的把容器運行在 一個節點上面。
1)批量建立服務 創建容器以前先建立一個overlay的網絡,用來保證在不一樣主機上的容器網絡互通的網絡模式 2)強大的集羣的容錯性 當容器副本中的其中某一個或某幾個節點宕機後,cluster會根據本身的服務註冊發現機制,以及以前設定的值--replicas n, 在集羣中剩餘的空閒節點上,從新拉起容器副本。整個副本遷移的過程無需人工干預,遷移後本來的集羣的load balance依舊好使! 不難看出,docker service其實不只僅是批量啓動服務這麼簡單,而是在集羣中定義了一種狀態。Cluster會持續檢測服務的健康狀態 並維護集羣的高可用性。 3)服務節點的可擴展性 Swarm Cluster不光只是提供了優秀的高可用性,同時也提供了節點彈性擴展或縮減的功能。當容器組想動態擴展時,只需經過scale 參數便可複製出新的副本出來。 仔細觀察的話,能夠發現全部擴展出來的容器副本都run在原先的節點下面,若是有需求想在每臺節點上都run一個相同的副本,方法 其實很簡單,只須要在命令中將"--replicas n"更換成"--mode=global"便可! 複製服務(--replicas n) 將一系列複製任務分發至各節點當中,具體取決於您所須要的設置狀態,例如「--replicas 3」。 全局服務(--mode=global) 適用於集羣內所有可用節點上的服務任務,例如「--mode global」。若是你們在 Swarm 集羣中設有 7 臺 Docker 節點,則所有節點之上都將存在對應容器。 4. 調度機制 所謂的調度其主要功能是cluster的server端去選擇在哪一個服務器節點上建立並啓動一個容器實例的動做。它是由一個裝箱算法和過濾器 組合而成。每次經過過濾器(constraint)啓動容器的時候,swarm cluster 都會調用調度機制篩選出匹配約束條件的服務器,並在這上面運行容器。