“sail”命令找不到、无法访问http://localhost、.env修改无效,根本原因是Docker、WSL、宿主机、容器四层环境链路未对齐;需依次确认Docker CLI可用、WSL2版本为2且Docker Desktop设为Linux模式、项目根目录下执行sail:install生成配置、sail up时加--build重建镜像、并正确配置hosts与端口映射。

“sail” 命令找不到、sail up 启动后打不开 http://localhost、改了 .env 没生效——这些问题基本都出在环境链路没对齐,不是配置写错了,而是 Docker、WSL、宿主机、容器这四层之间某处断了。
为什么 sail 命令提示 “command not found”
根本不是 Laravel 项目缺包,而是终端压根没识别到 sail 这个可执行文件。它只存在于项目 ./vendor/bin/ 下,且依赖宿主机能调用 docker 和 docker-compose。
- 先确认当前目录是 Laravel 项目根目录(含
artisan和composer.json),否则php artisan sail:install会静默失败 - 运行
which docker和docker --version,如果报错或无输出,说明 Docker CLI 未接入当前 shell 环境(常见于 WSL2 中未启用 Docker Desktop 的 WSL 集成) - Windows + WSL 用户必须满足三个条件:Docker Desktop 切到 Linux 容器模式、Settings → General 中勾选
Use the WSL 2 based engine、且wsl.exe -l -v显示发行版版本为 2 - Mac 用户若用 zsh,检查
~/.zshrc是否漏加export PATH="./vendor/bin:$PATH"(不推荐全局加,应进项目后临时加或直接用./vendor/bin/sail)
sail up 启动后访问不了 http://localhost 或 http://laravel.test
这不是 Web 服务没起来,而是域名解析或端口映射没到位。Sail 默认用 Nginx + PHP-FPM,入口服务名是 laravel.test,不是 localhost。
- 先运行
sail ps,确认laravel.test容器状态是Up,不是Restarting;如果是后者,大概率是.env里DB_HOST=mysql写成了DB_HOST=127.0.0.1或拼错服务名 - Mac / Windows 用户需手动加 hosts:
echo '127.0.0.1 laravel.test' | sudo tee -a /etc/hosts;Linux 用户建议直接访问http://127.0.0.1,别依赖域名 - 检查
docker-compose.yml中services.nginx.ports是否为- '80:80';如果改成- '8080:80',就得访问http://laravel.test:8080 - 浏览器打不开时,别只刷页面——执行
sail logs nginx看是否有connect() failed (111: Connection refused) while connecting to upstream,这说明 PHP-FPM 没响应,要接着查sail logs laravel.test
.env 修改后数据库连不上,或 sail artisan 报 Class not found
环境变量和自动加载器都没被容器真正读取。Sail 不会热重载 .env,也不会复用宿主机生成的 vendor/。
-
DB_HOST必须设为mysql(对应docker-compose.yml里 services.mysql 的名字),不能是127.0.0.1或localhost;改完必须sail down && sail up -d,否则 PHP 容器不会重读 -
sail artisan migrate报Class not found,90% 是因为vendor/是在宿主机(比如 M1 Mac)上用composer install生成的,含不兼容扩展;正确做法是:sail down→ 删除宿主机的vendor/和composer.lock→sail composer install→sail up -d - 如果用的是自定义 APP_URL(如
APP_URL=http://myapp.test),除了 hosts,还要确认docker-compose.yml中nginx.extra_hosts或laravel.test.extra_hosts有对应条目,否则容器内 cURL 请求会失败
想加 Redis、Node.js 或换 MySQL 版本,怎么改配置
Sail 不是“全开即用”,所有非默认服务都要显式声明并重建镜像,否则 sail up 会完全忽略新增块。
- 加 Redis:运行
sail artisan sail:install(注意不是sail:publish),交互式勾选 Redis;或手动在docker-compose.yml的services下加redis:块,并确保 Laravel 的CACHE_DRIVER=redis和REDIS_HOST=redis - 加 Node.js:运行
sail add node,它会修改docker-compose.yml并在 PHP 容器中装 npm;之后才能用sail npm run dev;但注意:新增后必须sail up -d --build,否则旧镜像没更新 Node - 换 MySQL 版本:改
docker-compose.yml里services.mysql.image,例如从mysql:8.0改成mysql:8.4;改完同样要--build,且首次启动可能因数据卷不兼容失败,可临时删掉volumes.mysql.data对应的本地路径再试
最常被忽略的一点:所有对 docker-compose.yml 的修改,都不会自动触发镜像重建。不加 --build 就 sail up,等于什么都没改。


















