Docker Compose部署SpringBoot+Feign微服务报Connection refused异常
问题根因
出现feign.RetryableException: Connection refused报错的核心原因是Docker容器的网络隔离机制:
- 每个Docker容器拥有独立的网络命名空间,容器内部的
localhost仅指向当前容器自身,既不指向宿主机,也不指向同网络下的其他容器。 - 你在Feign客户端中将下游vehicles服务的请求地址硬编码为
http://localhost:8082,API网关容器收到请求后,会尝试访问自身容器内部的8082端口,但vehicles服务实际运行在独立的vehicles容器中,因此会触发连接拒绝。 - 本地开发环境无该问题,是因为所有服务直接运行在你的操作系统上,
localhost指向当前主机,所有服务端口都可在本机直接访问。 - 你使用的自定义bridge网络本身内置了DNS解析能力,同网络下的容器可以直接通过compose定义的服务名互相访问,不需要依赖宿主机的端口映射转发。
注:你在compose中自定义的网络命名为
host但实际驱动为bridge,和Docker原生的host网络模式不是同一概念,该命名容易产生误导,本次故障和这个命名无直接关联,建议后续将自定义网络改名为更清晰的名称(比如microservice-net)避免混淆。
修复步骤
- 修改所有Feign客户端的硬编码下游地址:将调用vehicles服务的地址从
http://localhost:8082改为http://vehicles:8082;如果存在调用people服务的硬编码localhost地址,同步改为http://people:8081。Docker内置DNS会自动将compose中定义的服务名解析为对应容器的内网IP,直接走容器内网通信,稳定性和性能都比走宿主机端口映射更好。 - 修正docker-compose配置中的笔误:api服务构建配置里写的
Dockefile拼写错误,正确的默认文件名为Dockerfile,避免后续镜像构建失败。 - 重新构建并启动所有服务:在docker-compose.yml所在目录执行
docker-compose up -d --build重建服务栈,启动后可进入api容器执行curl http://vehicles:8082/api/car/findAll验证连通性,能正常返回接口结果即修复完成。
内容的提问来源于stack exchange,提问作者Kevin Pontón
相关产品推荐
相关产品推荐

