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

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

排查与解决步骤

  1. 确认Laravel容器与MySQL容器在同一网络
    检查docker-compose.yml中Laravel服务段是否加入sail网络,缺失则添加:

    networks:
        - sail
    

    添加后重启容器:sail down && sail up -d

  2. 设置正确的DB_HOST值
    Docker Compose网络内容器通过服务名通信,将.env中DB_HOST改为mysql,然后清除配置缓存:

    sail artisan config:clear
    sail artisan cache:clear
    

    完成后重启容器。

  3. 检查MySQL容器初始化状态
    查看MySQL容器日志排查初始化错误:

    docker logs example-app-mysql-1
    

    若存在数据库创建失败等问题,可删除数据卷重新初始化(注意备份数据):

    sail down -v
    sail up -d
    
  4. 验证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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:05:15