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

Apache与PHP Docker容器中PDO驱动无法正常工作的问题排查

问题分析与解决方案

你的核心问题是同时运行了两套独立的PHP环境,且Apache容器与PHP-FPM容器未建立通信,导致你在独立PHP容器中安装的PDO扩展完全没被Apache使用,以下是具体错误点和修正方案:


错误点拆解

  1. Apache容器自带PHP,与独立PHP-FPM容器冲突
    你在Apache的Dockerfile中安装了php php-fpm,这意味着Apache容器自身运行了一套完整的PHP环境,完全没有用到你单独构建的PHP-FPM容器。phpinfo显示的是Apache容器内部PHP的配置,和你在独立PHP容器中安装的PDO毫无关系。

  2. Apache容器内的PHP未安装PDO扩展
    你仅复制了解除注释的php.ini,但Ubuntu默认的PHP包并未包含pdo_mysql扩展,必须手动安装对应包。

  3. Apache与PHP-FPM容器未配置通信
    若要使用分离式架构,Apache容器不能自带PHP,需通过proxy_fcgi模块将PHP请求转发到独立的PHP-FPM容器。


方案一:分离式Apache+PHP-FPM架构(推荐)

1. 修正Apache Dockerfile(不安装PHP)

FROM ubuntu:22.04
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 libapache2-mod-fcgid

# 启用连接PHP-FPM所需的模块
RUN a2enmod proxy proxy_fcgi

CMD ["apache2ctl", "-D", "FOREGROUND"]

# 替换默认虚拟主机配置(注意路径修改)
COPY apache-vhost.conf /etc/apache2/sites-available/000-default.conf

2. 修改Apache虚拟主机配置(转发PHP请求到PHP-FPM)

<VirtualHost *:80>
    DocumentRoot /var/www/html

    <Directory /var/www/html>
        AllowOverride All
        Require all granted
    </Directory>

    # 将PHP请求转发到php容器的9000端口(容器名直接作为域名)
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
</VirtualHost>

3. PHP Dockerfile保留(已正确安装PDO)

FROM php:8.2-fpm
RUN docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable pdo_mysql

4. Docker Compose配置(确保容器通信)

version: "3.9"

services:
  php:
    build:
      context: ./php
    volumes:
      - ./page:/var/www/html/

  apache2:
    build:
      context: ./Apache2
    ports:
      - "8082:80"
    volumes:
      - ./page:/var/www/html/
    # 确保PHP容器先启动
    depends_on:
      - php

方案二:单容器Apache+PHP架构(简化版)

如果不需要分离容器,直接在Apache容器内安装完整PHP环境:

修正Apache Dockerfile

FROM ubuntu:22.04
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 php php-fpm php-pdo-mysql

# 启用PHP-FPM模块
RUN a2enmod proxy_fcgi setenvif
RUN a2enconf php8.1-fpm

CMD ["apache2ctl", "-D", "FOREGROUND"]

COPY apache-vhost.conf /etc/apache2/sites-available/000-default.conf
COPY php.ini /etc/php/8.1/apache2/php.ini

Docker Compose仅保留Apache服务

version: "3.9"

services:
  apache2:
    build:
      context: ./Apache2
    ports:
      - "8082:80"
    volumes:
      - ./page:/var/www/html/

内容的提问来源于stack exchange,提问作者d99ss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:15:19