Docker 部署 3 节点 Consul 集群
使用 Docker 部署 3 节点 Consul 集群是一个非常经典且高效的方案。为了确保集群的高可用性和稳定性我们需要解决两个核心问题网络通信容器间如何发现彼此和数据持久化重启后数据不丢失。这里我为你提供两种最主流的方案Docker Compose 方案推荐适合在单机上模拟集群或者通过配置在多台机器上编排管理最方便。Docker CLI 命令方案适合手动在多台物理机/虚拟机上分别启动。方案一使用 Docker Compose 部署推荐这是最整洁的方式。我们将创建一个docker-compose.yml文件定义 3 个 Server 节点。1. 准备工作创建一个目录consul-cluster并在其中创建data目录用于持久化数据。mkdir-pconsul-cluster/data/{node1,node2,node3}cdconsul-cluster2. 编写配置文件创建docker-compose.yml。这里我们使用自定义网络consul-net并指定静态 IP这样节点间可以通过固定的 IP 互相发现避免 DNS 解析延迟。version:3.8services:consul-node1:image:consul:1.17container_name:consul-node1hostname:consul-node1networks:consul-net:ipv4_address:172.20.0.11ports:-8500:8500# 暴露 UI 端口volumes:-./data/node1:/consul/datacommand:agent -server -ui -nodeconsul-node1 -bind172.20.0.11 -client0.0.0.0 -bootstrap-expect3 -retry-join172.20.0.12 -retry-join172.20.0.13consul-node2:image:consul:1.17container_name:consul-node2hostname:consul-node2networks:consul-net:ipv4_address:172.20.0.12volumes:-./data/node2:/consul/datacommand:agent -server -nodeconsul-node2 -bind172.20.0.12 -client0.0.0.0 -bootstrap-expect3 -retry-join172.20.0.11 -retry-join172.20.0.13consul-node3:image:consul:1.17container_name:consul-node3hostname:consul-node3networks:consul-net:ipv4_address:172.20.0.13volumes:-./data/node3:/consul/datacommand:agent -server -nodeconsul-node3 -bind172.20.0.13 -client0.0.0.0 -bootstrap-expect3 -retry-join172.20.0.11 -retry-join172.20.0.12networks:consul-net:driver:bridgeipam:config:-subnet:172.20.0.0/243. 启动集群在docker-compose.yml所在目录执行docker-composeup-d方案二使用 Docker 命令手动部署多机部署如果你是在三台不同的物理机例如阿里云 ECS上部署每台机器运行一个 Consul 容器请使用此方案。假设三台机器的 IP 分别为机器 1:192.168.1.10机器 2:192.168.1.11机器 3:192.168.1.12在所有三台机器上执行以下步骤创建数据目录mkdir-p/opt/consul/data启动容器我们需要使用--nethost模式这样 Consul 才能直接绑定到宿主机的 IP 上方便外部微服务访问。在机器 1 (192.168.1.10) 上执行dockerrun-d--nameconsul\--nethost\-v/opt/consul/data:/consul/data\consul:1.17 agent-server\-ui\-nodeconsul-1\-bind192.168.1.10\-client0.0.0.0\-bootstrap-expect3\-retry-join192.168.1.11\-retry-join192.168.1.12在机器 2 (192.168.1.11) 上执行dockerrun-d--nameconsul\--nethost\-v/opt/consul/data:/consul/data\consul:1.17 agent-server\-ui\-nodeconsul-2\-bind192.168.1.11\-client0.0.0.0\-bootstrap-expect3\-retry-join192.168.1.10\-retry-join192.168.1.12在机器 3 (192.168.1.12) 上执行dockerrun-d--nameconsul\--nethost\-v/opt/consul/data:/consul/data\consul:1.17 agent-server\-ui\-nodeconsul-3\-bind192.168.1.12\-client0.0.0.0\-bootstrap-expect3\-retry-join192.168.1.10\-retry-join192.168.1.11 验证集群状态部署完成后等待约 5-10 秒然后验证集群是否组建成功。查看集群成员进入任意一个容器执行命令dockerexec-itconsul-node1 consul members如果你使用的是方案二请使用docker exec -it consul consul members成功标志输出中应包含 3 行状态均为alive。Node 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 领导者dockerexec-itconsul-node1 consul operator raft list-peers这将显示谁是当前的 Leader谁是 Follower。访问 UI 界面方案一访问http://localhost:8500方案二访问http://192.168.1.10:8500(或任意节点 IP) 关键参数解释-server: 声明这是一个 Server 节点参与 Raft 选举。-bootstrap-expect3: 告诉集群“我们期望有 3 个 Server 节点”只有当 3 个节点都连上后集群才会开始工作。这是防止脑裂的关键。-retry-join: 指定其他节点的 IP。Consul 会自动重试连接直到集群形成。-bind: 绑定当前节点的 IP 地址。-client0.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?code12mvdDWWWosourcelink推荐码12mvdDWWWo— 绑定后享受专属折扣⚡ 硅基流动开工福利狂欢硅基流动 (Silicon Flow)携手 20 款优质 AI 产品带来开工季福利活动3 大主题轮番解锁3 份精选工具礼包免费领30 天持续狂欢 立即参与https://cloud.siliconflow.cn/i/24s1PqPc