You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:24:57