部署Docker swarm集群(一)

博文大纲
1、Docker swarm简介
2、环境准备
3、初始化Swarm群集
4、配置node0二、node03加入、离开swarm群集
5、部署图形化UI
6、docker swarm群集的service服务配置
7、实现service的扩容、收缩
8、docker Swarm群集经常使用命令
9、docker swarm总结node

1、Docker swarm简介

Docker swarm与docker-compose同样,都是docker官方推出的docker容器的编排工具。但不一样的是,Docker Compose 是一个在单个服务器或主机上建立多个容器的工具,而 Docker Swarm 则能够在多个服务器或主机上建立容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。linux

Docker swarm:其做用就是把若干个Docker主机抽象为一个总体,而且经过一个入口统一管理这些Docker主机上的各类Docker资源。Swarm和Kubernetes比较相似,可是更加轻,具备的功能也较kubernetes更少一些。nginx

从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),而且已经内置了服务发现工具,咱们就不须要像以前同样,再配置 Etcd 或者 Consul 来进行服务发现配置了。web

Docker swarm中有三种角色:算法

  • Manager node:负责执行容器的编排和集群的管理工做,保持并维护swarm处于指望的状态,swarm能够有多个manager node,他们会自动协商选举出一个leader执行编排任务;但相反,不能没有manager node;
  • Worker node:接受并执行由manager node派发的任务,而且默认manager node也是一个work node,不过能够将它设置manager-only node,让它负责编排和管理工做;
  • Service:用来定义worker上执行的命令;

注意:在一个Docker Swarm群集中,每台docker服务器的角色能够都是manager,可是,不能够都是worker,也就是说,不能够群龙无首,而且,参与群集的全部主机名,千万不能够冲突。docker

2、环境准备

部署Docker swarm集群(一)

注意事项:浏览器

  • 保证时间同步;
  • 关闭防火墙与SElinux(实验环境);
  • 更改主机名;
  • 编写host文件,保证能够i进行域名解析;

3、初始化Swarm群集

[root@node01 ~]# tail -3 /etc/hosts       
192.168.1.1 node01
192.168.1.2 node02
192.168.1.3 node03
//三台主机都需配置hosts文件实现域名解析的效果
[root@node01 ~]# docker swarm init --advertise-addr 192.168.1.1
//--advertise-addr:指定与其余node通讯的地址

命令的返回信息,如图:
部署Docker swarm集群(一)
图中①的命令:以worker身份加入swarm群集中;
②的命令:以manager身份加入swarm群集中;
出现上图表示初始化成功!注意:--token表示期限为24小时;服务器

4、配置node0二、node03加入、离开swarm群集

###################node02的操做以下###################
[root@node02 ~]# docker swarm join --token SWMTKN-1-4pc1gjwjrp9h4dny52j58m0lclq88ngovis0w3rinjd05lklu5-ay18vjhwu7w8gsqvct84fv8ic 192.168.1.1:2377
###################node03的操做以下###################
[root@node03 ~]# docker swarm join --token SWMTKN-1-4pc1gjwjrp9h4dny52j58m0lclq88ngovis0w3rinjd05lklu5-ay18vjhwu7w8gsqvct84fv8ic 192.168.1.1:2377
//node0二、node03默认是以worker身份加入的
###################node01的操做以下###################
[root@node01 ~]# docker node ls           
//查看节点详细信息(只能是manager身份才可查看)
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
mc3xn4az2r6set3al79nqss7x *   node01              Ready               Active              Leader              18.09.0
olxd9qi9vs5dzes9iicl170ob     node02              Ready               Active                                  18.09.0
i1uee68sxt2puzd5dx3qnm9ck     node03              Ready               Active                                  18.09.0
//能够看出node0一、node0二、node03的状态为Active
###################node02的操做以下###################
[root@node02 ~]# docker swarm leave
###################node03的操做以下###################
[root@node03 ~]# docker swarm leave
//node0二、node03申请离开群集
###################node01的操做以下###################
[root@node01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
mc3xn4az2r6set3al79nqss7x *   node01              Ready               Active              Leader              18.09.0
olxd9qi9vs5dzes9iicl170ob     node02              Down                Active                                  18.09.0
i1uee68sxt2puzd5dx3qnm9ck     node03              Down                Active                                  18.09.0
///能够看到node0二、node03的状态为Down
[root@node01 ~]# docker node rm node02
[root@node01 ~]# docker node rm node03
//node01将node0二、node03移除群集

以上命令能够将某一个节点加入、删除群集,不过加入时是使用worker身份的,若是想要让节点是以manager身份加入群集,须要使用如下命令:tcp

[root@node01 ~]# docker swarm join-token manager 
//查询以manager身份加入群集的命令
[root@node01 ~]# docker swarm join-token worker
//查询以worker身份加入群集的命令

如图:
部署Docker swarm集群(一)ide

###################node02的操做以下###################
[root@node02 ~]# docker swarm join --token SWMTKN-1-2c0gcpxihwklx466296l5jp6od31pshm04q990n3ssncby3h0c-78rnxee2e990axj0q7td74zod 192.168.1.1:2377
###################node03的操做以下###################
[root@node03 ~]# docker swarm join --token SWMTKN-1-2c0gcpxihwklx466296l5jp6od31pshm04q990n3ssncby3h0c-78rnxee2e990axj0q7td74zod 192.168.1.1:2377
//node0二、node03加入群集是以manager身份加入
###################node01的操做以下###################
[root@node01 ~]# docker node ls         //查看节点的详细信息
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
exr8uoww0eih43iujqz5cbv6q *   node01              Ready               Active              Leader              18.09.0
r35f48huyw5hvnkuzatrftj1r     node02              Ready               Active              Reachable           18.09.0
gsg1irl1bywgdsmfawi9rna7p     node03              Ready               Active              Reachable           18.09.0
//从MANAGER STATUS这列就可看出

虽然加入群集时,能够指定使用manager、worker身份,可是也能够经过如下命令,进行降级、升级,操做以下:

[root@node01 ~]# docker node demote node02
[root@node01 ~]# docker node demote node03
//将node0二、node03降级为worker
[root@node01 ~]# docker node promote node02
[root@node01 ~]# docker node promote node03
//将node0二、node03升级为manager
//自行验证

5、部署图形化UI

部署图形化UI界面由node01来完成!

[root@node01 ~]# docker run -d -p 8080:8080 -e HOST=172.16.0.10 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
//-e HOST指定的是容器

使用浏览器访问:
部署Docker swarm集群(一)
浏览器能够正常访问,则表示图形化UI界面部署完成!

6、docker swarm群集的service服务配置

node01发布一个任务,(必须在manager角色的主机上)运行六个容器,命令以下:

[root@node01 ~]# docker service create --replicas 6  --name web -p 80:80 nginx
// --replicas:副本数量;大概能够理解为一个副本就是一个容器

容器运行完成后,能够登陆web页面进行查看,如图:
部署Docker swarm集群(一)

注意:若是另外两台节点服务器上没有相应的惊醒,则默认会从docker Hub上自动进行下载!

[root@node01 ~]# docker service ls            //查看建立的service
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
nbfzxltrcbsk        web                 replicated          6/6                 nginx:latest        *:80->80/tcp
[root@node01 ~]# docker service ps web     //查看建立的service都运行在那些容器上
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
v7pmu1waa2ua        web.1               nginx:latest        node01              Running             Running 6 minutes ago                       
l112ggmp7lxn        web.2               nginx:latest        node02              Running             Running 5 minutes ago                       
prw6hyizltmx        web.3               nginx:latest        node03              Running             Running 5 minutes ago                       
vg38mso99cm1        web.4               nginx:latest        node01              Running             Running 6 minutes ago                       
v1mb0mvtz55m        web.5               nginx:latest        node02              Running             Running 5 minutes ago                       
80zq8f8252bj        web.6               nginx:latest        node03              Running             Running 5 minutes ago

若是如今node0二、node03发生宕机时,service并不会由于节点的立即而死掉,而是自动跑到正常的节点上。

模拟node02宕机,web页面以下:
部署Docker swarm集群(一)

恢复node02,web页面以下:
部署Docker swarm集群(一)

即便node02恢复正常,也不会将service分配给node02。

所以,能够得出一个结论:若是node发生故障,service会自动跑到可用的节点上;反之,若是node没有发生故障,默认状况下,service不会轻易更改节点!

7、实现service的扩容、收缩

扩容:就i是添加几台service;
收缩:就是减小几台service;

针对上述环境实现收缩、扩容;

(1)service扩容

[root@node01 ~]# docker service scale web=8
//本来有6个service,如今增长到8台

web页面以下:
部署Docker swarm集群(一)
关于service分配到那台node节点上,是根据docker swarm自身的算法进行分配的。

(2)service收缩

[root@node01 ~]# docker service scale web=4
//本来有8个service,如今减小到4台

web页面以下:
部署Docker swarm集群(一)

(3)设置某个node不运行service

上述环境中,三台都是manager,即便是一台manager、两台worker默认状况manager也是进行工做的,将node0二、node03降级为worker,执行以下命令:

[root@node01 ~]# docker node demote node02
[root@node01 ~]# docker node demote node03

如图:
部署Docker swarm集群(一)

能够经过设置,使某台节点不运行service,以下:

[root@node01 ~]# docker node update --availability drain node01
//设置noder01之后不运行容器,但已经运行的容器并不会中止
// --availability:选项后面共有三个选项可配置,以下:
active:工做;pause:暂时不工做;drain:永久性的不工做

web页面以下:
部署Docker swarm集群(一)

[root@node01 ~]# docker node update --availability drain node02
//node02也不参加工做,但已经运行的容器并不会中止

如图:
部署Docker swarm集群(一)

由此能够得出:不是只有manager才有不工做的权力!

8、docker Swarm群集经常使用命令

[root@node02 ~]# docker swarm leave 
//那个节点想推出swarm群集,就在那台节点上执行这条命令
//节点自动退出swarm群集(至关于辞职)
[root@node01 ~]# docker node rm 节点名称
//由manager主动删除节点(至关于开除)
[root@node01 ~]# docker node promote 节点名称
//将节点升级
[root@node01 ~]# docker node demote 节点名称
//将节点降级
[root@node01 ~]# docker node ls          
//查看swarm群集的信息(只能够在manager角色的主机上查看)
 [root@node01 ~]# docker node update --availability drain 节点名称
 //调整节点不参加工做
 [root@node01 ~]# docker swarm join-token worker
//查看加入swarm群集的令牌(能够是worker也能够是manager)
[root@node01 ~]# docker service scale web=4
//扩容、收缩swarn群集servie的数量(取决与群集本来的数量)
//比本来群集数量多,就是扩容,反之、收缩
[root@node01 ~]# docker service ls
//查看建立的service
[root@node01 ~]# docker service ps service的名称
//查看建立的service运行在那些容器上
[root@node01 ~]# docker service create --replicas 6  --name web -p 80:80 nginx
//指定运行的service副本数量

9、docker swarm总结

  • 参与群集的主机名必定不能冲突,而且能够互相解析对方的主机名;
  • 集群内的全部节点能够都是manager角色,可是不能够都是worker角色;
    当指定运行的镜像时,若是群集中的节点本地没有该镜像,那么它将会自动下载对应的镜像;
  • 当群集正常工做时,若一个运行着容器的docker服务器发生宕机,那么,其所运行的全部容器,都将转移到其余正常运行的节点之上,并且,就算发生宕机的服务器恢复正常运行,也不会再接管以前运行的容器;

————————————本文到此结束,感谢阅读——————————

相关文章
相关标签/搜索