蒙国造博客

如何在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是否配置成功:

$ docker network inspectdefault

这样,我们在PHP代码中用(实际代码更多):

curl_setopt($ch, CURLOPT_URL, "http://demo.com");

因为nginx配置了demo.com域名并侦听80端口,所以能够获取并响应PHP发来的请求,

这只在容器间进行的请求和响应,所以也不用跑到互联网上走一圈,速度也更快。

 

退出移动版