Docker 部署 3 节点 Consul 集群

使用 Docker 部署 3 节点 Consul 集群是一个非常经典且高效的方案。为了确保集群的高可用性和稳定性,我们需要解决两个核心问题:网络通信 (容器间如何发现彼此)和数据持久化(重启后数据不丢失)。

这里我为你提供两种最主流的方案:

  1. Docker Compose 方案 (推荐):适合在单机上模拟集群,或者通过配置在多台机器上编排,管理最方便。
  2. 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

在所有三台机器上执行以下步骤:

  1. 创建数据目录:

    bash 复制代码
    mkdir -p /opt/consul/data
  2. 启动容器:

    我们需要使用 --net=host 模式,这样 Consul 才能直接绑定到宿主机的 IP 上,方便外部微服务访问。

    • 在机器 1 (192.168.1.10) 上执行:

      bash 复制代码
      docker 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) 上执行:

      bash 复制代码
      docker 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) 上执行:

      bash 复制代码
      docker 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 秒,然后验证集群是否组建成功。

  1. 查看集群成员:

    进入任意一个容器执行命令:

    bash 复制代码
    docker exec -it consul-node1 consul members

    如果你使用的是方案二,请使用 docker exec -it consul consul members

    成功标志: 输出中应包含 3 行,状态均为 alive

    text 复制代码
    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>
  2. 查看 Raft 领导者:

    bash 复制代码
    docker exec -it consul-node1 consul operator raft list-peers

    这将显示谁是当前的 Leader,谁是 Follower。

  3. 访问 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。

⚠️ 生产环境注意事项

  1. 数据持久化 :务必将 /consul/data 挂载到宿主机目录,否则容器重启后,Raft 状态数据会丢失,导致集群无法恢复。
  2. ACL 安全 :上述示例未开启 ACL。生产环境请务必在配置文件中开启 ACL 并设置 acl.tokens.master,否则任何人都可以读写配置。
  3. 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 天 持续狂欢

👉 立即参与:https://cloud.siliconflow.cn/i/24s1PqPc

相关推荐
dustcell.2 小时前
企业级高可用电商平台实战项目设计
运维·redis·nginx·docker·web·lvs·haproxy
AI服务老曹2 小时前
异构计算时代的架构突围:基于 Docker 的 AI 视频平台如何实现 X86/ARM 与 GPU/NPU 全兼容(源码交付)
人工智能·docker·架构
returnthem4 小时前
K8S核心组件
云原生·容器·kubernetes
AI自动化工坊11 小时前
DeerFlow 2.0实战指南:生产级AI Agent框架的Docker化部署与并行编排
人工智能·docker·ai·容器·开源
行者-全栈开发12 小时前
容器化时代来临 - Docker 技术演进与核心价值
运维·docker·容器·cicd·自动化构建·容器化时代
AI自动化工坊13 小时前
GitAgent实战解析:用Docker思想解决AI Agent框架碎片化问题,降低80%迁移成本
人工智能·docker·ai·容器·开源
成为你的宁宁16 小时前
【Docker 与 Docker-Compose 实战:从零开始容器化部署若依项目,从单容器分步运行到 Compose 一键编排】
运维·docker·容器·docker-compose
xuefeiniao17 小时前
Docker 部署宝塔面板 Nginx 反向代理 502 踩坑实录
nginx·docker·容器
csdn_aspnet17 小时前
GitOps宣言:Kubernetes配置的版本化革命
云原生·容器·kubernetes·gitops