我如何从链接的php Docker容器连接到Docker容器中的nginx vhost?

时间:2016-10-05 09:45:23

标签: nginx docker dns virtualhost consul

我希望使用Docker容器和我在Docker中的新手来隔离我的新项目基础架构。我遇到了问题。首先,我将展示我的配置示例,然后我将解决问题。

配置示例

nginx:
      restart: always
      image: nginx:latest
      expose:
          - 80
      ports:
          - 8181:80
#          - 80:80
      volumes:
          - ../.:/code
          - ./docker/nginx/hosts:/etc/nginx/conf.d/
          - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
      links:
          - php
 php:
      restart: always
      build: docker/php5.6-fpm
  #    image: php:5.6-fpm
  #    ports:
  #        - 9000:9000
      volumes:
          - ../.:/code
      links:
              - redis_loc
              - postgres_loc
              - memcached_loc
              - rabbitmq_loc

这是一个例子。我已经删除了*_loc服务的详细信息。 因此,我有两个本地域用于开发,例如site1.locsite2.loc。我使用的是微服务架构,site2.locsite1.loc的微服务。

我有所有微服务代码的常见php容器 我为所有配置了*.loc.conf配置文件的微服务都有通用的nginx容器。 Nginx在Docker网络中侦听80端口。 可通过主机上的8181端口使用此主机。 在本地(主机)机器上,我有前端nginx,配置为*.loc类似物的代理8181配置。 我也有/etc/hosts条记录

127.0.0.1 site1.loc
127.0.0.1 site2.loc

因此,我可以在浏览器中打开两个本地站点并单独使用它们。

问题

问题是,site2.loc是一个微服务,因此它应该可以从site1.loc php代码访问。 现在,当我尝试从site1.loc php代码向site2.loc发送请求时,我收到错误:

'stream_socket_client(): unable to connect to site2.loc:80 (php_network_getaddresses: getaddrinfo failed: Name or service not known)'

Php无法找到通往site2.loc的方式。

我在nginx和php容器上尝试过docker-compose功能extra_hosts,但它并没有帮助我。

#      extra_hosts:
#          - "site1.loc:nginx"
#          - "site2.loc:nginx"

我试图配置自定义网络,但后来我意识到这是错误的方式。

我也试过jwilder/nginx-proxy,但是它让vhosts只用于本地机器,而不是在php容器内。

我清楚地知道问题的根源是php容器内的环境对于site2.loc主机一无所知。我想我需要某种主机映射或dns进行配置。

但我不知道如何实施这样的配置,也无法找到任何例子(我昨天半天搜索过)。

我怎样才能使site1.loc访问site1.loc php代码?

UPD

我刚才发现我需要使用Consul。没有领事还有其他办法吗?

UPD

在extra_hosts中帮助指示主机参考172.17.0.1。提示,如何为Productions选择一个方法更好 - extra_hosts,dns,Consul?鉴于我在服务器上有几个项目在附近,在容器中或没有。

1 个答案:

答案 0 :(得分:1)

您是否需要外部访问您的微服务site2.loc?如果不是,您可以将site1和site2拆分为两个nginx容器,那么您可以使用用户定义的网络执行此操作:

  1. 创建名为" app-net"
  2. 的网络
  3. 当您创建每个服务时,将它们连接到网络并为它们提供别名(--network-alias),让我们假设您将别名site2放在您的微服务上
  4. Docker中有一个内部DNS服务器,用于解析容器的域名。因此,当您想从PHP代码访问site2时,只需使用" site2"将被解析为PHP容器可访问的IP地址(如果它们都连接到同一个用户定义的网络)
  5. 确保PHP进程可以使用与nginx相同的路径访问PHP文件。

    编辑:在docker compose中我认为网络别名是自动设置的,服务名称为 EDIT2:事实上,docker compose正在自动建立一个网络https://docs.docker.com/compose/networking/#/networking-in-compose