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

Laravel Sail数据库连接异常:DB_HOST切换问题求助

解决Laravel Sail中DB_HOST的矛盾问题

问题根源

你的问题本质是宿主机环境和Docker容器环境对DB_HOST的解析逻辑不同:

  • 当在宿主机直接运行Laravel(如php artisan serve),DB_HOST=mysql无法被宿主机DNS解析(mysql是Docker容器的服务名,仅在容器网络内有效),因此报错SQLSTATE[HY000] [2002]。
  • 当用./vendor/bin/sail artisan执行命令时,代码在Docker容器内运行,DB_HOST=localhost会指向容器自身(而非宿主机的MySQL服务),导致连接失败。

无需切换DB_HOST的解决方案

方案1:修改宿主机hosts文件(推荐,统一配置)

通过在宿主机hosts文件中映射mysql到本地IP,让宿主机和容器环境使用相同的DB_HOST配置:

  1. 编辑hosts文件:
    • Linux/macOS:打开终端执行sudo nano /etc/hosts
    • Windows:以管理员身份打开记事本,编辑C:\Windows\System32\drivers\etc\hosts
  2. 添加以下内容:
    127.0.0.1 mysql
    
  3. 保存文件,然后将.env中的DB_HOST固定为mysql。

验证:

  • 宿主机执行php artisan serve,应用可正常连接数据库。
  • 执行./vendor/bin/sail artisan migrate,命令可正常执行。

方案2:使用Docker网关IP统一连接

找到Docker容器所在网络的网关IP,将其设为DB_HOST,同时兼容宿主机和容器环境:

  1. 查看Docker网络网关:
    docker network inspect laravel_sail | grep Gateway
    
    输出通常类似"Gateway": "172.17.0.1"。
  2. 将.env中的DB_HOST修改为查到的网关IP(如172.17.0.1)。
  3. 重启Sail容器:
    ./vendor/bin/sail down && ./vendor/bin/sail up -d
    

方案3:分离环境配置文件

利用Laravel的多环境配置特性,为宿主机和容器分别设置配置:

  1. 复制.env文件为.env.local,在.env.local中设置:
    DB_HOST=localhost
    
  2. 保留原.env文件的DB_HOST=mysql,供Sail容器使用。
  3. 宿主机运行应用时指定加载本地配置:
    php artisan serve --env=local
    
    Sail命令会自动使用原.env配置,无需额外参数。

额外检查项

  • 确认Docker Compose中MySQL的端口映射正确(默认配置已包含):
    services:
      mysql:
        ports:
          - '${FORWARD_DB_PORT:-3306}:3306'
    
  • 验证MySQL容器正常运行:
    ./vendor/bin/sail ps
    
  • 确认.env中的DB_PORT为3306(与映射的宿主机端口一致)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:00:23