Laravel Docker连接MySQL超时:SQLSTATE[HY000][2002]求助
Laravel Docker环境MySQL连接超时(SQLSTATE[HY000] [2002])排查与解决
在Laravel Docker环境中连接MySQL时触发SQLSTATE[HY000] [2002]连接超时错误,此前环境运行正常,今日突发异常。已尝试将.env的DB_HOST改为127.0.0.1、localhost、mysql,均未解决。
相关配置信息
.env 文件
DB_CONNECTION=mysql DB_HOST=host.docker.internal DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=sail DB_PASSWORD=password
config/database.php 文件(MySQL连接段)
'connections' => [ 'mysql' => [ 'driver' => 'mysql', 'url' => env('DB_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'laravel'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => env('DB_CHARSET', 'utf8mb4'), 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], ]
docker-compose.yml 文件(MySQL服务段)
services: mysql: image: 'mysql/mysql-server:8.0' ports: - '${FORWARD_DB_PORT:-3306}:3306' environment: MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' MYSQL_ROOT_HOST: '%' MYSQL_DATABASE: '${DB_DATABASE}' MYSQL_USER: '${DB_USERNAME}' MYSQL_PASSWORD: '${DB_PASSWORD}' MYSQL_ALLOW_EMPTY_PASSWORD: 1 volumes: - 'sail-mysql:/var/lib/mysql' - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh' networks: - sail healthcheck: test: - CMD - mysqladmin - ping - '-p${DB_PASSWORD}' retries: 3 timeout: 5s
容器状态(docker ps -a 输出)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c51aae3e5ba3 sail-8.3/app "start-container" 58 seconds ago Up 56 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:5173->5173/tcp example-app-laravel.test-1 ac56ca8e33cc selenium/standalone-chrome "/opt/bin/entry_poin…" About a minute ago Up About a minute 4444/tcp, 5900/tcp example-app-selenium-1 35a5a74ba4ae getmeili/meilisearch:latest "tini -- /bin/sh -c …" About a minute ago Up About a minute (healthy) 0.0.0.0:7700->7700/tcp example-app-meilisearch-1 8cfebdb51c63 mysql/mysql-server:8.0 "/entrypoint.sh mysq…" About a minute ago Up About a minute (healthy) 0.0.0.0:3306->3306/tcp, 33060-33061/tcp example-app-mysql-1 732348f1fba0 axllent/mailpit:latest "/mailpit" About a minute ago Up About a minute (healthy) 0.0.0.0:1025->1025/tcp, 0.0.0.0:8025->8025/tcp, 1110/tcp example-app-mailpit-1 b3a48ef1a548 redis:alpine "docker-entrypoint.s…" About a minute ago Up About a minute (healthy) 0.0.0.0:6379->6379/tcp example-app-redis-1 76e1503c8731 sail-8.3/app "start-container" 51 minutes ago Exited (0) 26 minutes ago api-laravel.test-1 62cce2cb9872 axllent/mailpit:latest "/mailpit" 52 minutes ago Exited (0) 26 minutes ago api-mailpit-1 969da70f2c5d getmeili/meilisearch:latest "tini -- /bin/sh -c …" 53 minutes ago Exited (143) 26 minutes ago api-meilisearch-1 829e1081c4e1 mysql/mysql-server:8.0 "/entrypoint.sh mysq…" 54 minutes ago Exited (0) 26 minutes ago api-mysql-1 ab4872db1051 redis:alpine "docker-entrypoint.s…" 54 minutes ago Exited (0) 26 minutes ago api-redis-1 a4c4686916a0 selenium/standalone-chrome "/opt/bin/entry_poin…" 56 minutes ago Exited (143) 26 minutes ago api-selenium-1
排查与解决步骤
确认Laravel容器与MySQL容器在同一网络
检查docker-compose.yml中Laravel服务段是否加入sail网络,缺失则添加:networks: - sail添加后重启容器:
sail down && sail up -d设置正确的
DB_HOST值
Docker Compose网络内容器通过服务名通信,将.env中DB_HOST改为mysql,然后清除配置缓存:sail artisan config:clear sail artisan cache:clear完成后重启容器。
检查MySQL容器初始化状态
查看MySQL容器日志排查初始化错误:docker logs example-app-mysql-1若存在数据库创建失败等问题,可删除数据卷重新初始化(注意备份数据):
sail down -v sail up -d验证MySQL用户权限
进入MySQL容器,检查sail用户的访问权限:docker exec -it example-app-mysql-1 mysql -u sail -ppassword登录后执行SQL查询:
SELECT user, host FROM mysql.user WHERE user = 'sail';若
host不为%,执行以下命令修改权限:ALTER USER 'sail'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者Nantanat Watt.
相关产品推荐
相关产品推荐

