
Laravel Sail 中无法连接 MySQL 数据库,通常是因为 .env 文件中 DB_HOST 配置错误;在 Docker Compose 网络环境下,应设为服务名 mysql 而非 localhost 或 127.0.0.1。
laravel sail 中无法连接 mysql 数据库,通常是因为 `.env` 文件中 `db_host` 配置错误;在 docker compose 网络环境下,应设为服务名 `mysql` 而非 `localhost` 或 `127.0.0.1`。
Laravel Sail 使用 Docker Compose 编排服务,默认将各容器置于同一自定义桥接网络(sail 网络)中。在此网络内,容器间通过服务名(service name) 互相通信——而非 localhost(它指向容器自身)或 127.0.0.1(同理)。你的 docker-compose.yml 明确定义了数据库服务名为 mysql:
services:
mysql: # ← 此即服务名,也是 DNS 可解析的主机名
image: 'mysql/mysql-server:8.0'
...因此,Laravel 应用容器(laravel.test)需通过 mysql 这个主机名访问数据库服务,而非宿主机视角的 localhost:3307。即使你映射了端口 3307 到宿主机,应用容器内部仍需走 Docker 内网通信。
✅ 正确配置 .env 如下:
DB_CONNECTION=mysql DB_HOST=mysql # ← 关键:使用服务名,非 localhost/127.0.0.1 DB_PORT=3306 # ← 注意:容器内 MySQL 默认监听 3306,非 3307 DB_DATABASE=myDb DB_USERNAME=sail DB_PASSWORD=password
⚠️ 重要说明:
- DB_PORT 应设为 容器内部端口(3306),而非宿主机映射端口(3307)。Docker 网络中服务发现基于服务名 + 容器内端口。
- FORWARD_DB_PORT 仅影响宿主机端口映射(如 GUI 工具连接时使用 127.0.0.1:3307),对 Laravel 容器内连接无影响。
- 修改后务必重启 Sail 容器以使环境变量生效:
./vendor/bin/sail down && ./vendor/bin/sail up -d
? 验证连接是否生效:
./vendor/bin/sail artisan tinker >>> DB::connection()->getPdo(); // 若无异常,说明连接成功
? 扩展提示(GUI 连接):
若需使用 TablePlus、MySQL Workbench 等工具连接,应使用:
- Host: 127.0.0.1
- Port: 3307(即 .env 中 FORWARD_DB_PORT 的值)
- Username: sail, Password: password, Database: myDb
这与 Laravel 应用内的配置逻辑分离——前者走宿主机网络,后者走 Docker 内网。
总结:Sail 环境中,.env 的 DB_HOST 必须与 docker-compose.yml 中的服务名严格一致(此处为 mysql),且 DB_PORT 指向容器内真实端口(3306),这是跨容器通信的基础原则。


















