Bootstrap

手把手教你docker swarm集群部署


一、什么是docker swarm?

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。 Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,他会收集重建集群信息。

二、docker swarm基本结构图

在这里插入图片描述
在结构图可以看出 Docker Client使用Swarm对 集群(Cluster)进行调度使用。

上图可以看出,Swarm是典型的master-slave结构,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持。

三、准备工作

1.准备三台cetnos8已安装docker的虚拟机,并且配置好ip地址。

安装docker步骤centos8及ubuntu安装docker教程
我的四台虚拟机如图(其中一台是Ubuntu,可以只用三台centos8的虚拟机即可):
在这里插入图片描述

2.更改主机名

#manager虚拟机
[root@manager ~]# hostname set-hostname manager
#worker-1虚拟机
[root@worker-1 network-scripts]# hostname set-hostname worker-1
#worker-2虚拟机
[root@worker-2 network-scripts]# hostname set-hostname worker-2
#worker-3虚拟机--这是ubuntu虚拟机
root@worker3:/home/yejing# hostnamectl set-hostname worker-3

3.配置hosts文件

[root@worker-1 ~]# vim /etc/hosts
#加上这几个主机映射关系
192.168.31.31 manager
192.168.31.15 worker-1
192.168.31.16 worker-2
192.168.31.17 worker-3

四台机器都要进行如上操作!

4.关闭防火墙和selinux

[root@worker-2 ~]# systemctl stop firewalld
[root@worker-2 ~]# systemctl disable firewalld
#临时关闭selinux
[root@worker-2 ~]# setenforce 0
#永久关闭
[root@worker-2 ~]# vim /etc/selinux/config
#如下图

在这里插入图片描述
四台机器都要进行如上操作!

四、docker swarm集群部署

1.创建swarm集群

#在manager虚拟机上创建,填自己manager虚拟机的ip地址
[root@manager ~]# docker swarm init --advertise-addr 192.168.31.31
Swarm initialized: current node (z6sfk0wglnqagtbbe07u8f701) is now a manager.

To add a worker to this swarm, run the following command:
#这就是添加节点的方式,(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)
    docker swarm join --token SWMTKN-1-40pa2ab7p1zd8n1s6l49u420fcjtxcvqoplxb7r3mupvkenkdo-4ryk8uc16bd2550c1iuweljhi 192.168.31.31:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
#查看节点是否创建成功
[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
z6sfk0wglnqagtbbe07u8f701 *   manager    Ready     Active         Leader           20.10.8

上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。
其中,–advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。

2.添加节点主机到swarm集群

在这里插入图片描述


[root@worker-1 ~]# docker swarm join --token SWMTKN-1-40pa2ab7p1zd8n1s6l49u420fcjtxcvqoplxb7r3mupvkenkdo-4ryk8uc16bd2550c1iuweljhi 192.168.31.31:2377
This node joined a swarm as a worker.

在其他三台worker虚拟机上都进行上述操作

#在manager虚拟机上查看节点
[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
z6sfk0wglnqagtbbe07u8f701 *   manager    Ready     Active         Leader           20.10.8
g4hltfe2aqsyoysvop0c8m21z     worker-1   Ready     Active                          20.10.8
omk1t29nhlxkrjz59eb1lxnrg     worker-2   Ready     Active                          20.10.8
25c3epmxs9kmhuahlgtwjzbsx     worker-3   Ready     Active                          20.10.8

3.创建一个服务

在manager虚拟机上进行操作

#创建一个名字为helloworld的服务,10个副本,使用alpine镜像,进行ping操作
[root@manager ~]# docker service create --replicas 10 --name helloworld alpine ping docker.com
#查看服务是否创建成功
[root@manager ~]# docker service ls
ID             NAME         MODE         REPLICAS   IMAGE           PORTS
h911wkvi79wo   helloworld   replicated   10/10      alpine:latest  

4.swarm的动态缩容服务

#扩容为20个
[root@manager ~]# docker service update --replicas 20 helloworld
#缩容为5个
[root@manager ~]# docker service scale helloworld=5
#这个命令也可以用于扩容

即使有台机器宕机,其他机器也能够分配20个副本,实现了高可用。


总结

至此,docker swarm集群部署成功!

;