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配置:
- 编辑hosts文件:
- Linux/macOS:打开终端执行
sudo nano /etc/hosts - Windows:以管理员身份打开记事本,编辑
C:\Windows\System32\drivers\etc\hosts
- Linux/macOS:打开终端执行
- 添加以下内容:
127.0.0.1 mysql - 保存文件,然后将
.env中的DB_HOST固定为mysql。
验证:
- 宿主机执行
php artisan serve,应用可正常连接数据库。 - 执行
./vendor/bin/sail artisan migrate,命令可正常执行。
方案2:使用Docker网关IP统一连接
找到Docker容器所在网络的网关IP,将其设为DB_HOST,同时兼容宿主机和容器环境:
- 查看Docker网络网关:
输出通常类似docker network inspect laravel_sail | grep Gateway"Gateway": "172.17.0.1"。 - 将
.env中的DB_HOST修改为查到的网关IP(如172.17.0.1)。 - 重启Sail容器:
./vendor/bin/sail down && ./vendor/bin/sail up -d
方案3:分离环境配置文件
利用Laravel的多环境配置特性,为宿主机和容器分别设置配置:
- 复制
.env文件为.env.local,在.env.local中设置:DB_HOST=localhost - 保留原
.env文件的DB_HOST=mysql,供Sail容器使用。 - 宿主机运行应用时指定加载本地配置:
Sail命令会自动使用原php artisan serve --env=local.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
相关产品推荐
相关产品推荐

