docker中用consul实现服务发现与治理,需启动server节点、注册服务并支持dns/api/sdk三种发现方式,同时提供健康检查、kv配置和标签分组等基础治理能力。

在 Docker 中用 Consul 实现服务发现与治理,核心是启动 Consul 集群(Server 模式)、注册服务(Agent 模式),并让应用通过 Consul API 或 DNS 查询服务地址。整个过程不依赖外部编排工具,纯 Docker 命令 + 配置文件即可跑通基础能力。
启动 Consul Server 节点(单机或集群)
开发或测试环境常用单节点 Server;生产建议至少 3 个 Server 节点保证高可用。使用官方镜像启动:
- 单节点 Server(开发快速验证):
docker run -d --name consul-server -p 8500:8500 -p 8600:8600/udp -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -bootstrap-expect=1 -client=0.0.0.0 -ui - 关键参数说明:
-server 表示以服务端模式运行;
-bootstrap-expect=1 允许自己成为 leader;
-client=0.0.0.0 开放 HTTP 和 DNS 接口(DNS 默认走 8600/udp);
-ui 启用 Web 控制台(访问 http://localhost:8500)。
注册服务到 Consul(手动或自动)
服务注册本质是向 Consul Agent 提交一个 JSON 或 HCL 格式的健康检查配置。有两种常见方式:
-
方式一:容器启动时通过 consul agent 注册(推荐)
启动业务容器前,先在宿主机或同一网络内运行一个 client 模式的 Consul Agent(连接到 Server):docker run -d --name consul-client --network host consul agent -bind=127.0.0.1 -retry-join=host.docker.internal
然后用curl向该 Agent 的 8500 端口提交服务定义(例如注册一个 Nginx):curl -X PUT http://localhost:8500/v1/agent/service/register --data '{"ID":"nginx-01","Name":"nginx","Address":"172.17.0.3","Port":80,"Check":{"HTTP":"http://172.17.0.3:80/health","Interval":"10s"}} -
方式二:用 consul-template 或 registrator 自动注册
安装registrator可监听 Docker 事件,自动为带 label 的容器注册服务:docker run -d --name registrator --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest consul://host.docker.internal:8500
启动业务容器时加 label:docker run -d --label "consul.service=web" --label "consul.port=80" nginx
服务发现:应用如何获取其他服务地址
服务发现有三种主流用法,按推荐度排序:
-
DNS 查询(最轻量,适合无侵入改造)
Consul 内置 DNS 服务器,默认监听 8600/udp。只要容器能解析service-name.service.consul即可:dig +short nginx.service.consul @host.docker.internal -p 8600
返回类似172.17.0.3,应用直接用该 IP 调用。 -
HTTP API 查询(更灵活,支持过滤、健康检查等)
curl "http://host.docker.internal:8500/v1/health/service/nginx?passing"
返回 JSON 列表,含所有健康实例的 IP、端口、标签等信息。 -
集成客户端 SDK(如 consul-api、spring-cloud-consul)
Java/Go/Python 等语言有成熟 SDK,支持服务注册、健康监听、KV 存储等功能,适合复杂治理场景(如熔断、配置中心)。
基础治理能力:健康检查 + KV 配置中心
Consul 不只是服务发现,还能做轻量级治理:
- 健康检查:注册服务时指定 HTTP、TCP、脚本或 TTL 类型检查,Consul 自动标记服务状态(Passing/Critical),DNS 和 API 查询默认只返回 Passing 实例。
-
KV 存储:用 HTTP API 存取配置:
curl -X PUT --data "dev" http://localhost:8500/v1/kv/config/app/env
应用启动时拉取/config/app/env,实现配置动态更新(配合 consul-template 可热重载)。 -
服务分组与标签:通过
Tags字段区分环境(prod,canary)或协议(grpc,http),查询时可按 tag 过滤:curl "http://localhost:8500/v1/health/service/web?tag=prod"










