laravel项目间请求报错Failed to connect to port 80 : Connection refused

272 阅读2分钟

场景:

多个laravel项目,需要请求一个api项目。

环境:

mac、docker、nginx、php、laravel 
nginx 配置文件成功配置
/etc/hosts 文件域名映射已添加:dev_php1 127.0.0.1 、 dev_php2 127.0.0.1

docker-compose.yml文件内容:

version: '3'
services:
 nginx:
   image: nginx:1.22
   container_name: nginx
   volumes:
    - /Users/nginx/nginx.conf:/etc/nginx/nginx.conf
    - /Users/nginx/conf.d:/etc/nginx/conf.d
   restart: always
   privileged: true
   ports:
    - 80:80
   networks:
    - net_test
 dev_php1:
   image: php73
   container_name: dev_php1
   volumes:
    - /Users/www/project1:/var/www/html/project1
   restart: always
   privileged: true
   networks:
    - net_test 
 dev_php2:
   image: php73
   container_name: dev_php2
   volumes:
    - /Users/www/project2:/var/www/html/project2
   restart: always
   privileged: true
   networks:
    - net_test    
 
networks:
   net_test:
    name: net_test
    driver: bridge

运行代码:

通过http请求 在 dev_php1 项目中调用 dev_php2 项目中的接口
public function test()
{
    $response = Http::get('http://dev_php2:80/test');
}

问题:

当运行dev_php1项目时,涉及到请求api时会报错:
cURL error 7: Failed to connect to dev_php2 port 80: Connection refused

自测:

浏览器访问该api域名 http://dev_php2:80/test 成功
宿主机命令行 curl http://dev_php2:80/test 成功

原因:

容器 nginx 的ip: 172.26.0.3
容器 dev_php1 的ip: 172.26.0.2
容器 dev_php2 的ip: 172.26.0.5
在 dev_php1 容器中执行 ping dev_php2 返回 172.26.0.5 
执行curl --request GET --url http://dev_php2:80/test 相当于 
curl --request GET --url http://172.26.0.5:80/test,
而172.26.0.5是dev_php2容器的ip,dev_php2并没有开放80端口。
我们的目的是希望访问nginx的80端口,通过nginx的代理去请求dev_php2容器中的接口。

解决方法1:

在dev_php1容器中的/etc/hosts文件手动添加dev_php2的解析,解析到nginx容器对应的ip地址,
即:dev_php2 172.26.0.3 , 这样访问 http://dev_php2:80/test 
相当于 http://172.26.0.3:80/test 即nginx的80端口

解决方法2:

nginx 容器 networks 中添加 aliases 属性:
nginx:
   image: nginx:1.22
   container_name: nginx
   volumes:
    - /Users/nginx/nginx.conf:/etc/nginx/nginx.conf
    - /Users/nginx/conf.d:/etc/nginx/conf.d
   restart: always
   privileged: true
   ports:
    - 80:80
   networks:
    net_test:
     aliases:
      - dev_php2