我希望使用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
,但是它让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?鉴于我在服务器上有几个项目在附近,在容器中或没有。
答案 0 :(得分:1)
您是否需要外部访问您的微服务site2.loc?如果不是,您可以将site1和site2拆分为两个nginx容器,那么您可以使用用户定义的网络执行此操作:
确保PHP进程可以使用与nginx相同的路径访问PHP文件。
编辑:在docker compose中我认为网络别名是自动设置的,服务名称为 EDIT2:事实上,docker compose正在自动建立一个网络https://docs.docker.com/compose/networking/#/networking-in-compose