Docker+Consul实现微服务全自动服务发现:Consul集群需3节点高可用,registrator监听容器事件自动注册/注销,调用方通过DNS或API动态获取健康实例,健康检查实时剔除故障节点。

用 Docker 和 Consul 实现微服务的全自动服务发现,核心在于让服务容器一启动就自动注册到 Consul,且健康状态实时同步、调用方能零配置发现可用实例。整个过程不依赖人工干预,靠机制驱动。
Consul 集群必须先稳住
全自动的前提是 Consul 自身高可用、可被访问。单节点仅适合验证,生产环境至少部署 3 个 Server 节点(推荐奇数),并启用 Raft 共识保障一致性。
- 用官方镜像快速拉起 Server 节点: docker run -d --name consul-01 -p 8500:8500 -p 8600:8600/udp consul agent -server -bootstrap-expect=3 -client=0.0.0.0 -ui -node=consul-01 -data-dir=/consul/data -bind=0.0.0.0
- 其余节点用 -retry-join 指向首个节点 IP,自动加入集群;DNS 接口(8600/udp)务必开放,这是服务发现最轻量的方式
- 所有节点需在同一 Docker 网络(如自定义 bridge 或 overlay 网络),确保容器间 DNS 可解析、API 可互通
服务容器启动即注册:用 registrator 实现自动注入
Registrator 是轻量级监听器,运行在宿主机或 Swarm 节点上,持续监听 Docker daemon 事件,一旦检测到新容器启动,就根据容器 label 自动构造服务定义并注册到 Consul。
- 启动 registrator(连接本地 Consul): docker run -d --name registrator --volume=/var/run/docker.sock:/tmp/docker.sock --network host gliderlabs/registrator:latest consul://127.0.0.1:8500
- 业务容器启动时带上标准 label: docker run -d --label "com.github.ngoduykhanh.watchtower.enable=true" --label "consul.service=auth-api" --label "consul.port=3000" --label "consul.tags=prod,http" nginx
- registrator 会自动提取 IP、端口、标签,并注册带健康检查的服务(默认 HTTP /health,间隔 10s)
服务调用方无需硬编码:DNS 或 API 动态查
客户端不再写死 IP+端口,而是通过 Consul 提供的两种标准方式获取实时、健康的后端地址。
-
DNS 方式(推荐):直接解析 auth-api.service.consul(默认域),返回 A 记录(IP)或 SRV 记录(含端口)。Docker 容器内可配
--dns 172.17.0.2(Consul client 地址)启用 - HTTP API 方式:调用 curl http://consul:8500/v1/health/service/auth-api?passing,只返回通过健康检查的实例列表,含 IP、Port、Tags
- 配合 consul-template,还能自动渲染 Nginx/Haproxy 配置,实现反向代理的动态更新
健康检查与故障剔除是自动化的关键保障
Consul 不只是记录地址,更持续验证服务是否真能响应。只要服务暴露 /health 接口,注册时自动启用 HTTP 检查;若容器崩溃或进程僵死,10–30 秒内就被标记为不可用,查询结果自动过滤。
- 检查路径、间隔、超时均可自定义,例如:
"check": {"http": "http://:3000/readyz", "interval": "5s", "timeout": "2s"} - 服务重启后,registrator 捕获 start 事件,立即重注册;下线时捕获 die/stop 事件,自动注销
- 无须改代码、不侵入业务逻辑,纯粹靠基础设施层联动完成闭环


















