为什么我无法从容器外的Docker/ReactPHP应用程序获得响应?

fkaflof6  于 2023-05-27  发布在  PHP
关注(0)|答案(2)|浏览(211)

我已经面对这个问题了!无法从我的Docker/ReactPHP应用程序中的浏览器或 Postman 获得响应。
这是我的代码:
docker-compose.yaml

version: '3.8'

services:
  react_php_service2:
    container_name: react_php_service2
    build:
      context: .
      dockerfile: ./.docker/php/Dockerfile
    ports:
      - "8000:8000"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    volumes:
      - ./reactphp:/app

Dockerfile

FROM php:8.0-alpine

COPY ./reactphp /app
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

COPY ./.docker/php/entrypoint.sh /entrypoint.sh

RUN ["chmod", "+x", "/entrypoint.sh"]

ENTRYPOINT /entrypoint.sh

CMD [ "php", "./app/server.php"]

entrypoint.sh

#!/bin/sh

cd app/
composer install
php server.php

server.php

require 'vendor/autoload.php';

use Psr\Http\Message\ServerRequestInterface;

$loop = React\EventLoop\Loop::get();

$server = new React\Http\HttpServer(function (ServerRequestInterface $request) {
    echo date('Y-m-d H:i:s') . ' ' . $request->getMethod() . ' ' . $request->getUri() . PHP_EOL;
    //return React\Http\Message\Response::plaintext("Hello World!\n");
    return new React\Http\Message\Response(200, ['Content-Type' => 'text/plain'], 'Hello, World!');
});

$socket = new React\Socket\SocketServer('127.0.0.1:8000', [], $loop);
$server->listen($socket);

echo 'Listening on ' . str_replace('tcp:', 'http:', $socket->getAddress()) . "\n";

$loop->run();

所以在Docker容器中,它工作得很好:Send requestGet response
但它在浏览器或Postman中不起作用-容器之外的任何地方:Browser result

41zrol4v

41zrol4v1#

ReactPHP核心开发者您正在使套接字服务器侦听本地环回接口(127.0.0.1),通常是本地机器。但是,使用Docker,它只会成为您的本地Docker容器。如果监听所有接口(0.0.0.0),则可以使用compose文件中的端口Map访问它。请注意,这不仅适用于ReactPHP,也适用于Redis等工具,当它们默认侦听127.0.0.1时。

xxslljrj

xxslljrj2#

The EXPOSE instruction does not actually publish the port.如文档中所写。
你必须在docker run命令中使用-p参数,或者指定你必须在docker compose文件中公开的端口。
同时确保你的应用程序正在监听所有的接口(即0.0.0.0),而不仅仅是环回接口(即127.0.0.1)。
注:请参阅@WyriHaximus的回答,因为它确切地解释了发生了什么。

相关问题