我如何从链接的 php Docker 容器连接到 Docker 容器中的 nginx 虚拟主机?

How could I connect to nginx vhost in Docker container from linked php Docker container?

我想使用 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,但它使虚拟主机仅可用于本地机器,而不是在 php 容器内。

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

但是我不知道如何实现这样的配置,也找不到任何例子(我昨天谷歌了半天)。

如何让 site2.loc 可访问 site1.loc php 代码?

UPD

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

UPD

在extra_hosts中参考172.17.0.1的帮助指示主机的方式。提示,如何更好地select Productions - extra_hosts, dns, Consul 的方法?鉴于我在服务器上附近有几个项目,无论是否在容器中。

您需要外部访问您的微服务 site2.loc 吗?如果没有,你可以将 site1 和 site2 拆分到两个 nginx 容器中,然后你可以使用用户定义的网络这样做:

  1. 创建一个名为 "app-net"
  2. 的网络
  3. 当您创建每个服务时,将它们连接到网络并给它们一个别名 (--network-alias),假设您将别名 site2 放在您的微服务上
  4. Docker 中有一个内部 DNS 服务器可以解析容器的域名。因此,当您想从 PHP 代码访问 site2 时,只需使用 "site2" 即可将其解析为可由 PHP 容器访问的 IP 地址(如果它们都连接到同一用户-定义的网络)

只需确保 PHP 进程可以访问与 nginx 相同路径的 PHP 个文件。

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