Docker环境下两个Laravel微服务容器通信报cURL error 7错误求助
错误根因
你遇到的连接拒绝问题由两个配置问题共同导致:
- 容器内的
localhost指向容器自身的网络命名空间,和宿主机的localhost不属于同一网络空间,你在8000端口容器内请求127.0.0.1:8100实际是访问当前容器自身的8100端口,自然无法连通。 - 两个微服务使用独立的docker-compose配置启动,各自创建了名为
sail的独立桥接网络,两个Laravel容器默认不在同一网络下,无法直接通过内网通信。
修复方案
方案1:宿主机转发(适合临时调试)
你的两个容器都已配置host.docker.internal指向宿主机网关,直接修改第一个服务中调用第二个服务的API地址,将http://127.0.0.1:8100/接口路径改为http://host.docker.internal:8100/接口路径即可,请求会通过宿主机的端口映射转发到对应的容器。
方案2:共用Docker网络(适合长期开发/生产环境,性能更优)
- 宿主机执行命令创建公共桥接网络:
docker network create shared-sail-network
- 修改第一个服务的docker-compose.yml配置:
- 新增外部网络声明:
networks: sail: driver: bridge shared-sail: external: true
- 给laravel.test服务绑定新增的公共网络:
services: laravel.test: # 其余原有配置保持不变 networks: - sail - shared-sail
- 对第二个服务的docker-compose.yml做完全相同的配置修改,给它的laravel.test服务也绑定
shared-sail公共网络。 - 两个服务分别执行
docker-compose down && docker-compose up -d重启生效。 - 后续在第一个服务中调用第二个服务的接口,直接使用地址
http://MP-Communication-Service-Laravel:8000/接口路径即可,注意此处端口是容器内部的8000端口,无需使用宿主机映射的8100端口。
补充注意事项
第二个服务的MySQL端口映射配置有误,容器内MySQL默认监听3306端口,你当前配置的33061:33061会导致宿主机无法正常连接第二个服务的数据库,建议修改为33061:3306。
内容的提问来源于stack exchange,提问作者nrkdrk
相关产品推荐
相关产品推荐

