我已经面对这个问题了!无法从我的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。
2条答案
按热度按时间41zrol4v1#
ReactPHP核心开发者您正在使套接字服务器侦听本地环回接口(
127.0.0.1
),通常是本地机器。但是,使用Docker,它只会成为您的本地Docker容器。如果监听所有接口(0.0.0.0
),则可以使用compose文件中的端口Map访问它。请注意,这不仅适用于ReactPHP,也适用于Redis等工具,当它们默认侦听127.0.0.1
时。xxslljrj2#
The EXPOSE instruction does not actually publish the port.
如文档中所写。你必须在
docker run
命令中使用-p
参数,或者指定你必须在docker compose文件中公开的端口。同时确保你的应用程序正在监听所有的接口(即0.0.0.0),而不仅仅是环回接口(即127.0.0.1)。
注:请参阅@WyriHaximus的回答,因为它确切地解释了发生了什么。