Docker запускает скрипт http-сервера ReactPHP - не раскрывает порт

Я экспериментирую с созданием облегченного API-сервера, который должен обрабатывать много запросов в секунду, используя следующую технологию:

  • 7.1-cli-alpine (образ докера) — небольшой объем памяти/диска, нет необходимости веб сервер
  • ReactPHP — низкоуровневая библиотека для программирования, управляемого событиями (идеально подходит для неблокирующих операций ввода-вывода)

Вот как я все собрал. P.S. этот проект имеет кодовое название flying-pony

Структура папки: https://i.stack.imgur.com/a2TPB.png

docker-compose.yml:

flying_pony_php_service:
  container_name: flying_pony_php_service
  build:
    context: ./service
    dockerfile: Dockerfile
  ports:
    - "9195:8080"
  volumes:
    - ./service:/app

service/Dockerfile:

FROM php:7.1-cli-alpine
ADD . /app
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh

service/entrypoint.sh

#!/bin/sh
/app/service.php

service/service.php

#!/usr/local/bin/php
<?php

require __DIR__ . '/vendor/autoload.php';

$loop = React\EventLoop\Factory::create();

$server = new React\Http\Server(function (Psr\Http\Message\ServerRequestInterface $request) {

    $path = $request->getUri()->getPath();
    $method = $request->getMethod();

    if ($path === '/') {
        if ($method === 'GET') {
            return new React\Http\Response(200, array('Content-Type' => 'text/plain'), "Welcome to react-php version of flying pony api :)\n");
        }
    }

    return new React\Http\Response(404, ['Content-Type' => 'text/plain'],  'Not found');
});

$socket = new React\Socket\Server(8080, $loop);

$server->listen($socket);

$loop->run();

Когда проект построен и запущен, я подтвердил использование docker-compose ps и получил следующее:

➜  flying_pony_php git:(reactphp) docker-compose ps
         Name                        Command               State           Ports         
-----------------------------------------------------------------------------------------
flying_pony_php_service   /bin/sh -c /entrypoint.sh        Up      0.0.0.0:9195->8080/tcp
flying_pony_php_worker    /bin/sh -c /entrypoint.sh        Up                            
flying_pony_redis         docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp

Так как все построено и работает; Я посетил на своем хост-компьютере: http://localhost:9195, и страница не загружается (пустой ответ ошибка). Однако, если я захожу по ssh в свой контейнер flying_pony_php_service и запускаю эту команду: curl http://localhost:8080 - она ​​работает (т. е. http-сервер ReactPHP отвечает, и я получаю приветственное сообщение, которое я определил выше).

Итак, мой вопрос: почему сопоставление портов не работает должным образом? или это не связано с сопоставлением портов, почему-то не приходит ответ от контейнера?

Как видите, все подключено правильно, и веб-сервер в ReactPHP работает внутри, но не доступен/не работает извне?

У меня не было проблем с сопоставлением портов, если я использую что-то вроде apache/nginx. Любые идеи? P.S. Простите за длинный пост; пытаясь предоставить все детали до того, как люди запросят их одну за другой.


person Latheesan    schedule 04.08.2018    source источник
comment
Если я попытаюсь свернуть сервер с хост-машины, я получу следующее: curl http://localhost:9195 curl: (52) Empty reply from server   -  person Latheesan    schedule 04.08.2018


Ответы (1)


Это связано с тем, что TCP-сокет ReactPHP прослушивает 127.0.0.1 (локальный хост), если интерфейс не указан явно (источник). 127.0.0.1 недоступен из-за пределов контейнера — вместо этого вы должны слушать 0.0.0.0 (что означает «все интерфейсы»).

Вместо

$socket = new React\Socket\Server(8080, $loop);

Использовать

$socket = new React\Socket\Server('0.0.0.0:8080', $loop);
person Pete    schedule 04.08.2018