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
相关产品推荐
相关产品推荐

