Docker部署Laravel安装PDO扩展后遇localhost无数据错误求助
问题分析与解决方案
核心问题
你修改后的Dockerfile使用了多阶段构建,但最终输出的是php:7.1-fpm镜像(多阶段构建默认以最后一个FROM指令的镜像作为结果)。而你的docker-compose.yml中web和php服务都从同一个Dockerfile构建,导致web服务实际启动的是PHP-FPM进程而非Nginx——这就是访问出现"localhost didn’t send any data"的根本原因:80端口没有Nginx监听处理请求。
修复方案:拆分Dockerfile
将Nginx和PHP-FPM的构建配置分开,确保每个服务使用对应的镜像:
1. 创建独立的Dockerfile
Dockerfile.nginx(Nginx配置)
FROM nginx:mainline-alpine # 容器内工作目录使用内部路径,不要用宿主机路径 WORKDIR /usr/share/nginx/html COPY ./default.conf /etc/nginx/conf.d/default.conf
Dockerfile.php(带PDO扩展的PHP-FPM)
FROM php:7.1-fpm # 安装Laravel所需的PDO扩展 RUN docker-php-ext-install pdo pdo_mysql # 容器内工作目录与Nginx保持一致 WORKDIR /usr/share/nginx/html
2. 修改docker-compose.yml
指定每个服务对应的Dockerfile,同时优化端口配置(PHP-FPM无需暴露端口给宿主机,容器间内部通信即可):
version: "3" services: web: build: context: . dockerfile: Dockerfile.nginx volumes: - D:\code\project:/usr/share/nginx/html ports: - "80:80" # 确保web服务在php服务启动后再启动 depends_on: - php php: build: context: . dockerfile: Dockerfile.php volumes: - D:\code\project:/usr/share/nginx/html # 移除宿主机9000端口映射,容器间通过服务名"php"直接访问9000端口 # ports: # - "9000:9000"
调试方法(解决问题必备)
1. 查看容器日志
实时查看Nginx日志:
docker-compose logs -f web
实时查看PHP-FPM日志:
docker-compose logs -f php
日志中会直接显示启动失败、配置错误或请求处理异常的信息。
2. 进入容器内部排查
进入Nginx容器检查配置与服务状态:
docker-compose exec web sh # 检查Nginx配置是否合法 nginx -t # 查看Nginx进程是否运行 ps aux | grep nginx
进入PHP容器检查扩展与服务状态:
docker-compose exec php sh # 检查PDO扩展是否安装成功 php -m | grep pdo # 查看PHP-FPM进程是否运行 ps aux | grep php-fpm
内容的提问来源于stack exchange,提问作者lynkyle
相关产品推荐
相关产品推荐

