我如何从链接的 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.loc
和 site2.loc
。我正在使用微服务架构,site2.loc
是 site1.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 容器中,然后你可以使用用户定义的网络这样做:
- 创建一个名为 "app-net"
的网络
- 当您创建每个服务时,将它们连接到网络并给它们一个别名 (--network-alias),假设您将别名 site2 放在您的微服务上
- Docker 中有一个内部 DNS 服务器可以解析容器的域名。因此,当您想从 PHP 代码访问 site2 时,只需使用 "site2" 即可将其解析为可由 PHP 容器访问的 IP 地址(如果它们都连接到同一用户-定义的网络)
只需确保 PHP 进程可以访问与 nginx 相同路径的 PHP 个文件。
编辑:在 docker compose 中,我认为网络别名是使用服务名称自动设置的
EDIT2:实际上 docker compose 正在自动设置网络 https://docs.docker.com/compose/networking/#/networking-in-compose
我想使用 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.loc
和 site2.loc
。我正在使用微服务架构,site2.loc
是 site1.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 容器中,然后你可以使用用户定义的网络这样做:
- 创建一个名为 "app-net" 的网络
- 当您创建每个服务时,将它们连接到网络并给它们一个别名 (--network-alias),假设您将别名 site2 放在您的微服务上
- Docker 中有一个内部 DNS 服务器可以解析容器的域名。因此,当您想从 PHP 代码访问 site2 时,只需使用 "site2" 即可将其解析为可由 PHP 容器访问的 IP 地址(如果它们都连接到同一用户-定义的网络)
只需确保 PHP 进程可以访问与 nginx 相同路径的 PHP 个文件。
编辑:在 docker compose 中,我认为网络别名是使用服务名称自动设置的
EDIT2:实际上 docker compose 正在自动设置网络 https://docs.docker.com/compose/networking/#/networking-in-compose