我有一个简单的docker-compose设置与nginx代理和一个容器运行PHP-PM:
version: "3.5"
services:
proxy:
image: nginx
depends_on:
- php_pm
php_pm:
build: .
php_pm
的Dockerfile从https://github.com/php-pm/php-pm-docker/blob/master/build/Dockerfile-standalone修改为使用PHP 8.1:
FROM composer as composer
ARG version=2.4.0
ARG http_version=dev-master
RUN docker-php-ext-install -j$(nproc) pcntl
RUN mkdir /ppm && cd /ppm && composer require php-pm/php-pm:${version} && composer require php-pm/httpkernel-adapter:${http_version}
FROM php:8.1
RUN apt update && apt install -y git libicu-dev libpng-dev libzip-dev procps xmlsec1 zip zlib1g-dev
RUN docker-php-ext-install -j$(nproc) gd intl mysqli opcache pcntl pdo_mysql zip
EXPOSE 81
COPY --from=composer /ppm /ppm
WORKDIR /var/www
ENTRYPOINT ["/ppm/vendor/bin/ppm",
"start",
"--static-directory=public/",
"--app-env=dev",
"--port=81",
"--socket-path=/ppm/run",
"--pidfile=/ppm/ppm.pid",
"--debug=1"]
现在,如果我执行到php_pm
容器并使用curl localhost:81
,我得到PHP-PM的响应(我认为这就是头Server: ReactPHP/1
是什么)。
现在我的问题:当我执行到容器proxy
,并尝试卷曲php_pm
容器我得到这个:
curl php_pm:81
curl: (7) Failed to connect to php_pm port 81: Connection refused
为什么PHP-PM回答端口81当我在php_pm
容器内,但不是当我在proxy
容器?通常这不是一个问题,例如nginx和另一个运行pm2的容器。PHP-PM没有完全保留由我的docker-compose.yaml
文件定义的网络内的端口81吗?
您必须在ENTRYPOINT
上设置--host=0.0.0.0
,否则容器中的进程将侦听127.0.0.1:81
(即:默认为localhost:81
),并且只能从同一容器内访问。
ENTRYPOINT ["/ppm/vendor/bin/ppm",
"start",
"--static-directory=public/",
"--app-env=dev",
"--host=0.0.0.0",
"--port=81",
"--socket-path=/ppm/run",
"--pidfile=/ppm/ppm.pid",
"--debug=1"]
当你从pph_pm
容器内curl
它工作,因为你从localhost
到达服务器,但curl
从另一个容器将不起作用,因为你试图从不同的主机到达服务器。使用0.0.0.0:81
将允许您从另一个容器访问服务器。