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

WSL+Docker环境下Laravel用DB_HOST=mysql终端连MySQL失败问题

解决方案

以下是几个无需频繁修改.env配置的可行方案,适配WSL2+Docker+Laravel的跨环境访问需求:

方案一:使用host.docker.internal统一数据库地址

将.env中的DB_HOST设置为host.docker.internal:

DB_HOST=host.docker.internal
DB_PORT=3306

这个地址是Docker提供的特殊主机名,在WSL环境中会解析到Windows主机的IP,在Windows环境中则指向本地。只要你的MySQL容器已经将3306端口映射到Windows主机(启动命令包含-p 3306:3306),无论是WSL终端执行php artisan migrate,还是Windows浏览器访问Laravel应用,都能正常连接到MySQL容器。

方案二:分环境加载不同配置文件

Laravel支持根据环境加载对应的.env文件,步骤如下:

  1. 在项目根目录创建.env.wsl文件,配置WSL终端专用的数据库地址:
DB_HOST=127.0.0.1
DB_PORT=3306
  1. 创建.env.browser文件,配置Windows浏览器访问时的数据库地址:
DB_HOST=host.docker.internal
DB_PORT=3306
  1. 执行终端命令时指定WSL环境:
php artisan migrate --env=wsl
  1. 启动开发服务器时指定浏览器环境:
php artisan serve --env=browser

方案三:配置跨环境统一的自定义主机名

通过修改hosts文件,让WSL和Windows都能解析同一个主机名到正确的数据库地址:

  1. 在WSL终端执行hostname -I获取WSL的IP地址(例如192.168.1.100)。
  2. 修改WSL的/etc/hosts文件,添加:
127.0.0.1 mysql.local
  1. 修改Windows的C:\Windows\System32\drivers\etc\hosts文件,添加:
192.168.1.100 mysql.local
  1. 将.env中的DB_HOST设置为mysql.local:
DB_HOST=mysql.local
DB_PORT=3306

注意:WSL的IP可能在重启后变化,可通过脚本自动更新Windows hosts文件,或配置WSL静态IP解决。

方案四:绑定MySQL容器到所有网络接口

确保MySQL容器启动时将端口映射到所有可用接口,而不是仅本地回环:

docker run -d -p 0.0.0.0:3306:3306 --name mysql-container mysql:latest

然后将WSL设置为静态IP,将.env中的DB_HOST设为这个静态IP。这样无论是WSL终端还是Windows浏览器,都能通过该IP访问到MySQL容器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:25:05