Docker运行php-oci8镜像访问localhost报ERR_EMPTY_RESPONSE
问题根因
你使用的silencesys/php-oci8默认镜像为PHP-FPM变体,从你贴的运行日志中fpm is running的提示即可确认。
PHP-FPM是FastCGI进程管理器,本身不具备直接处理HTTP请求的能力,默认监听9000端口,必须搭配Nginx、Apache这类Web服务器才能对外提供HTTP访问服务。你之前直接启动容器并映射宿主机80端口到容器80端口,但容器内部根本没有进程监听80端口,因此浏览器访问时无法拿到任何响应,触发ERR_EMPTY_RESPONSE报错。
可落地解决方法
方案1:本地快速测试(适合验证Hello World等简单场景)
不需要额外部署Web服务,启动容器时覆盖默认启动命令,直接调用PHP内置开发服务器监听80端口即可:
docker run -d -p 80:80 --rm --name temp-container -v "$PWD":/var/www/html silencesys/php-oci8 php -S 0.0.0.0:80
执行完命令等2秒再访问localhost,就能正常看到Hello World!输出。
注意:PHP内置开发服务器仅适合本地临时调试,绝对不能用于生产环境
方案2:标准生产级部署(Nginx + PHP-FPM 架构)
如果需要长期稳定使用,采用Docker桥接网络把Nginx容器和PHP-FPM容器互联,是更规范的做法:
- 第一步:创建专用Docker桥接网络
docker network create php-test-net
- 第二步:启动PHP-FPM容器,不需要映射80端口,只要挂载代码目录、加入刚创建的网络即可
docker run -d --rm --name php-fpm --network php-test-net -v "$PWD":/var/www/html silencesys/php-oci8
- 第三步:在当前代码目录下新建Nginx配置文件
default.conf,写入如下配置:
server { listen 80; server_name localhost; root /var/www/html; index index.php index.html; location / { try_files $uri $uri/ =404; } location ~ \.php$ { fastcgi_pass php-fpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
- 第四步:启动Nginx容器,映射80端口,同时挂载代码目录和刚才写的配置文件,加入同一个桥接网络
docker run -d -p 80:80 --rm --name nginx --network php-test-net -v "$PWD":/var/www/html -v "$PWD/default.conf":/etc/nginx/conf.d/default.conf nginx:alpine
启动完成后访问localhost,即可正常解析PHP文件。
通用排查技巧
后续遇到端口映射后访问无响应的问题,可以先进入容器执行端口查看命令,确认容器内是否真的有服务在你映射的端口上监听:
# 进入运行中的容器 docker exec -it 容器名 /bin/bash # 查看容器内所有监听的TCP端口 ss -tulnp
你之前直接启动默认镜像时执行这个命令,就能看到只有9000端口处于监听状态,没有80端口的服务,就能快速定位问题。
内容的提问来源于stack exchange,提问作者gabbagoo
相关产品推荐
相关产品推荐

