一、什么是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 容器并在容器中执行任务。


三、环境准备

2.1、所用版本如下

centos 7

docker  Docker version 18.03.1-ce, build 9ee9f40

swaram 18.03.1-ce

这里用两台机器来搭建,分别如下:

swarm01  192.168.182.110

swarm02  192.168.182.111

2.2、安装docker

每台机器上都需要安装Docker

yum search dockeryum install -y dockersystemctl start dockersystemctl status docker

2.3、加入开机自启

systemctl enable docker

2.4、更改docker的镜像源

安装好之后,更改docker的镜像源,修改或新增 /etc/docker/daemon.json

vi /etc/docker/daemon.json

修改成如下:

{"registry-mirrors": ["http://hub-mirror.c.163.com"]}或{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]}

然后重启

systemctl restart docker.service

2.5、修改主机名

然后分别修改两台机器的主机名,更改成swarm01,swarm02

hostnamectl set-hostname swarm01

2.6、关闭SELinux

[root@swaram01 ~]# getenforceDisabled[root@swaram01 ~]# /usr/sbin/sestatus -vSELinux status:                 disabled

修改

vi /etc/selinux/config

将SELINUX=enforcing改为SELINUX=disabled 

注意: 设置后需要重启才能生效


2.7、编辑hosts文件

vi /etc/hosts

设置两台主机的对应关系

192.168.182.110 swarm01192.168.182.111 swarm02

2.8、关闭防火墙

systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开机启动

2.9、修改docker监听端口

Swarm是通过监听2375端口进行通信的,所以在使用Swarm进行集群管理之前,需要设置一下2375端口的监听。所有主机节点docker开启2375监听,docker版本不同,配置方式不一样

vim  /lib/systemd/system/docker.service

在ExecStart加入:

-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

3.0、重启docker服务

systemctl daemon-reload    ##使配置文件生效systemctl restart docker


四、Swarm安装和集群创建

3.1、Swarm镜像下载

在两台机器上分别安装Swarm

[root@swarm01 fendo]# docker pull swarmUsing default tag: latestlatest: Pulling from library/swarmdd72058debf0: Pull completecb543654edaf: Pull complete44212202dc6d: Pull completeDigest: sha256:c97a27b020ae4439432c842769d8e731661d5987962e33004114e4aba9d03b4cStatus: Downloaded newer image for swarm:latest[root@swarm01 fendo]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEswarm               latest              59c0df55980b        6 months ago        15.8MB

3.2、初始化Swarm

[root@swarm01 fendo]# docker swarm init --advertise-addr  192.168.182.110Swarm 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.182.110:2377To 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联系。命令的输出包含了其它节点如何加入集群的命令。

3.3、添加集群节点

然后在swaram02机器上执行以下命令

[root@swaram02 fendo]# docker swarm join --token SWMTKN-1-5vqq9j2bwq5rllsubg49cs16440v2ixkngvf25e5688i86c8qf-eawa9w8wf2m5mu9e6ovmhjuyy 192.168.182.110:2377


加入到集群中去:

3.4、查看集群节点

[root@swarm01 fendo]# docker node listID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSIONj4o241rnbz6rq2k6204s635lb     swaram02            Ready               Active                                  18.03.1-cek1itretyzjwzskezlkhdc7wkj *   swarm01             Ready               Active              Leader              18.03.1-ce