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
相关产品推荐
相关产品推荐

