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

Docker部署PHP+Apache+MySQL报could not find driver错误求解

问题:Docker 部署 Apache+PHP 环境访问提示 could not find driver 错误

被该问题困扰已4小时,尝试了Stack Overflow上所有可找到的相关方案均未生效。
访问容器内的Apache服务时,页面返回错误:could not find driver(找不到驱动)
index.php报错页面
怀疑该问题与PDO有关,参考的教程使用的是sqlite数据库,虽已在Dockerfile中添加PDO扩展安装配置,但问题仍未解决。

当前配置

docker-compose.yml 配置

services:
    php-apache-environment:
        container_name: php-apache
        build:
            context: .
            dockerfile: Dockerfile
        depends_on:
            - db
        volumes:
            - ./src:/var/www/html/
        ports:
            - 8000:80
    db:
        container_name: db
        image: mysql
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: bitchan
            MYSQL_USER: bit_academy
            MYSQL_PASSWORD: bit_academy
        ports:
            - "9906:3306"
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        ports:
            - '8080:80'
        restart: always
        environment:
            PMA_HOST: db
        depends_on:
            - db

Dockerfile 配置

FROM php:8.0-apache
RUN apt-get update && apt-get upgrade -y
RUN docker-php-ext-install pdo pdo_mysql  && docker-php-ext-enable pdo pdo_mysql
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli

index.php 数据库连接逻辑

$conn = (require "./db/connectdb.php")();

try {
    $stmt = $conn->prepare("SELECT * FROM boards");
    $stmt->execute();
    $boards = $stmt->fetchAll();
    $stmt = $conn->prepare("SELECT posts.*, b.board_name, b.shorthand FROM posts JOIN boards b on b.id = posts.board_id ORDER BY modified_at DESC LIMIT 5;");
    $stmt->execute();
    $posts = $stmt->fetchAll();
} catch (PDOException $e) {
    echo $e->getMessage();
}

connectdb.php 代码

<?php
return function () {
    $servername = "db:3306";
    $username = "bit_academy";
    $password = "bit_academy";

    try {
        $conn = new PDO("mysql:host=$servername;dbname=bitchan", $username, $password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
    return $conn;
}
?> 

项目目录结构

项目目录结构


解决方案

核心原因:修改Dockerfile后未重新构建镜像,当前运行的容器基于未安装pdo_mysql扩展的旧镜像生成,因此报找不到驱动错误。按以下步骤操作修复:

  • 停掉当前运行的所有容器:
    docker-compose down
  • 强制无缓存重新构建php-apache镜像,避免复用旧镜像层:
    docker-compose build --no-cache php-apache-environment
  • 后台启动所有服务:
    docker-compose up -d

额外配置修正:你的PDO连接串配置不规范,host字段不需要带端口,端口需单独声明,容器内部网络直接用服务名db作为主机名即可(默认互通3306端口),将connectdb.php中的连接代码修改为:

$conn = new PDO("mysql:host=db;dbname=bitchan;port=3306", $username, $password);

如果操作后仍报错,进入php-apache容器执行php -m,查看已加载扩展列表中是否存在pdo_mysql项,确认扩展正常加载即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.07 16:15:41