docker学习05--docker三剑客之Swarm

Swarm是Docker社区提供的一个原生支持Docker集群管理的工具。其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口同意管理这些Docker主机上的各种Docker资源。Swarm和Kubernets比较类似,但是更加轻,具有的功能也较kubernetes少一些。
docker学习05--docker三剑客之Swarm_第1张图片

图介绍
上述图作为一个整体实际上都处于一个所谓的集群中,他可能对应了一到多台的实际服务器,。每台服务器上都装有Docker并且开启了基于HTTP的DockerAPI。这个集群中有一个SwarmManager的管理者,用来管理集群中的容器资源。管理者的管理对象不是服务层面而是集群层面的,也就是说通过Manager,我们只能笼统的向集群发出指令而不能具体到某台具体的服务器上要干什么(这也是swarm的根本所在)。至于具体的管理实现方式,Manager向外暴露了一个HTTP借口,外部用户通过这个HTTP接口来实现对集群的管理。对于大一点的集群,最好是拿出一台实际的服务器作为专门的管理者,作为学习而言,也可以把管理者和被管理者放在一台服务器上。

Swarm相关概念

节点

运行Docker的主机可以主动初始化一个Swarm集群或者加入一个已存在的Swarm集群,这样这个运行Docker的主机就成为一个Swarm集群的节点(node)。节点分为管理(manager)节点和工作(worker)节点。

管理节点用于swarm集群的管理,docker swarm命令基于只能在管理节点执行(节点退出命令docker swarm leave 可以在工作节点执执行)。一个Swarm集群可以管理多个管理节点,但只有一个管理节点可以成为leader,leader通过raft协议实现。

工作节点是任务执行节点,管理节点将服务(service)下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。如下图:
docker学习05--docker三剑客之Swarm_第2张图片

服务和节点

任务(Task)是Swarm中的最小调度单位,目前来说就是一个单一的容器。
服务(services)是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

  • replicated services按照一定规则在各个工作节点上运行指定个数的任务
  • global services 每个工作节点上运行一个任务
    docker学习05--docker三剑客之Swarm_第3张图片

创建Swarm集群

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 create 命令创建一个服务
  • –name 服务名称为helloworld
  • –replicas 设置启动的实例数
  • alpine 使用的景象名称 ping baidu.com 指的是容器运行的bash

使用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)

你可能感兴趣的:(docker)