Docker 运行 ReactPHP http 服务器脚本 - 不公开端口
Docker running ReactPHP http server script - not exposing the port
我正在尝试构建轻量级 api 服务器,它需要处理许多 req/sec,使用以下技术:
- 7.1-cli-alpine(docker 图片)- 占地面积小 memory/disk,不需要网络服务器
- ReactPHP - 用于事件驱动编程的低级库(非常适合非阻塞 I/O 操作)
这是我将所有内容组合在一起的方式。 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();
构建项目并 运行ning 时,我确认使用 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
因为一切都已构建并且 运行ning;我在我的主机上访问:http://localhost:9195 并且页面未加载( 空响应 错误)。但是,如果我 ssh 进入我的 flying_pony_php_service
容器和 运行 这个命令:curl http://localhost:8080
- 它正在工作(即 ReactPHP http 服务器正在响应并且我收到了我在上面定义的欢迎消息) .
所以,我的问题是,为什么端口映射没有按预期工作?还是这与端口映射无关,不知何故来自容器的响应没有通过?
如您所见,一切都已正确连接,ReactPHP 中的 Web 服务器在内部工作,但在外部 accessible/working 不正确?
如果我使用 apache/nginx 之类的东西,我对端口映射没有任何问题。有任何想法吗? P.S。抱歉这么久post;试图在人们一一提出要求之前提供所有细节。
这是因为如果没有明确提供接口 (source),ReactPHP 的 TCP 套接字会在 127.0.0.1
(localhost) 上侦听。 127.0.0.1
不能从容器外部访问 - 您应该改为收听 0.0.0.0
(这意味着 "all interfaces")。
而不是
$socket = new React\Socket\Server(8080, $loop);
使用
$socket = new React\Socket\Server('0.0.0.0:8080', $loop);
我正在尝试构建轻量级 api 服务器,它需要处理许多 req/sec,使用以下技术:
- 7.1-cli-alpine(docker 图片)- 占地面积小 memory/disk,不需要网络服务器
- ReactPHP - 用于事件驱动编程的低级库(非常适合非阻塞 I/O 操作)
这是我将所有内容组合在一起的方式。 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();
构建项目并 运行ning 时,我确认使用 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
因为一切都已构建并且 运行ning;我在我的主机上访问:http://localhost:9195 并且页面未加载( 空响应 错误)。但是,如果我 ssh 进入我的 flying_pony_php_service
容器和 运行 这个命令:curl http://localhost:8080
- 它正在工作(即 ReactPHP http 服务器正在响应并且我收到了我在上面定义的欢迎消息) .
所以,我的问题是,为什么端口映射没有按预期工作?还是这与端口映射无关,不知何故来自容器的响应没有通过?
如您所见,一切都已正确连接,ReactPHP 中的 Web 服务器在内部工作,但在外部 accessible/working 不正确?
如果我使用 apache/nginx 之类的东西,我对端口映射没有任何问题。有任何想法吗? P.S。抱歉这么久post;试图在人们一一提出要求之前提供所有细节。
这是因为如果没有明确提供接口 (source),ReactPHP 的 TCP 套接字会在 127.0.0.1
(localhost) 上侦听。 127.0.0.1
不能从容器外部访问 - 您应该改为收听 0.0.0.0
(这意味着 "all interfaces")。
而不是
$socket = new React\Socket\Server(8080, $loop);
使用
$socket = new React\Socket\Server('0.0.0.0:8080', $loop);