簡體   English   中英

ReactPHP和Docker:無法將主機從php解析為nginx容器

[英]ReactPHP and docker: could not resolve hosts from php to nginx container

我使用docker和microservices。 想象一下,我們有3個服務:

          user API
        /
gateway API
        \
          hotel API

請求通過網關到達服務。 我有phpnginx容器,其中的卷是相同的。 接下來,我給出配置列表:

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做到這一點,也不知道為什么...

您的問題是gateway.api.lochotel.api.loc沒有DNS解析,它們在您的Nginx配置中定義用於路由,但沒有其他地方用於DNS解析。 您需要將撰寫內容更改為以下內容,以便在docker DNS解析中也能解決它們

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

此DNS解析僅在組合內部有效,而在外部無效。 因此,如果您在室外使用它,則必須進行主機輸入

編輯-1

看來您的問題可能只是代碼。 當它不是DNS服務器時,您正在嘗試使用網關IP作為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如何解析鏈接容器的DNS。 幾年前,它與提供了主機名和相應IP的掛鈎/etc/hosts一起使用。 但是我認為這些天Docker正在使用內部DNS服務器。 由於ReactPHP不會自動進行處理,因此在創建DNS解析器時必須明確設置它。

嘗試將127.0.0.11設置為名稱服務器,這是Docker的內部DNS。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM