Docker Engine 本身不提供传统服务发现和负载均衡,但通过用户定义网络与嵌入式 DNS 实现轻量级服务寻址:容器名自动解析为 IP,多副本时 DNS 轮询返回多个 IP;Swarm 模式下支持 VIP 和 IPVS 四层分发。

Docker Engine 本身不提供传统意义上的“服务发现”和“负载均衡”功能,但它通过 内置的用户定义网络(User-defined Bridge Network) 和 嵌入式 DNS 服务器,在单机或 Swarm 模式下实现了轻量、自动化的服务寻址与请求分发机制。
服务发现:基于嵌入式 DNS 的容器名解析
Docker 在每个用户定义网络中自动启动一个内建 DNS 服务器(运行在宿主机的 127.0.0.11:53,仅容器可访问)。当容器加入该网络时:
- 容器名(
docker run --name myapp)自动注册为 DNS A 记录,如myapp→ 容器 IPv4 地址 - 若同一服务启动多个副本(如 Swarm 中的 replicated service),所有副本的容器名都会解析为各自的 IP,客户端可通过轮询方式实现基础负载分散
- 支持别名(
--network-alias)和自定义 DNS 名称,便于抽象服务逻辑(例如db、cache)
负载均衡:DNS 轮询 + 连接级分发
Docker Engine 不做七层代理,其“负载均衡”是隐式且有限的:
- 当多个容器使用相同服务名(如都叫
web)并接入同一网络,DNS 查询会返回所有匹配 IP 的列表,顺序随机(DNS round-robin) - 客户端发起连接时(如 curl http://web:80),由本地 resolver 解析出首个 IP 并建立 TCP 连接;后续新连接可能命中不同后端,但单个长连接不会被重定向
- 无健康检查、无会话保持、无权重控制——这属于应用层或编排层(如 Swarm 或 Kubernetes)的职责
Swarm 模式下的增强机制
在启用 Swarm 后,Docker Engine 提供了更完整的分布式服务模型:
- 服务(Service)作为抽象单元,支持多副本部署;每个服务拥有虚拟 IP(VIP)和 DNS 名称(
service_name.network_name) - 内置 IPVS 内核模块 实现四层负载均衡:所有发往 VIP 的流量,由 Swarm manager 自动分发到健康任务(task)的任意实例
- DNS 解析仍返回 VIP,而非真实容器 IP,屏蔽了后端拓扑变化;同时支持 DNS RR 返回所有任务 IP(需配置
--endpoint-mode dnsrr)
注意事项与常见误区
这些机制容易被误认为是“全功能服务网格”,实际有明确边界:
- 单机 Bridge 网络不支持跨主机通信,DNS 仅限本机容器可见
- 默认 bridge 网络(docker0)不启用内建 DNS,必须使用
docker network create创建用户定义网络 - 容器重启后 IP 变更,但 DNS 记录会自动更新,无需手动刷新
- 若需 TLS 终止、路径路由、熔断等高级能力,应引入 Traefik、Nginx、Envoy 等外部反向代理










