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

标签 php docker docker-compose reactphp

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

  • 7.1-cli-alpine (docker image) - 内存/磁盘占用空间小,不需要网络服务器
  • ReactPHP - 用于事件驱动编程的低级库(非常适合非阻塞 I/O 操作)

这是我将所有内容组合在一起的方式。附言这个项目的代号是flying-pony

文件夹结构:/image/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.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 这样的东西,我在端口映射方面没有任何问题。有任何想法吗? 附言很抱歉发了这么长的帖子;尝试在人们一一提出要求之前提供所有细节。

最佳答案

这是因为如果没有显式提供接口(interface) (source),ReactPHP 的 TCP 套接字将监听 127.0.0.1(本地主机)。 127.0.0.1 不能从容器外部访问 - 您应该改为监听 0.0.0.0(这意味着“所有接口(interface)”)。

代替

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

使用

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

关于php - 运行 ReactPHP http 服务器脚本的 Docker - 不公开端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51687023/

相关文章:

c# - Webapi 在 docker-compose 中看不到 MongoDB

php - 涉水通过另一个 "programmer' s"PHP/MySQL 代码

php - 自动编号问题

php - 无法在 PHP 中查看数据库中的表

linux - 启动/重新启动/停止 docker 容器时出错

docker - 跨主机的Memcached容器访问

php - Elasticsearch不确定是否应该首先使用过滤器或查询

virtualization - 将纯数据 Docker 容器从一台机器移动到另一台机器的正确方法

sql-server - 如何连接到Docker容器内的SQL Server数据库?

docker-compose up, down, stop start 区别