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文件,步骤如下:
- 在项目根目录创建
.env.wsl文件,配置WSL终端专用的数据库地址:
DB_HOST=127.0.0.1 DB_PORT=3306
- 创建
.env.browser文件,配置Windows浏览器访问时的数据库地址:
DB_HOST=host.docker.internal DB_PORT=3306
- 执行终端命令时指定WSL环境:
php artisan migrate --env=wsl
- 启动开发服务器时指定浏览器环境:
php artisan serve --env=browser
方案三:配置跨环境统一的自定义主机名
通过修改hosts文件,让WSL和Windows都能解析同一个主机名到正确的数据库地址:
- 在WSL终端执行
hostname -I获取WSL的IP地址(例如192.168.1.100)。 - 修改WSL的
/etc/hosts文件,添加:
127.0.0.1 mysql.local
- 修改Windows的
C:\Windows\System32\drivers\etc\hosts文件,添加:
192.168.1.100 mysql.local
- 将
.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
相关产品推荐
相关产品推荐

