

新闻资讯
技术百科Laravel Sail 是 Laravel 官方基于 Docker 的轻量级本地开发环境工具,封装了 sail 命令与预配置 docker-compose.yml,开箱即用,解决版本统一、权限同步、命令转发等痛点;适用于单项目快速启动,不适用于多项目共享服务、深度定制或生产部署。
Laravel Sail 是 Laravel 官方提供的、基于 Docker 的轻量级本地开发环境封装工具,它不是独立的 Docker 编排系统,而是 sail 命令行脚本 + 预配置的 的组合。你不需要手写复杂 Dockerfile 或反复调试网络、卷挂载,开箱即可运行 Laravel 项目。
直接写 docker-compose.yml 当然可以,但 Laravel Sail 解决了几个高频痛点:
utf8mb4_0900_as_cs 排序规则)/var/www/html,且保持用户 UID/GID 一致,避免文件权限混乱(www-data 写不了 storage/)sail artisan、sail npm run dev 等命令自动转发到对应容器,无需手动 docker exec -it
sail up -d / sail down,比记一堆 docker-compose 参数更直观前提是已安装 Docker Desktop(或 Linux 上的 Docker Engine + docker-compose v2.2+),且项目根目录下已有 composer.json(Laravel 9+ 新项目默认带 Sail)。
若项目未初始化 Sail:
php artisan sail:install
该命令会:
docker-compose.yml(含 laravel.test、mysql、redis 等服务)./vendor/bin/sail 可执行脚本(Linux/macOS)或 sail.bat(Windows)然后运行:
./vendor/bin/sail up -d
首次启动会拉取镜像(如 laravelsail/php82-composer),耗时较长;后续启动很快。
典型现象包括:
http://localhost 显示 “This site can’t be reached”sail artisan migrate 报错 SQLSTATE[HY000] [2002] Connection refused
sail npm run dev 启动后热更新不生效,或 WebSocket 连接失败原因和对策:
docker-compose.yml 中 laravel.test 的 ports 没暴露 80/443:确认有 - '80:80' 或 - '127.0.0.1:80:80',不要写成 - '8080:80' 却还用 localhost 访问--wait 或等 sail ps 显示所有状态为 Up 再操作;也可在 .env 中设 DB_HOST=mysql(非 127.0.0.1)localhost 而非 0.0.0.0:修改 package.json 中 "dev": "vite --host" 或 "dev": "mix --host 0.0.0.0"
sail shell 进入容器内部调试Sail 是为“单项目快速启动”设计的,不适合以下场景:
grpc、sqlsrv),Sail 提供的镜像不含这些,需自己构建基础镜像docker 和 docker-compose,CI 环境通常用更精简的纯 docker-compose 或 GitHub Actions 自定义 runner真正麻烦的从来不是启动容器,而是搞清哪个服务该连哪个 host、哪个端口、谁先启动谁后启动、文件权限怎么同步——Sail 把这些默认值固化下来,省掉前 30 分钟踩坑时间。但一旦需求超出它的预设边界,就得切回原生 Docker 工作流。