ReactPHP和docker:无法将主机从phpparsing到nginx容器

我使用docker和微服务。 想象一下,我们有3个服务:

user API / gateway API \ hotel API 

请求通过服务的网关。 我有容器与phpnginx ,其中卷是相同的。 接下来我给出configuration列表:

 server { server_name gateway.api.loc; root /var/www/der-ibe/ibe-gateway-api/web; client_max_body_size 32m; location / { try_files $uri @rewriteapp; } location @rewriteapp { rewrite ^(.*)$ /app.php/$1 last; } location ~ ^/(app|app_dev|config)\.php(/|$) { ... } } server { server_name hotel.api.loc; root /var/www/der-ibe/ibe-hotel-api/web; client_max_body_size 32m; location / { try_files $uri @rewriteapp; } location @rewriteapp { rewrite ^(.*)$ /app.php/$1 last; } location ~ ^/(app|app_dev|config)\.php(/|$) { ... } } 

泊坞窗,compose.yml

 version: "3.1" services: tphp: build: docker/php restart: always container_name: my_tphp extra_hosts: - gateway.api.loc:172.14.10.10 - user.api.loc:172.14.10.10 - hotel.api.loc:172.14.10.10 networks: - test volumes: - ../user-api:/var/www/user-api - ../hotel-api:/var/www/hotel-api - ./:/var/www/gateway-api tnginx: build: docker/nginx restart: always container_name: my_tnginx ports: - 80:80 networks: test: ipv4_address: 172.14.10.10 volumes: - ../user-api:/var/www/user-api - ../hotel-api:/var/www/hotel-api - ./:/var/www/gateway-api networks: ibe: driver: bridge ipam: driver: default config: - subnet: 172.14.10.0/24 

如果我使用简单的curl我可以达到酒店和用户的API,我可以得到他们的回应,但如果我试图与reactPHP做 – 我不能! 我的代码和平:

  public function asyncGetRequest(Route $route, $params, $token) { $url = $this->buildURL($route, $params); $loop = React\EventLoop\Factory::create(); $dns = '172.14.10.10'; $sender = Clue\React\Buzz\Io\Sender::createFromLoopDns($loop, $dns); //$url = 'http://172.14.10.10:3000/api/quota/list'; $client = new Clue\React\Buzz\Browser($loop, $sender); //$client = new Clue\React\Buzz\Browser($loop); $promise = $client->get($url, [ 'Authorization' => $token, ] ); /** @var Response $response */ $response = new Response(); try { $response = Clue\React\Block\await($promise, $loop); } catch (ResponseException $e) { $this->logger->error($e->getMessage()); } dump($response->getBody()->getContents()); // I work on symfony 3.2 die; } 

线索库只是包装的react 。 所以,我得到的错误是: DNS query for hotel.api.loc timed out和最后An error occurred in the underlying stream

所以我有一个问题:我做错了什么? 为什么我可以通过curl访问nginx容器,但是无法通过reactPHP访问? 即使如果点DNS!

但是,如果我使用端口的裸IP,我可以达到它。 我不支持dns,只是基本的知识。

UPDATE

我使用Linux Debian(在容器中)。 在Mac上工作。

关于逻辑:当请求URI是gateway.api.loc/api/hotel/list内部网关时,我们发送请求到hotel.api.loc到相同的URL( /api/hotel/list ),接受响应并返回它。

我再说一遍,我可以通过cURL访问域,但不能用reactPHP做到这一点,不明白为什么…

你的问题是,没有DNSparsinggateway.api.lochotel.api.loc ,它们是在你的Nginxconfiguration中定义的路由,但没有其他地方的DNSparsing。 您需要将您的撰写更改为下面,以便他们也可以在docker DNSparsing中解决

 version: "3.1" services: tphp: build: docker/php restart: always container_name: my_tphp extra_hosts: - gateway.api.ibe.lazy-ants.loc:172.14.10.10 - user.api.ibe.lazy-ants.loc:172.14.10.10 - hotel.api.ibe.lazy-ants.loc:172.14.10.10 networks: - test volumes: - ../user-api:/var/www/user-api - ../hotel-api:/var/www/hotel-api - ./:/var/www/gateway-api tnginx: build: docker/nginx restart: always container_name: my_tnginx ports: - 80:80 networks: test: ipv4_address: 172.14.10.10 aliases: - hotel.api.loc - gateway.api.loc volumes: - ../user-api:/var/www/user-api - ../hotel-api:/var/www/hotel-api - ./:/var/www/gateway-api networks: ibe: driver: bridge ipam: driver: default config: - subnet: 172.14.10.0/24 

此DNSparsing只能在撰写内部而不在外部工作。 所以如果你在外面使用它,你将不得不作出主机input

编辑-1

看来你的问题可能只是代码。 当您尝试使用网关IP作为DNS时,它不是DNS服务器。

更改

 $loop = React\EventLoop\Factory::create(); $dns = '172.14.10.10'; $sender = Clue\React\Buzz\Io\Sender::createFromLoopDns($loop, $dns); //$url = 'http://172.14.10.10:3000/api/quota/list'; $client = new Clue\React\Buzz\Browser($loop, $sender); 

 $loop = React\EventLoop\Factory::create(); $dns = '172.14.10.10'; //$sender = Clue\React\Buzz\Io\Sender::createFromLoopDns($loop, $dns); //$url = 'http://172.14.10.10:3000/api/quota/list'; $client = new Clue\React\Buzz\Browser($loop); 

看看是否有帮助

你看到的问题是ReactPHP的不完整的DNS实现。 它不尊重/etc/resolv.conf ,最近只增加了对/etc/hosts支持。 如果你没有使用react/dns v0.4.11或更高版本,那么这可能是问题,你应该尝试升级。

我不确定Docker今天如何parsingDNS链接的容器。 多年以前,它与提供主机名和相应IP的挂接/etc/hosts一起工作。 但是我认为现在Docker使用的是内部DNS服务器。 由于ReactPHP不会自动select它,所以在创buildDNSparsing器时必须明确地设置它。

尝试设置127.0.0.11作为名称服务器,这是Docker的内部DNS。