根本原因是Docker容器(如nginx、php-fpm)默认绑定的80/443端口被本地Web服务、残留容器或其他开发工具占用;可通过sudo lsof -i :80等命令识别占用进程,并用sail down清理或修改docker-compose.yml端口映射解决。

使用 Laravel Sail 启动项目时提示端口被占用,根本原因不是 Sail 本身出错,而是它依赖的 Docker 容器(尤其是 nginx 或 php-fpm)尝试绑定的端口(默认 80 和 443)已被本地其他服务抢先占用。
常见占用源与快速识别
大多数情况下,冲突端口来自以下几类服务:
- 本地 Web 服务器:XAMPP、WAMP、MAMP、Laragon 或系统自带的 Apache/Nginx 正在运行并监听 80/443 端口
-
已残留的 Sail 容器:之前执行过
sail up但未用sail down正常关闭,导致容器仍在后台运行 -
其他开发工具:如 Vite/HMR 开发服务器、Python HTTP 服务(
python -m http.server 8000)、甚至某些 IDE 内置服务 - macOS 系统服务:如 AirPlay Receiver(会占用 7000 端口)或 Parallels Desktop 的共享服务(可能抢占 80)
验证是否真被占用
在终端中运行对应命令,确认端口状态:
-
macOS / Linux:
sudo lsof -i :80或sudo lsof -i :443 -
Windows:
netstat -ano | findstr :80,再用tasklist | findstr "PID号"查进程名
若输出中出现 httpd、nginx、apache、com.docker.desktop(旧版 Docker Desktop 的代理)等,即为占用源。
针对性解决方法
根据识别结果选择处理方式:
- 若为 XAMPP/WAMP/Laragon 等:直接关闭其控制面板中的 Apache/Nginx 服务
- 若为 残留 Sail 容器:运行
sail down清理,再执行sail up -d - 若为 Docker Desktop 自身占用(常见于 macOS):打开 Docker Desktop 设置 → Resources → Network → 取消勾选 “Use the Docker Compose V2” 或尝试重启 Docker Desktop
- 若需保留本地服务又想用 Sail:修改
docker-compose.yml中 nginx 的端口映射,例如将"80:80"改为"8080:80",然后访问http://localhost:8080
预防下次再发生
养成两个习惯可大幅减少此类问题:
- 每次结束开发后,主动运行
sail down而非直接关终端 - 避免同时开启多个本地 PHP 环境(如一边开 Laragon,一边跑 Sail),二者默认都争抢 80 端口


















