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

Fedora环境下Laravel容器连接本地MySQL报2002错误求助

解决Docker中Laravel连接Fedora本地MySQL出现SQLSTATE[HY000] [2002]错误的方案

错误原因

你遇到的SQLSTATE[HY000] [2002] No such file or directory错误,核心原因是Docker容器无法直接访问宿主机(Fedora)的MySQL套接字文件,同时容器内的127.0.0.1指向容器自身的网络栈,而非宿主机的本地MySQL服务。Windows环境正常是因为MySQL部署在另一个容器中,同属一个Docker网络,可直接通过容器IP/名称通信。


解决方案1:使用TCP连接替代套接字

这是最稳妥的方案,避免套接文件权限和路径的问题:

  1. 修改.env配置
    将DB_HOST从127.0.0.1改为宿主机的局域网IP(比如192.168.1.100),或者使用Docker内置的host.docker.internal(自动指向宿主机):

    DB_CONNECTION=mysql
    DB_HOST=host.docker.internal
    DB_PORT=3306
    DB_DATABASE=wymaq
    DB_USERNAME=root
    DB_PASSWORD=
    
  2. 调整Laravel数据库配置
    在config/database.php的mysql配置块中,注释或删除unix_socket行,强制使用TCP连接:

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        // 'unix_socket' => '/var/lib/mysql/mysql.sock', // 注释此行
        'strict' => true,
        'engine' => null,
        'modes' => [
            'ONLY_FULL_GROUP_BY',
            'STRICT_TRANS_TABLES',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'ERROR_FOR_DIVISION_BY_ZERO',
            'NO_ENGINE_SUBSTITUTION',
        ],
    ],
    
  3. 配置Fedora本地MySQL允许外部连接

    • 编辑MySQL配置文件(通常是/etc/my.cnf或/etc/mysql/my.cnf),将bind-address改为0.0.0.0(允许所有IP访问),或者指定容器所在的IP段:
      bind-address = 0.0.0.0
      
    • 重启MySQL服务:
      sudo systemctl restart mysqld
      
    • 给root用户授权远程访问权限:
      GRANT ALL PRIVILEGES ON wymaq.* TO 'root'@'%' IDENTIFIED BY '';
      FLUSH PRIVILEGES;
      

解决方案2:挂载宿主机MySQL套接字到容器

如果必须使用套接字连接,需要将宿主机的套接文件挂载到容器内部:

  1. 启动容器时添加挂载参数
    运行容器时,添加-v参数挂载套接文件,注意容器内部路径要和PHP配置兼容:

    docker run -d -p 8080:80 -v /var/lib/mysql/mysql.sock:/var/run/mysqld/mysqld.sock your-laravel-image
    
  2. 调整Laravel的套接字路径
    在config/database.php中修改unix_socket为容器内的挂载路径:

    'unix_socket' => '/var/run/mysqld/mysqld.sock',
    
  3. 修复套接文件权限
    确保宿主机的mysql.sock权限允许容器内用户访问:

    sudo chmod 777 /var/lib/mysql/mysql.sock
    

    (临时测试用,生产环境建议调整MySQL的用户组权限,让容器用户加入对应组)


验证步骤

  1. 进入Laravel容器,测试MySQL连接:
    docker exec -it your-container-name bash
    # TCP连接测试
    mysql -h host.docker.internal -u root wymaq
    # 套接字连接测试(方案2用)
    mysql -S /var/run/mysqld/mysqld.sock -u root wymaq
    
  2. 清除Laravel配置缓存:
    php artisan config:clear
    

内容的提问来源于stack exchange,提问作者Gaspar Giménez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:41:23