使用 Docker 部署 3 节点 Consul 集群是一个非常经典且高效的方案。为了确保集群的高可用性和稳定性,我们需要解决两个核心问题:网络通信 (容器间如何发现彼此)和数据持久化(重启后数据不丢失)。
这里我为你提供两种最主流的方案:
- Docker Compose 方案 (推荐):适合在单机上模拟集群,或者通过配置在多台机器上编排,管理最方便。
- Docker CLI 命令方案 :适合手动在多台物理机/虚拟机上分别启动。
方案一:使用 Docker Compose 部署(推荐)
这是最整洁的方式。我们将创建一个 docker-compose.yml 文件,定义 3 个 Server 节点。
1. 准备工作
创建一个目录 consul-cluster,并在其中创建 data 目录用于持久化数据。
bash
mkdir -p consul-cluster/data/{node1,node2,node3}
cd consul-cluster
2. 编写配置文件
创建 docker-compose.yml。这里我们使用自定义网络 consul-net 并指定静态 IP,这样节点间可以通过固定的 IP 互相发现,避免 DNS 解析延迟。
yaml
version: '3.8'
services:
consul-node1:
image: consul:1.17
container_name: consul-node1
hostname: consul-node1
networks:
consul-net:
ipv4_address: 172.20.0.11
ports:
- "8500:8500" # 暴露 UI 端口
volumes:
- ./data/node1:/consul/data
command: >
agent -server
-ui
-node=consul-node1
-bind=172.20.0.11
-client=0.0.0.0
-bootstrap-expect=3
-retry-join=172.20.0.12
-retry-join=172.20.0.13
consul-node2:
image: consul:1.17
container_name: consul-node2
hostname: consul-node2
networks:
consul-net:
ipv4_address: 172.20.0.12
volumes:
- ./data/node2:/consul/data
command: >
agent -server
-node=consul-node2
-bind=172.20.0.12
-client=0.0.0.0
-bootstrap-expect=3
-retry-join=172.20.0.11
-retry-join=172.20.0.13
consul-node3:
image: consul:1.17
container_name: consul-node3
hostname: consul-node3
networks:
consul-net:
ipv4_address: 172.20.0.13
volumes:
- ./data/node3:/consul/data
command: >
agent -server
-node=consul-node3
-bind=172.20.0.13
-client=0.0.0.0
-bootstrap-expect=3
-retry-join=172.20.0.11
-retry-join=172.20.0.12
networks:
consul-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
3. 启动集群
在 docker-compose.yml 所在目录执行:
bash
docker-compose up -d
方案二:使用 Docker 命令手动部署(多机部署)
如果你是在三台不同的物理机(例如阿里云 ECS)上部署,每台机器运行一个 Consul 容器,请使用此方案。
假设三台机器的 IP 分别为:
- 机器 1: 192.168.1.10
- 机器 2: 192.168.1.11
- 机器 3: 192.168.1.12
在所有三台机器上执行以下步骤:
-
创建数据目录:
bashmkdir -p /opt/consul/data -
启动容器:
我们需要使用
--net=host模式,这样 Consul 才能直接绑定到宿主机的 IP 上,方便外部微服务访问。-
在机器 1 (192.168.1.10) 上执行:
bashdocker run -d --name=consul \ --net=host \ -v /opt/consul/data:/consul/data \ consul:1.17 agent -server \ -ui \ -node=consul-1 \ -bind=192.168.1.10 \ -client=0.0.0.0 \ -bootstrap-expect=3 \ -retry-join=192.168.1.11 \ -retry-join=192.168.1.12 -
在机器 2 (192.168.1.11) 上执行:
bashdocker run -d --name=consul \ --net=host \ -v /opt/consul/data:/consul/data \ consul:1.17 agent -server \ -ui \ -node=consul-2 \ -bind=192.168.1.11 \ -client=0.0.0.0 \ -bootstrap-expect=3 \ -retry-join=192.168.1.10 \ -retry-join=192.168.1.12 -
在机器 3 (192.168.1.12) 上执行:
bashdocker run -d --name=consul \ --net=host \ -v /opt/consul/data:/consul/data \ consul:1.17 agent -server \ -ui \ -node=consul-3 \ -bind=192.168.1.12 \ -client=0.0.0.0 \ -bootstrap-expect=3 \ -retry-join=192.168.1.10 \ -retry-join=192.168.1.11
-
🔍 验证集群状态
部署完成后,等待约 5-10 秒,然后验证集群是否组建成功。
-
查看集群成员:
进入任意一个容器执行命令:
bashdocker exec -it consul-node1 consul members如果你使用的是方案二,请使用
docker exec -it consul consul members成功标志: 输出中应包含 3 行,状态均为
alive。textNode Address Status Type Build Protocol DC Segment consul-node1 172.20.0.11:8301 alive server 1.17.3 2 dc1 <all> consul-node2 172.20.0.12:8301 alive server 1.17.3 2 dc1 <all> consul-node3 172.20.0.13:8301 alive server 1.17.3 2 dc1 <all> -
查看 Raft 领导者:
bashdocker exec -it consul-node1 consul operator raft list-peers这将显示谁是当前的 Leader,谁是 Follower。
-
访问 UI 界面:
- 方案一: 访问
http://localhost:8500 - 方案二: 访问
http://192.168.1.10:8500(或任意节点 IP)
- 方案一: 访问
💡 关键参数解释
-server: 声明这是一个 Server 节点(参与 Raft 选举)。-bootstrap-expect=3: 告诉集群"我们期望有 3 个 Server 节点",只有当 3 个节点都连上后,集群才会开始工作。这是防止脑裂的关键。-retry-join: 指定其他节点的 IP。Consul 会自动重试连接,直到集群形成。-bind: 绑定当前节点的 IP 地址。-client=0.0.0.0: 允许外部(非本机)访问 Consul 的 HTTP API 和 UI。
⚠️ 生产环境注意事项
- 数据持久化 :务必将
/consul/data挂载到宿主机目录,否则容器重启后,Raft 状态数据会丢失,导致集群无法恢复。 - ACL 安全 :上述示例未开启 ACL。生产环境请务必在配置文件中开启 ACL 并设置
acl.tokens.master,否则任何人都可以读写配置。 - Gossip 加密 :建议生成
encrypt密钥并在所有节点配置中统一,以防止恶意节点加入集群。
💎 MiniMax Token Plan 惊喜上线!
MiniMax 作为国内领先的大模型平台,最近推出了Token Plan 订阅计划,为开发者带来超值的模型调用权益:
🎁 新人福利
- 新增语音、音乐、视频和图片生成权益
- 邀请好友享双重好礼
🤝 邀请返利机制
- 好友立享 9折 专属优惠 + Builder 权益
- 你赢返利 + 社区特权
👉 立即参与:https://platform.minimaxi.com/subscribe/token-plan?code=12mvdDWWWo&source=link
💡 推荐码 :
12mvdDWWWo--- 绑定后享受专属折扣!
⚡ 硅基流动开工福利狂欢
硅基流动 (Silicon Flow) 携手 20+ 款优质 AI 产品,带来开工季福利活动:
- 3 大主题 轮番解锁
- 3 份精选工具礼包 免费领
- 30 天 持续狂欢