Docker运行ReactPHP http服务器脚本-不公开端口

时间:2018-08-04 15:25:01

标签: php docker docker-compose reactphp

我正在尝试使用以下技术来构建轻量级api服务器,该服务器需要处理许多请求/秒:

  • 7.1-cli-alpine(泊坞窗映像)-内存/磁盘占用空间小,不需要Web服务器
  • ReactPHP-用于事件驱动的编程的低级库(对于非阻塞I / O操作来说是完美的)

这就是我将所有内容组合在一起的方式。附言该项目的代号为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

服务/ 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-它正在工作(即ReactPHP http服务器正在响应,并且收到上面已定义的欢迎消息)。

所以,我的问题是,为什么端口映射无法按预期工作?还是这与端口映射不相关,以某种方式没有收到来自容器的响应?

如您所见,所有内容均已正确连接,ReactPHP中的Web服务器在内部运行,但在外部无法访问/正常运行?

如果我使用apache / nginx之类的端口映射,我没有任何问题。有任何想法吗? P.S。对不起,很长的帖子;试图在人们一一要求之前提供所有细节。

1 个答案:

答案 0 :(得分:1)

这是因为,如果未显式提供接口(source),则ReactPHP的TCP套接字会在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);