Docker环境下PHP连接MySQL报错SQLSTATE[HY000][2002]连接被拒绝
问题:Docker环境中PHP连接MySQL报Connection refused错误
问题描述
在Docker环境中尝试让PHP连接MySQL容器时,出现致命错误:SQLSTATE[HY000] [2002] Connection refused,报错堆栈指向连接类文件。已将数据库连接主机改为127.0.0.1但仍无法连接;可通过PHP-Server连接MySQL服务,但Nginx+PHP-FPM无法建立连接。
报错信息
NOTICE: PHP message: PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] Connection refused in /app/public/src/ConexaoBD.php:5 Stack trace: #0 /app/public/src/ConexaoBD.php(5): PDO->__construct() #1 /app/public/src/ProdutoDAO.php(8): ConexaoBD::getConexao() #2 /app/public/home.php(15): ProdutoDAO->consultarProdutos() #3 {main} thrown in /app/public/src/ConexaoBD.php on line 5 172.19.0.8 - 26/Dec/2022:14:02:05 +0000 "GET /home.php" 500
Docker Compose配置
version: '3.1' services: memcached: image: 'memcached:alpine' mailhog: image: 'mailhog/mailhog:latest' ports: - '8001:8025' redis: image: 'redis:alpine' mysql: image: 'mysql:8.0' working_dir: /app volumes: - ./init:/docker-entrypoint-initdb.d environment: - MYSQL_ROOT_PASSWORD=1234 - MYSQL_PASSWORD=1234 ports: - '8002:3306' clickhouse: image: 'yandex/clickhouse-server:latest' webserver: image: 'nginx:alpine' working_dir: /app volumes: - '.:/app' - './phpdocker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf' ports: - '8000:80' php-fpm: build: phpdocker/php-fpm working_dir: /app volumes: - '.:/app' - './phpdocker/php-fpm/php-ini-overrides.ini:/etc/php/8.2/fpm/conf.d/99-overrides.ini'
PHP连接类代码
class ConexaoBD{ public static function getConexao():PDO{ $conexao = new PDO("mysql:host=127.0.0.1;port=8002;dbname=lisbuy","root","1234", array(PDO::ATTR_PERSISTENT => true)); return $conexao; } }
解决方案
核心问题
Docker Compose中每个容器都是独立的网络个体,127.0.0.1在PHP-FPM容器里指向容器自身,而非宿主机或MySQL容器。你使用的8002是宿主机映射到MySQL的端口,容器之间通信必须用MySQL容器的内部端口3306,并且通过服务名mysql访问(Docker会自动解析服务名为对应容器的IP)。
修复步骤
- 修改PHP连接配置
把连接字符串里的host=127.0.0.1;port=8002替换为host=mysql;port=3306:
class ConexaoBD{ public static function getConexao():PDO{ $conexao = new PDO("mysql:host=mysql;port=3306;dbname=lisbuy","root","1234", array(PDO::ATTR_PERSISTENT => true)); return $conexao; } }
- 确认目标数据库存在
检查./init目录下的初始化脚本是否创建了lisbuy数据库,若没有,手动进入MySQL容器创建:
docker-compose exec mysql mysql -u root -p1234 CREATE DATABASE lisbuy;
- 重启容器生效
修改配置后重启PHP-FPM和MySQL容器:
docker-compose restart php-fpm mysql
额外说明
- 本地PHP-Server能连接成功,是因为它运行在宿主机上,可直接访问宿主机映射的
8002端口;但Nginx+PHP-FPM在容器内,必须用Docker内部的服务名和端口通信。 - Docker Compose默认会为所有服务创建共享网络,服务间通过服务名即可互相访问,无需依赖端口映射(端口映射仅用于宿主机和容器的外部通信)。
内容的提问来源于stack exchange,提问作者Murilo
相关产品推荐
相关产品推荐

