Swarm是Docker社区提供的一个原生支持Docker集群管理的工具。其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口同意管理这些Docker主机上的各种Docker资源。Swarm和Kubernets比较类似,但是更加轻,具有的功能也较kubernetes少一些。
图介绍
上述图作为一个整体实际上都处于一个所谓的集群中,他可能对应了一到多台的实际服务器,。每台服务器上都装有Docker并且开启了基于HTTP的DockerAPI。这个集群中有一个SwarmManager的管理者,用来管理集群中的容器资源。管理者的管理对象不是服务层面而是集群层面的,也就是说通过Manager,我们只能笼统的向集群发出指令而不能具体到某台具体的服务器上要干什么(这也是swarm的根本所在)。至于具体的管理实现方式,Manager向外暴露了一个HTTP借口,外部用户通过这个HTTP接口来实现对集群的管理。对于大一点的集群,最好是拿出一台实际的服务器作为专门的管理者,作为学习而言,也可以把管理者和被管理者放在一台服务器上。
运行Docker的主机可以主动初始化一个Swarm集群或者加入一个已存在的Swarm集群,这样这个运行Docker的主机就成为一个Swarm集群的节点(node)。节点分为管理(manager)节点和工作(worker)节点。
管理节点用于swarm集群的管理,docker swarm命令基于只能在管理节点执行(节点退出命令docker swarm leave 可以在工作节点执执行)。一个Swarm集群可以管理多个管理节点,但只有一个管理节点可以成为leader,leader通过raft协议实现。
工作节点是任务执行节点,管理节点将服务(service)下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。如下图:
任务(Task)是Swarm中的最小调度单位,目前来说就是一个单一的容器。
服务(services)是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
IP | NODE | HOSTNAME |
---|---|---|
192.168.99.100 | mamager | A |
192.168.99.101 | worker | B |
192.168.99.102 | worker | C |
这里选择A节点做为管理节点
在A节点上执行
docker swarm join --listen-addr 192.168.99.100:8888 --advertise-addr 192.168.99.100
–listen-addr指出的是这个集群暴露给外界调用的HTTPAPI的socket地址。–advertise-addr指明集群所在的子网是哪张网卡的
docker@test1:~$ docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (abosi6zr4ib3cmtyags6n1pkx) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1odf9244iuvi7k4caqwxr9exnul0wwkd1qi149uygvsi5wzx80-51cup4sqy346t7i9odipntvsq 192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
在B和C上都执行 docker swarm join --token SWMTKN-1-1odf9244iuvi7k4caqwxr9exnul0wwkd1qi149uygvsi5wzx80-51cup4sqy346t7i9odipntvsq 192.168.99.100:2377
B
docker@test2:~$ docker swarm join --token SWMTKN-1-1odf9244iuvi7k4caqwxr9exnul0wwkd1qi149uygvsi5wzx80-51cup4sqy346t7i9odipntvsq 192.168.99.100:2377
This node joined a swarm as a worker.
C
docker@test3:~$ docker swarm join --token SWMTKN-1-1odf9244iuvi7k4caqwxr9exnul0wwkd1qi149uygvsi5wzx80-51cup4sqy346t7i9odipntvsq 192.168.99.100:2377
This node joined a swarm as a worke
在A上执行docker node ls
docker@test1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
abosi6zr4ib3cmtyags6n1pkx * test1 Ready Active Leader 18.09.1
qitipuydiid1ismrgl78ye59b test2 Ready Active 18.09.1
ooko0w7es7hm1pm1uxxddx3kk test3 Ready Active 18.09.1
上述步骤建立了一个管理节点和两个工作节点的swarm集群,下面来部署服务
下载一个镜像
docker@test1:~$ docker pull alpine
在集群中运行一个名为helloworld的服务
docker@test1:~$ docker service create --replicas 1 --name helloworld alpine ping baidu.com
yprpryfy8jbw11a8pxz075pnz
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
使用docker service ps来查看服务进展
docker@test1:~$ docker service ps yprpryfy8jbw11a8pxz075pnz
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
e470xk7muxhb helloworld.1 alpine:latest test2 Running Running 5 minutes ago
注意:docker1.12版本后构建的swarm集群,manager节点会参与worker节点的工作,为了让管理节点不参与工作节点的任务 需执行下条命令
docker@test1:~$ docker node update --availability drain test1
执行后对比命令前后的状态
docker@test1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
abosi6zr4ib3cmtyags6n1pkx * test1 Ready Active Leader 18.09.1
qitipuydiid1ismrgl78ye59b test2 Ready Active 18.09.1
ooko0w7es7hm1pm1uxxddx3kk test3 Ready Active 18.09.1
docker@test1:~$ docker node update --availability drain test1
test1
docker@test1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
abosi6zr4ib3cmtyags6n1pkx * test1 Ready Drain Leader 18.09.1
qitipuydiid1ismrgl78ye59b test2 Ready Active 18.09.1
ooko0w7es7hm1pm1uxxddx3kk test3 Ready Active 18.09.1
调整helloworld的服务实例数为两个
docker@test1:~$ docker service update --replicas 2 helloworld
helloworld
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
docker@test1:~$ docker service ps helloworld
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
zon0q38gh2aa helloworld.1 alpine:latest test2 Running Running 4 minutes ago
xpiyw9idia3z helloworld.2 alpine:latest test3 Running Running 2 minutes ago
删除集群服务
docker service rm helloworld
动态调整Swarm集群的工作节点
加入swarm集群,跟B和C的操作一样
退出Swarm集群
docker swarm leave (–force)