端口冲突是 Laravel Sail 启动失败的最常见原因,需通过 lsof 定位占用进程(如 3307 被本地 MySQL 占用),再针对性停用服务、修改 .env 中 FORWARD_DB_PORT 或 docker-compose.yml 端口映射,或清理残留容器。

端口冲突是 Laravel Sail 启动失败的最常见原因之一,尤其在本地已运行其他服务(如 MySQL、Nginx、Apache 或另一个 Sail 项目)时。排查不需盲目重启,关键是分清“谁占了哪个端口”以及“该端口对 Sail 是否必需”。
确认哪些端口被 Sail 使用
Sail 默认映射以下宿主机端口(见 docker-compose.yml 中的 ports: 配置):
-
80 / 443:Web 服务(Nginx/Apache),对应
APP_URL=http://localhost -
3306 → 3307:MySQL 宿主机映射端口(
FORWARD_DB_PORT=3307),实际容器内通信走mysql:3306 - 6379 → 6379:Redis(若启用)
- 1025:MailHog(若启用)
-
9003:Xdebug 调试端口(若启用且
SAIL_XDEBUG_MODE包含debug)
启动失败时,错误通常会提示类似 Bind for 0.0.0.0:3307 failed: port is already allocated —— 注意看报错里的具体端口号,它就是突破口。
快速定位占用进程
在终端中运行以下命令(macOS / Linux):
查 3307 端口(MySQL 映射端口):lsof -i :3307 或 sudo lsof -iTCP:3307 -sTCP:LISTEN
查 80 端口(Web):lsof -i :80
查 1025(MailHog)或 9003(Xdebug):
同样替换端口号即可
输出中会显示 PID 和 COMMAND。常见占用者包括:
– mysqld(本地安装的 MySQL 服务)
– nginx 或 httpd(系统级 Web 服务)
– com.docker.deskto(另一个 Sail 容器未清理干净)
– phpstorm 或 code(IDE 的 Xdebug 监听器)
针对性解决方式
根据占用源选择处理方法:
- 如果是 另一个 Sail 项目正在运行:执行
./vendor/bin/sail down关闭当前目录的容器,再检查docker ps是否还有残留;必要时运行docker system prune -a清理全部未使用资源 - 如果是 本地 MySQL(如 Homebrew 安装)占用了 3306/3307:停用它
brew services stop mysql,或修改 Sail 的映射端口 —— 编辑.env,将FORWARD_DB_PORT=3308,然后重新运行sail up - 如果是 Nginx/Apache 占用 80 端口:临时停用
sudo brew services stop nginx,或改用非特权端口(如APP_URL=http://localhost:8080并在docker-compose.yml中把 Nginx 的"80:80"改为"8080:80") - 如果是 IDE 的 Xdebug 监听器占了 9003:关闭 IDE 的 “Start listening for PHP Debug Connections”,或在
.env中设SAIL_XDEBUG_MODE=off临时禁用
预防下次冲突
首次安装 Sail 前,建议先运行:
./vendor/bin/sail down && docker system prune -f
再检查关键端口是否空闲:lsof -i :80 -i :3307 -i :1025 -i :9003 | grep LISTEN
若无输出,说明端口可用。
另外,避免多个 Laravel 项目同时用默认配置启动 Sail —— 每个项目应使用独立子域名(如 app1.test、app2.test)并配好 /etc/hosts,而非都绑 localhost。


















