如何在Docker的PHP容器用curl请求Nginx容器域名
在维护DNMP项目的时候,有同学问道这样一个问题,描述起来大致是,
有nginx和php两个docker容器,其中nginx配置了一个demo.com的域名,那如何在PHP容器中curl到nginx配置的demo.com域名的数据呢?
如果是放在云服务器上,绑定了公网IP,没问题,直接curl就可以。
如果是不用docker的话,也简单,nginx和php在同一台机器上,修改/etc/hosts文件就可以。
但是如果是在本地用docker部署的开发环境,实际的域名并不会绑定公网的IP地址,
修改PHP容器的hosts文件也不保险,每次启动容器的IP都有可能改变,所以根本curl不到。
解决的办法就是:使用networks和extra_hosts。
具体请参考如下docker-compose.yml示例代码:
version:"3" services: nginx: image:nginx:alpine ports: -"80:80" networks: default: ipv4_address:172.0.0.10 php54: image:php:5.4-fpm expose: -"9000" extra_hosts: -"demo.com:172.0.0.10" networks: default: ipv4_address:172.0.0.20 networks: default: ipam: config: -subnet:172.0.0.0/24
容器启动后,可以用这个命令查看IP是否配置成功:
$dockernetworkinspectdefault
这样,我们在PHP代码中用(实际代码更多):
curl_setopt($ch,CURLOPT_URL,"http://demo.com");
因为nginx配置了demo.com域名并侦听80端口,所以能够获取并响应PHP发来的请求,
这只在容器间进行的请求和响应,所以也不用跑到互联网上走一圈,速度也更快。