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

Docker环境下负载均衡器健康检查显示所有服务器宕机问题排查

问题排查:Docker环境下负载均衡器健康检查全失败

问题现象

本地非Docker环境中,负载均衡器健康检查可识别3台后端服务器为活跃状态,加权轮询功能正常;但部署到Docker容器后,健康检查判定所有服务器均宕机,访问/roundRobin路由返回No active servers available,日志显示尝试访问http://localhost:8001/2/3均失败。

核心原因

Docker容器拥有独立的网络命名空间,容器内的localhost指向容器自身,而非宿主机或其他容器。你的负载均衡器在容器内尝试通过localhost访问后端服务器,自然无法连接到外部的后端服务。

解决方法

1. 修正后端服务器的访问地址

根据后端服务的部署位置,选择对应的地址:

  • 后端部署在宿主机:

    • 使用宿主机的局域网IP(比如http://192.168.1.100:8001)替代localhost;
    • (仅Windows/macOS)Docker提供了内置域名host.docker.internal,可直接替换localhost,比如http://host.docker.internal:8001;
    • (不推荐)启动负载均衡器容器时添加--network host参数,让容器共享宿主机网络栈,但会失去容器网络隔离性。
  • 后端也部署在Docker容器:

    1. 创建自定义Docker网络:
      docker network create lb-network
      
    2. 启动后端容器时加入该网络,并指定容器名称:
      docker run --name server1 --network lb-network -p 8001:8001 your-server-image
      docker run --name server2 --network lb-network -p 8002:8002 your-server-image
      docker run --name server3 --network lb-network -p 8003:8003 your-server-image
      
    3. 修改负载均衡器的后端URL为容器名称,比如http://server1:8001、http://server2:8002;
    4. 启动负载均衡器容器时加入同一网络:
      docker run --name load-balancer --network lb-network -p 8000:8000 your-lb-image
      

2. 优化健康检查函数(可选,增强健壮性)

原健康检查仅判断请求是否出错,未验证响应状态码,可补充状态码检查,同时确保响应体正确关闭:

func (lb *LoadBalancer) HealthCheckPeriodically() {
    for {
        lb.mutex.Lock()
        for _, server := range lb.servers {
            resp, err := http.Get(server.URL)
            log.Printf("server.URL: %s ", server.URL)
            isUp := false
            if err == nil {
                defer resp.Body.Close()
                // 检查响应状态码是否为2xx
                if resp.StatusCode >= 200 && resp.StatusCode < 300 {
                    log.Printf("Server %s is up", server.Name)
                    isUp = true
                } else {
                    log.Printf("Server %s returns status code: %d", server.Name, resp.StatusCode)
                }
            } else {
                log.Printf("Server %s is down: %v", server.Name, err)
            }
            lb.activeServers[server.URL] = isUp
        }
        lb.mutex.Unlock()

        time.Sleep(5 * time.Second)
    }
}

验证

启动所有容器后,查看负载均衡器日志,应显示所有服务器为up状态;访问http://<宿主机IP>:8000/roundRobin,可正常转发请求到后端服务器。


内容的提问来源于stack exchange,提问作者Jan Tuđan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:04:57