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

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)。

修复步骤

  1. 修改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;
    }
}
  1. 确认目标数据库存在
    检查./init目录下的初始化脚本是否创建了lisbuy数据库,若没有,手动进入MySQL容器创建:
docker-compose exec mysql mysql -u root -p1234
CREATE DATABASE lisbuy;
  1. 重启容器生效
    修改配置后重启PHP-FPM和MySQL容器:
docker-compose restart php-fpm mysql

额外说明

  • 本地PHP-Server能连接成功,是因为它运行在宿主机上,可直接访问宿主机映射的8002端口;但Nginx+PHP-FPM在容器内,必须用Docker内部的服务名和端口通信。
  • Docker Compose默认会为所有服务创建共享网络,服务间通过服务名即可互相访问,无需依赖端口映射(端口映射仅用于宿主机和容器的外部通信)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:25:20