docker compose 一键部署多副本 consul 集群的核心是单 yaml 文件定义多个 server 实例、通过 -retry-join 参数实现自动发现、配合 host 网络模式与独立数据卷确保集群稳定启动,可选集成 registrator 实现服务自动注册。

用 Docker Compose 一键部署含多副本自动发现的 Consul 集群,核心在于:**一份 YAML 文件定义多个 Consul Server 实例 + 正确的启动参数实现自发现 + 可选 Client 节点自动注册**。不需要手动逐台 join,也不依赖外部脚本。
1. 准备基础环境
确保所有目标机器已安装:
- Docker(建议 24.0+)
- Docker Compose(v2.20+,推荐使用
docker compose命令而非旧版docker-compose) - 开放端口:8500(HTTP UI/API)、8300–8302(内部通信)、8600(DNS)
2. 编写 docker-compose.yml(单文件启动三节点集群)
以下配置基于 Consul 1.15+,使用 host 网络模式(便于跨容器直接通信),并启用内置自发现(通过 -retry-join 指向其他节点):
version: '3.8'
services:
consul-server-01:
image: consul:1.15.4
container_name: consul-server-01
network_mode: host
command: >
agent -server -bootstrap-expect=3
-client=0.0.0.0 -ui
-data-dir=/consul/data
-node=server-01
-bind=127.0.0.1
-retry-join=127.0.0.1:8301
-retry-join=127.0.0.1:8301
-retry-join=127.0.0.1:8301
volumes:
- ./consul-data/server-01:/consul/data
restart: unless-stopped
<p>consul-server-02:
image: consul:1.15.4
container_name: consul-server-02
network_mode: host
command: >
agent -server
-client=0.0.0.0 -ui
-data-dir=/consul/data
-node=server-02
-bind=127.0.0.1
-retry-join=127.0.0.1:8301
-retry-join=127.0.0.1:8301
-retry-join=127.0.0.1:8301
volumes:</p>
- ./consul-data/server-02:/consul/data restart: unless-stopped
consul-server-03: image: consul:1.15.4 container_name: consul-server-03 network_mode: host command: > agent -server -client=0.0.0.0 -ui -data-dir=/consul/data -node=server-03 -bind=127.0.0.1 -retry-join=127.0.0.1:8301 -retry-join=127.0.0.1:8301 -retry-join=127.0.0.1:8301 volumes:
- ./consul-data/server-03:/consul/data restart: unless-stopped
关键说明:
-
network_mode: host是单机多副本快速验证的关键,避免桥接网络带来的 IP 不一致问题;生产环境若需跨主机,请改用overlay网络 + 每个节点真实 IP 替换127.0.0.1 -
-retry-join列出全部 server 地址(即使自身也在列表中),Consul 启动时会自动去重、探测并加入集群 -
-bootstrap-expect=3仅在第一个 server(server-01)上设置,确保 Raft 初始化成功;其余节点不设该参数 - 每个节点挂载独立数据卷,防止数据冲突
3. 启动并验证集群自动发现
执行一条命令即可拉起完整集群:
docker compose up -d
几秒后检查状态:
docker exec consul-server-01 consul members
应看到三行输出,状态为 alive,角色为 server,且 leader 标记为 leader。
访问 http://localhost:8500,UI 中「Nodes」页签显示全部三个节点,「Status」页签确认健康检查通过。
4. 扩展:让业务服务自动注册(可选)
要实现“服务自动发现”,还需引入 Registrator 容器监听 Docker 事件并上报服务元数据:
registrator:
image: gliderlabs/registrator:latest
container_name: registrator
network_mode: host
volumes:
- /var/run/docker.sock:/tmp/docker.sock
command: >
-ip=127.0.0.1
consul://127.0.0.1:8500
restart: unless-stopped
之后,只要你的业务容器启动时声明了 ports 并添加标签(如 CONSUL_SERVICE_NAME=web),Registrator 就会自动将其注册进 Consul。
例如,在同一 compose 文件中加一个 nginx 服务:
nginx:
image: nginx:alpine
ports: ["8080:80"]
labels:
- "consul.service.name=web"
- "consul.service.port=80"
- "consul.service.tags=prod,http"
整个流程无需人工干预,启动即自动组网、自动选举、自动注册——真正实现一键部署与自动发现。











