You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HAProxy配置中正确访问docker-compose创建的多副本服务

问题根因

  1. Docker Compose 副本模式下,单个服务的所有副本对应的统一DNS记录为 tasks.<服务名>(你的服务名为ws,对应记录就是tasks.ws),直接使用ws_1这类主机名无法解析是因为Docker没有生成对应格式的DNS记录。
  2. 原本的配置只写了单条server s1 ws:8080,HAProxy默认只会在启动时解析一次域名并缓存结果,因此所有请求只会路由到缓存中对应的单个副本。

解决方案:调整HAProxy配置

你只需要修改haproxy.cfg,新增DNS解析器配置,使用server-template自动绑定所有副本即可,完整配置参考如下:

# 新增Docker内置DNS解析器配置
resolvers docker_dns
    nameserver dns1 127.0.0.11:53
    hold valid 10s

frontend http
    bind *:8080
    mode http
    use_backend all

backend all
    mode http
    balance roundrobin # 配置轮询负载均衡策略,可按需调整为其他策略
    # 自动生成4个后端服务器,绑定所有ws服务副本
    server-template ws 4 tasks.ws:8080 check resolvers docker_dns

参数说明

  • resolvers docker_dns:指定使用Docker内置的DNS服务器127.0.0.11,每10秒刷新一次解析结果,后续副本扩容/缩容时HAProxy会自动识别,无需手动修改配置。
  • server-template ws 4 tasks.ws:8080:自动生成ws-1到ws-4共4个后端节点,自动关联tasks.ws解析出来的所有副本IP,check参数开启后端健康检查,异常节点会自动被剔除。

兼容性方案(不支持server-template的旧版HAProxy)

如果你使用的HAProxy版本不支持server-template,也可以手动配置4个后端节点:

backend all
    mode http
    balance roundrobin
    server s1 tasks.ws:8080 check resolvers docker_dns init-addr none
    server s2 tasks.ws:8080 check resolvers docker_dns init-addr none
    server s3 tasks.ws:8080 check resolvers docker_dns init-addr none
    server s4 tasks.ws:8080 check resolvers docker_dns init-addr none

init-addr none参数允许HAProxy启动时即使没有解析到域名也不报错,运行过程中会自动重试解析。

修改配置后重启HAProxy服务即可生效,请求会自动负载均衡到4个ws副本。

内容的提问来源于stack exchange,提问作者jbos1234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:09:03