Laravel Sail 是 Laravel 9+ 默认集成的轻量级 Docker 开发方案,封装 Nginx、PHP-FPM、MySQL 等服务,自动处理依赖顺序与网络配置;需修正 docker-compose.yml 路径、.env 主机配置及时区,并在容器内执行 composer install;生产环境须导出并精简配置,不可直接使用 sail up -d。

直接用 Laravel Sail 部署 Docker 环境是目前最轻量、最贴近官方推荐的方案——它不是“可选工具”,而是 Laravel 9+ 默认集成的容器化入口,不需要手写 docker-compose.yml 就能跑起完整开发栈。
为什么不用自己写 docker-compose.yml?
Sail 的核心价值是把常见组合(Nginx + PHP-FPM + MySQL + Redis + MailHog + Selenium)封装成开箱即用的 CLI 工具,避免重复配置网络、卷映射、环境变量顺序等易错点。你自己写的 docker-compose.yml 很容易在 APP_SERVICE 和 php-fpm 容器间出现 socket 连接超时,或因 mysql 容器启动慢导致 Laravel 迁移失败。
-
sail up自动等待 MySQL 就绪后再启动应用服务 - 所有服务默认使用
sail网络,PHP 容器内访问mysql就是 DNS 名字,无需127.0.0.1或host.docker.internal -
.env中的DB_HOST=mysql、REDIS_HOST=redis是生效前提,不是占位符
安装 Sail 后必须改的三个地方
运行 composer require laravel/sail --dev 并执行 php artisan sail:install 后,别急着 sail up。以下三处不改,90% 的人会卡在 502 或数据库连接拒绝:
- 检查
docker-compose.yml中build.context是否指向项目根目录(不是./vendor/laravel/sail/runtimes/8.2这类绝对路径) - 确认
.env里DB_HOST=mysql、REDIS_HOST=redis、MAIL_MAILER=smtp且MAIL_HOST=mailhog - PHP 容器内时区必须和宿主机一致,否则日志/队列时间错乱:在
docker-compose.yml的laravel.test服务下加environment块:environment: - APP_TIMEZONE=Asia/Shanghai - TZ=Asia/Shanghai
sail artisan 命令总提示 Class not found?
这是最常被忽略的权限与自动加载问题:Sail 的 sail artisan 实际在 laravel.test 容器里执行,但 vendor/autoload.php 如果由宿主机(比如 Mac M1)生成,可能含不兼容的扩展或缓存。解决方式不是重装依赖,而是强制容器内生成:
- 先
sail down停掉所有容器 - 删掉宿主机上的
vendor/和composer.lock - 运行
sail composer install—— 这一步会在 PHP 容器内执行,生成匹配容器架构的 autoloader - 再
sail up -d启动,sail artisan migrate就不会报Class 'App\\Models\\User' not found
生产环境别用 sail up -d
Sail 是为开发设计的:它默认暴露 8000 端口、启用 Xdebug、挂载整个项目目录为 volume、日志直写 stdout。上线时这些全是风险点。真正上生产应导出配置:sail artisan sail:publish,然后手动删掉 xdebug 扩展、注释 volumes 下的源码挂载、把 APP_ENV=production 写死进 docker-compose.yml 的 environment 块,并用 Nginx 反向代理替换 Sail 自带的简易服务器。否则你看到的 “Docker 部署” 其实只是本地开发镜像直接扔到云服务器上裸跑。










