首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从链接的php Docker容器连接到Docker容器中的nginx vhost?

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

Stack Overflow用户
提问于 2016-10-05 09:45:22
回答 1查看 1.7K关注 0票数 0

我想使用Docker容器隔离我的新项目基础设施,我是Docker的新手。我被问题缠住了。首先,我将展示我的配置示例,然后我将解决这个问题。

Config示例

代码语言:javascript
运行
复制
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记录里也有

代码语言:javascript
运行
复制
127.0.0.1 site1.loc
127.0.0.1 site2.loc

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

问题

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

代码语言:javascript
运行
复制
'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,但这并没有帮助我。

代码语言:javascript
运行
复制
#      extra_hosts:
#          - "site1.loc:nginx"
#          - "site2.loc:nginx"

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

我也尝试过jwilder/nginx-proxy,但是它使vhost只对本地机器可用,而不是在php容器中。

我很清楚,问题的根源在于php容器中的环境对site2.loc主机一无所知。我想我需要配置某种类型的主机映射或dns

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

如何使site2.loc可由site1.locphp代码访问?

UPD

我刚刚发现我需要使用领事。没有领事还有别的办法吗?

UPD

参考extra_hosts中的172.17.0.1帮助指示宿主。提示符,如何更好地选择一个生产方法- extra_hosts,dns,领事?考虑到我在服务器上有几个项目,无论是在容器中还是在没有容器中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-06 09:17:01

您需要外部访问您的微服务站点2.loc吗?如果不能,您可以将site1和site2拆分到两个nginx容器中,那么您可以在用户定义的网络中这样做:

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

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

编辑:在docker撰写中,我认为网络别名是用服务名自动设置的。

EDIT2 :实际上,码头组合正在建立一个网络自动化的https://docs.docker.com/compose/networking/#/networking-in-compose

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39870634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档