Docker部署Consul单节点或者集群教程

简介: Docker部署Consul单节点或者集群教程

Consul是一款轻量级的用于服务发现、配置和分布式一致性的开源工具。在Spring Cloud项目开发过程中,也是必不可少的用作注册中心的中间件之一。

使用Docker可以更加方便地搭建Consul单节点或者集群,今天就来介绍一下如何使用Docker的方式部署Consul。

1,拉取镜像

首先我们要拉取Consul的Docker镜像:

docker pull 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 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 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 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 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参数后面是要连结的节点的外网地址。

ServerClient节点混合集群

同样地,假设我要在三台服务器上面部署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 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 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 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/*

然后重启容器即可!注意这样也会清空集群信息,需要大家重新执行连结命令,将所有节点重新连结为集群。

参考文档:

相关文章
|
3天前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
143 91
|
4天前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
19天前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
11天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
71 44
|
Docker 容器
单节点下使用docker部署consul
部署consul 目前Consul使用的版本是: v1.0.1 本教程适用于刚刚开始学习consul并简单使用consul的同学,可以在短时间内了解conusl,配合官方文档https://www.consul.io/docs/guides/index.html深入研究。
13640 0
|
1月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
224 93
|
4天前
|
网络协议 API Docker
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
37 23
|
4天前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
90 15
|
2月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
299 78
|
1月前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
157 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结