场景:
多个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