Docker部署Consul单节点或者集群教程
Consul是一款轻量级的用于服务发现、配置和分布式一致性的开源工具。在Spring Cloud项目开发过程中,也是必不可少的用作注册中心的中间件之一。
使用Docker可以更加方便地搭建Consul单节点或者集群,今天就来介绍一下如何使用Docker的方式部署Consul。
1,拉取镜像
首先我们要拉取Consul的Docker镜像:
docker pull hashicorp/consul
使用最新版本即可。
2,创建数据卷
在运行之前,我们最好是先创建一个数据卷用于持久化Consul的数据:
docker volume create consul-data
3,创建并运行容器
(1) 单机部署
在本地开发环境或者规模不大的分布式系统中,我们可以使用单机部署方式,命令如下:
docker run -id --name=consul \ -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8500:8500 -p 8600:8600 \ -v consul-data:/consul/data \ hashicorp/consul agent -server -ui -node=n1 -bootstrap-expect=1 -client=0.0.0.0 -advertise=服务器外网地址
可见上述除了挂载数据卷之外,我们还暴露了几个端口,它们的作用如下:
8300 TCP协议,用于Consul集群中各个节点相互连结通信的端口
8301 TCP或者UDP协议,用于Consul节点之间相互使用Gossip协议健康检查等交互
8302 TCP或者UDP协议,用于单个或多个数据中心之间的服务器节点的信息同步
8500 HTTP协议,用于API接口或者我们上述的网页管理界面访问
8600 TCP或者UDP协议,作为DNS服务器,用于通过节点名查询节点信息
所以如果是在服务器上面部署,记得配置好防火墙放行上述端口,在Spring Cloud模块集成Consul服务发现时,需要配置8500端口。
除此之外,我们来看一下命令最后的几个参数:
agent 表示启动一个Agent进程
-server 表示该节点类型为Server节点(下面会讲解集群中的节点类型)
-ui 开启网页可视化管理界面
-node 指定该节点名称,注意每个节点的名称必须唯一不能重复!上面指定了第一台服务器节点的名称为n1,那么别的节点就得用其它名称
-bootstrap-expect 最少集群的Server节点数量,少于这个值则集群失效,这个选项必须指定,由于这里是单机部署,因此设定为1即可
-advertise 这里要指定本节点外网地址,用于在集群时告诉其它节点自己的地址,如果是在自己电脑上或者是内网搭建单节点/集群则不需要带上这个参数
-client 指定可以外部连接的地址,0.0.0.0表示外网全部可以连接
除此之外,还可以加上-datacenter参数自定义一个数据中心名,同一个数据中心的节点数据中心名应当指定为一样!(2) 集群部署在学习集群部署之前,我们首先需要来了解一下在Consul集群中,节点分为下面几类:
Server节点:这是Consul集群的核心组成部分,用于维护集群的状态、处理查询请求、执行一致性协议以及提供服务发现和健康检查等功能
Client节点:用于向集群提交查询请求,并将请求转发给Server节点处理,作为服务发现和健康检查的代理,这类节点有着负载均衡、健康检查和故障转移等作用,降低Server节点的压力,搭建集群时,Client节点不是必须的
上述还提到了Agent进程这个概念,事实上Agent就可以理解为Consul运行进程,我们将其理解为一个运行中的Consul节点即可。
好的,现在我们来学习如何搭建集群,这里将提供两个示例。
① 全部为Server节点的集群
假设现在我要在三台服务器上面部署Consul容器,使它们构成一个集群,集群信息如下:
节点名 | 服务器外网地址 | 节点类型 |
agent-1 | 139.56.23.31 | Server |
agent-2 | 8.34.52.11 | Server |
agent-3 | 123.20.15.63 | Server |
通过下列命令分别在三台服务器上面创建并运行容器:
# 服务器1:139.56.23.31
docker run -id --name=consul \ -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8500:8500 -p 8600:8600 \ -v consul-data:/consul/data \ hashicorp/consul agent -server -ui -node=agent-1 -bootstrap-expect=2 -client=0.0.0.0 -advertise=139.56.23.31
# 服务器2:8.34.52.11
docker run -id --name=consul \ -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8500:8500 -p 8600:8600 \ -v consul-data:/consul/data \ hashicorp/consul agent -server -ui -node=agent-2 -bootstrap-expect=2 -client=0.0.0.0 -advertise=8.34.52.11
# 服务器3:123.20.15.63
docker run -id --name=consul \ -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8500:8500 -p 8600:8600 \ -v consul-data:/consul/data \ hashicorp/consul agent -server -ui -node=agent-3 -bootstrap-expect=2 -client=0.0.0.0 -advertise=123.20.15.63
然后分别在第二台和第三台服务器上面执行下列命令:
# 服务器2和服务器3上面都执行
docker exec -it consul consul join 139.56.23.31
这个命令的作用是使上述服务器2和服务器3的节点连结到服务器1使它们构成一整个集群,上述join参数后面是要连结的节点的外网地址。
② Server和Client节点混合集群
同样地,假设我要在三台服务器上面部署Consul容器使它们构成一个集群,集群信息如下:
节点名 | 服务器外网地址 | 节点类型 |
agent-1 | 139.56.23.31 | Client |
agent-2 | 8.34.52.11 | Server |
agent-3 | 123.20.15.63 | Server |
通过下列命令分别在三台服务器上面创建并运行容器:
# 服务器1:139.56.23.31 (Client)
docker run -id --name=consul \ -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8500:8500 -p 8600:8600 \ -v consul-data:/consul/data \ hashicorp/consul agent -ui -node=agent-1 -client=0.0.0.0 -advertise=139.56.23.31
# 服务器2:8.34.52.11 (Server)
docker run -id --name=consul \ -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8500:8500 -p 8600:8600 \ -v consul-data:/consul/data \ hashicorp/consul agent -server -ui -node=agent-2 -bootstrap-expect=2 -client=0.0.0.0 -advertise=8.34.52.11
# 服务器3:123.20.15.63 (Server)
docker run -id --name=consul \ -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8500:8500 -p 8600:8600 \ -v consul-data:/consul/data \ hashicorp/consul agent -server -ui -node=agent-3 -bootstrap-expect=2 -client=0.0.0.0 -advertise=123.20.15.63
然后分别在第二台和第三台服务器上面执行下列命令进行连结:
# 服务器2和服务器3上面都执行
docker exec -it consul consul join 139.56.23.31
可见上述服务器1的Consul是以Client模式运行的,其命令和启动Server模式差不多,只不过是少了-server和-bootstrap-expect选项而已。
4,数据清除
如果Consul运行时出现任何问题或者无法启动,可以先停止容器,然后清除所有的数据,上述我们已经把容器中数据目录映射到数据卷了,我们删除数据卷中所有内容即可:
rm -rf /var/lib/docker/volumes/consul-data/_data/*
然后重启容器即可!注意这样也会清空集群信息,需要大家重新执行连结命令,将所有节点重新连结为集群。
参考文档:
Consul的Docker镜像主页:传送门
Consul集群架构概述:传送门
Consul Agent运行指南:传送门