php:8.0-fpm镜像仅提供fastcgi进程管理,不内置http服务,无法直接响应浏览器请求;必须搭配nginx或apache等web服务器,通过fastcgi_pass转发php请求,否则将出现err_empty_response或502错误。

直接用 php:8.0-fpm 镜像跑 PHP 应用是可行的,但必须配 Nginx 或 Apache 才能处理 HTTP 请求——php-fpm 本身不监听 80 端口,也不解析 URL 路由,它只响应 FastCGI 请求。
为什么不能只跑 php:8.0-fpm 就访问网页
php:8.0-fpm 是纯后端进程管理器,启动后默认监听 9000 端口(或 socket),不提供 HTTP 服务。浏览器发来的 GET /index.php 请求根本到不了它,会被直接拒绝或超时。
- 常见错误现象:
ERR_EMPTY_RESPONSE或502 Bad Gateway(Nginx 报错时) - 用
docker run -d --name php8 php:8.0-fpm启动后,curl http://localhost必然失败 - 验证方式:进容器执行
netstat -tlnp | grep :9000,能看到php-fpm在监听,但没:80
nginx.conf 里 fastcgi_pass 怎么写才对
这是最常踩的坑:本地开发时容易写成 fastcgi_pass 127.0.0.1:9000 或 localhost:9000,在 Docker 多容器场景下会连不上。
- 如果用
docker-compose.yml定义了php服务,Nginx 容器内必须写fastcgi_pass php:9000(php是 service 名) - 如果用
--link(已过时但仍有老教程用),则写fastcgi_pass myphp:9000(myphp是被 link 的容器名) - 绝对不要写
127.0.0.1——那是 Nginx 容器自己的回环地址,不是 PHP 容器的 -
SCRIPT_FILENAME要和挂载路径严格一致,比如挂载./src:/var/www/html,就得写fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name
PHP 扩展装不全导致 ThinkPHP/Laravel 启动报错
官方 php:8.0-fpm 镜像只带最精简扩展,mbstring、pdo_mysql、xml、zip 这些框架强依赖项默认没有。
- 构建镜像时必须显式安装:
RUN docker-php-ext-install mbstring pdo_mysql xml zip -
gd、exif、bcmath等按需追加,缺一个就可能触发Class not found或undefined function - 别在运行中进容器用
apt install临时装——构建阶段没固化,重启容器就丢 - 扩展安装后建议加一句
docker-php-ext-enable mbstring(部分扩展需要手动启用)
MySQL 连接 host 写 localhost 就连不上
PHP 代码里写 $host = 'localhost' 是错的。Docker 容器间通信靠的是内部 DNS,host 必须填 docker-compose.yml 中定义的服务名,比如 mysql 或 db。
- 错误写法:
new PDO('mysql:host=localhost;dbname=test', $user, $pass) - 正确写法:
new PDO('mysql:host=mysql;dbname=test', $user, $pass)(前提是mysql是 compose 里的 service 名) - 验证方法:进 PHP 容器执行
ping mysql,能通才算网络就绪 - 额外注意:MySQL 8.0 默认用
caching_sha2_password认证插件,PHP 8.0 可能不兼容,启动 MySQL 容器时加-e MYSQL_DEFAULT_AUTHENTICATION_PLUGIN=mysql_native_password
真正麻烦的从来不是“能不能跑起来”,而是 PHP 容器里 phpinfo() 显示的扩展列表、Nginx 日志里那行 connect() failed (111: Connection refused) while connecting to upstream、还有 PDO 连接时那个不提示具体原因的 SQLSTATE[HY000] [2002] 错误——这些细节不逐个对齐,光靠 docker-compose up -d 是救不了的。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











