Laravel调用Listing::all()报SQLSTATE[HY000][2002]错误,迁移异常
解决Laravel连接Docker部署MariaDB出现SQLSTATE[HY000] [2002]错误的方案
核心问题分析
本地mysql命令行可正常连接,但Laravel(含Sail命令)报错,本质是Docker容器间网络通信配置不匹配,或Laravel连接参数错误导致无法定位数据库服务。
1. 修正.env文件的数据库连接参数
打开项目根目录.env,调整以下配置:
DB_HOST:不要用127.0.0.1或localhost,改用docker-compose.yml中定义的数据库服务名(如mariadb或mysql)DB_SOCKET:直接注释该参数,Docker容器间采用TCP连接,无需本地socket
示例正确配置:
DB_CONNECTION=mysql DB_HOST=mariadb # 对应docker-compose.yml中的服务名称 DB_PORT=3306 DB_DATABASE=你的数据库名 DB_USERNAME=数据库用户名 DB_PASSWORD=数据库密码 # DB_SOCKET=/path/to/socket # 注释此行
2. 检查docker-compose.yml的数据库服务配置
确保数据库服务与Laravel服务处于同一网络,端口映射正确:
services: mariadb: image: mariadb:10.11.2 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: 你的密码 MYSQL_DATABASE: 你的数据库名 MYSQL_USER: 用户名 MYSQL_PASSWORD: 密码 volumes: - ./docker/mysql/data:/var/lib/mysql networks: - sail # 必须和Laravel服务的网络一致
3. 清除Laravel配置缓存
执行命令刷新配置:
sail artisan config:clear sail artisan cache:clear
4. 验证Docker容器间连通性
进入Laravel容器,测试与数据库服务的网络连通性:
sail shell ping mariadb # 替换为你的数据库服务名,能ping通则网络正常
5. 检查database.php配置冗余
打开config/database.php,确保mysql连接参数均通过env()读取,无硬编码值:
'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', ''), 'unix_socket' => env('DB_SOCKET', ''), # 不要硬写socket路径 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, ],
6. 重启Docker服务栈
若以上配置均正确仍报错,重启服务:
sail down sail up -d
内容的提问来源于stack exchange,提问作者LaZoR_Bear
相关产品推荐
相关产品推荐

