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

Docker环境下PHP连接MySQL报PDOException[2002]错误求助

Docker环境下PDO连接MySQL报错SQLSTATE[HY000] [2002]的解决方案

问题重现

使用Docker、PHP、MySQL与Apache搭建环境后,访问依赖database-connection.php的页面时触发以下错误:

Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in /var/www/html/database-connection.php:22 Stack trace: #0 /var/www/html/index.php(3): require() #1 {main} thrown in /var/www/html/database-connection.php on line 22

注释第22行的throw new PDOException($e->getMessage(), $e->getCode());后页面能显示,但实际数据库连接并未成功——只是异常被掩盖了。

核心问题与解决方案

1. 修正数据库主机地址(最关键)

在Docker Compose的服务网络中,容器之间通过服务名互相访问,而非localhost(localhost在PHP容器内指向容器自身,不是MySQL容器)。

打开database-connection.php,将:

$server     = 'localhost'; // Must be the service name of the database in `docker-compose.yml`

修改为:

$server     = 'mysql'; // 对应docker-compose.yml中的MySQL服务名

2. 等待MySQL服务完全初始化

MySQL容器第一次启动需要创建数据库、初始化权限,耗时约几十秒。可以通过日志确认服务就绪:

docker-compose logs mysql

看到日志中出现ready for connections字样后,再测试页面访问。

3. 清理MySQL Dockerfile冗余配置

你的MySQL Dockerfile中RUN chmod 755 /var/lib/mysql是多余操作,官方MySQL镜像已默认配置好目录权限,删除该行避免潜在权限冲突:

FROM mysql:latest
USER root

4. 重新构建PHP镜像确保扩展生效

虽然你的PHP-Apache Dockerfile已安装pdo_mysql扩展,但重新构建镜像可确保扩展正确加载:

docker-compose build php-apache
docker-compose up -d

验证修改

完成上述操作后,取消database-connection.php中第22行的注释,重新访问页面:

  • 若连接成功,页面将正常输出Hello, World!
  • 若仍报错,检查docker-compose.yml中MySQL服务的环境变量(如MYSQL_DATABASE、MYSQL_ROOT_PASSWORD)是否与database-connection.php中的配置一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:17:32