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

Docker Compose同网络下test_api无法访问Mountebank容器如何解决?

问题原因

你收到的dial tcp 127.0.0.1:3000: connect: connection refused报错是Docker容器网络寻址逻辑导致的:

  • 你在宿主机用Postman访问localhost:3000正常,是因为docker-compose里配置了3000:3000的端口映射,把宿主机的3000端口绑定到了mountebank容器的3000端口
  • test_api容器内部的localhost指向的是test_api容器自身的网络空间,和宿主机、其他容器的网络相互隔离,自然无法访问到mountebank容器的服务
修复方案

1. 快速修改方案

同一个docker-compose默认网络下,服务名会自动作为DNS解析名被容器识别,你只需要把Go代码中请求的主机名从localhost改为docker-compose里mountebank的服务名mountebank即可:

// 原代码
// var url = "http://localhost:3000/ato/employee/?/balance"
// 修改后
var url = "http://mountebank:3000/ato/employee/?/balance"

修改后重启test_api容器即可正常通信。

2. 优化方案(推荐)

不要硬编码上游服务地址,改为通过环境变量读取,兼容本地开发和容器部署场景:

第一步:修改docker-compose中api服务的配置,新增环境变量和启动依赖

api:
  container_name:  "test_api"
  build:
    context: .
    dockerfile: api.Dockerfile
  ports:
    - "8080:8080"
  # 新增mountebank依赖,保证mountebank先启动
  depends_on:
    - db
    - mountebank
  volumes:
    - .:/app/
  # 新增环境变量配置mountebank地址
  environment:
    MOUNTEBANK_ADDR: "http://mountebank:3000"

第二步:修改Go代码读取环境变量

func getSuper(id string) (*float64, error) {
    mbAddr := os.Getenv("MOUNTEBANK_ADDR")
    if mbAddr == "" {
        // 本地开发默认值
        mbAddr = "http://localhost:3000"
    }
    url := fmt.Sprintf("%s/ato/employee/%s/balance", mbAddr, id)
    log.Println("Sending request to this url: ", url)
    // 后续逻辑保持不变
}

这个方案下本地开发时不需要修改代码,直接就能调试,容器部署时也不用硬编码服务地址。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:36:04