一、什么是Swarm
Swarm這個項目名稱特別貼切。在Wiki的解釋中,Swarm behavior是指動物的群集行為。比如我們常見的蜂群,魚群,秋天往南飛的雁群都可以稱作Swarm behavior。
Swarm項目正是這樣,通過把多個Docker Engine聚集在一起,形成一個大的docker-engine,對外提供容器的集群服務。同時這個集群對外提供Swarm API,用戶可以像使用Docker Engine一樣使用Docker集群。
Swarm 特點
▲對外以Docker API接口呈現,這樣帶來的好處是,如果現有系統使用Docker Engine,則可以平滑將Docker Engine切到Swarm上,無需改動現有系統。
▲Swarm對用戶來說,之前使用Docker的經驗可以繼承過來。非常容易上手,學習成本和二次開發成本都比較低。同時Swarm本身專注於Docker集群管理,非常輕量,占用資源也非常少。 *“Batteries included but swappable”,簡單說,就是插件化機制,Swarm中的各個模塊都抽象出了API,可以根據自己一些特點進行定制實現。
▲Swarm自身對Docker命令參數支持的比較完善,Swarm目前與Docker是同步發布的。Docker的新功能,都會第一時間在Swarm中體現。
Docker自誕生以來,其容器特性以及鏡像特性給DevOps愛好者帶來了諸多方便。然而在很長的一段時間內,Docker只能在單host上運行,其跨host的部署、運行與管理能力頗受外界詬病。跨host能力的薄弱,直接導致Docker容器與host的緊耦合,這種情況下,Docker容器的靈活性很難令人滿意,容器的遷移、分組等都成為很難實現的功能點。
Swarm是Docker公司在2014年12月初新發布的容器管理工具。和Swarm一起發布的Docker管理工具還有Machine以及Compose。
Swarm是一套較為簡單的工具,用以管理Docker集群,使得Docker集群暴露給用戶時相當於一個虛擬的整體。Swarm使用標准的Docker API接口作為其前端訪問入口,換言之,各種形式的Docker Client(dockerclient in go, docker_py, docker等)均可以直接與Swarm通信,Swarm幾乎全部用Go語言來完成開發。
二、Swarm 關鍵概念
1)Swarm
集群的管理和編排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化時啟動 swarm 模式或者加入已存在的 swarm
2)Node
一個節點(node)是已加入到 swarm 的 Docker 引擎的實例 當部署應用到集群,你將會提交服務定義到管理節點,接着 Manager
管理節點調度任務到 worker 節點,manager 節點還執行維護集群的狀態的編排和群集管理功能,worker 節點接收並執行來自
manager 節點的任務。通常,manager 節點也可以是 worker 節點,worker 節點會報告當前狀態給 manager 節點
3)服務(Service)
服務是要在 worker 節點上要執行任務的定義,它在工作者節點上執行,當你創建服務的時,你需要指定容器鏡像
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 容器並在容器中執行任務。
三、環境准備
3.1 環境說明
服務器版本:
CentOS Linux release 7.5.1804 (Core)
Docker版本:
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-88.git07f3374.el7.centos.x86_64
Go version: go1.9.4
Git commit: 07f3374/1.13.1
Built: Fri Dec 7 16:13:51 2018
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-88.git07f3374.el7.centos.x86_64
Go version: go1.9.4
Git commit: 07f3374/1.13.1
Built: Fri Dec 7 16:13:51 2018
OS/Arch: linux/amd64
Experimental: false
集群節點:
swarm01 192.168.0.1
swarm02 192.168.0.2
3.2、安裝docker
3.3、修改主機名
分別修改兩台機器的主機名,更改成swarm01,swarm02
hostnamectl set-hostname swarm01
hostnamectl set-hostname swarm01
3.4 關閉SELinux
[root@swaram01 ~]# getenforce
Disabled
[root@swaram01 ~]# /usr/sbin/sestatus -v
SELinux status: disabled
若disabled不是disabled
vi /etc/selinux/config
將SELINUX=enforcing改為SELINUX=disabled
注意: 設置后需要重啟才能生效
3.5、編輯hosts文件
vi /etc/hosts
設置兩台主機的對應關系
192.168.0.1 swarm01
192.168.0.2 swarm02
3.6 關閉防火牆
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動
3.7 修改docker監聽端口
Swarm是通過監聽2375端口進行通信的,所以在使用Swarm進行集群管理之前,需要設置一下2375端口的監聽。所有主機節點docker開啟2375,2377(swarm集群)監聽,docker版本不同,配置方式不一樣
vim /lib/systemd/system/docker.service
在ExecStart加入:
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
3.8、重啟docker服務
systemctl daemon-reload ##使配置文件生效
systemctl restart docker
四、Swarm安裝和集群創建
4.1、Swarm鏡像下載
在兩台機器上分別安裝Swarm,docker pull swarm
4.2 初始化Swarm
docker swarm init --advertise-addr 192.168.0.1
Swarm initialized: current node (zeisswb5lm92gj8rsng9pxzxd) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-043bhcd0voztnsui79l1rg0pyu4xq1q5x188jeyvppplt2rvnk-6diwivwlc14aipcji90tms4ua 192.168.0.1:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
上面命令執行后,該機器自動加入到swarm集群。這個會創建一個集群token,獲取全球唯一的 token,作為集群唯一標識。后續將其他節點加入集群都會用到這個token值。
其中,--advertise-addr參數表示其它swarm中的worker節點使用此ip地址與manager聯系。命令的輸出包含了其它節點如何加入集群的命令。
4.3、添加集群節點
然后在swaram02機器上執行以下命令
docker swarm join --token SWMTKN-1-5vqq9j2bwq5rllsubg49cs16440v2ixkngvf25e5688i86c8qf-eawa9w8wf2m5mu9e6ovmhjuyy 192.168.182.110:2377
4.4、查看集群節點
docker node ls