在维护 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是否配置成功:
$ docker network inspectdefault
这样,我们在PHP代码中用(实际代码更多):
curl_setopt($ch, CURLOPT_URL, "http://demo.com");
因为nginx配置了demo.com
域名并侦听80
端口,所以能够获取并响应PHP发来的请求,
这只在容器间进行的请求和响应,所以也不用跑到互联网上走一圈,速度也更快。