Laravel Sail
介绍
Laravel Sail 是一个轻量级的命令行界面,用于与 Laravel 的默认 Docker 开发环境进行交互。 Sail 为使用 PHP,MySQL 和 Redis 构建 Laravel 应用程序提供了一个很好的起点,而无需事先具有 Docker 经验。
Sail 的核心是 docker-compose.yml
文件和存储在项目根目录的 sail
脚本。 sail
脚本为 CLI 提供了便捷的方法,可用于与docker-compose.yml
文件定义的 Docker 容器进行交互。
Laravel Sail 支持 macOS、Linux 和 Windows(通过 WSL2)。
安装和设置
所有新的Laravel应用程序都默认安装了Laravel Sail,所以你可以立即开始使用它。要了解如何创建一个新的 Laravel 应用程序,请参阅适用于您操作系统的Laravel的安装文档。
配置 Bash 别名
默认情况下,使用vendor/bin/sail
脚本调用 Sail 命令,该脚本包含在所有新的Laravel应用程序中:
./vendor/bin/sail up
但是,您不必反复键入vendor/bin/sail
来执行 sail 命令,你应该需要配置 Bash 别名,使您能够更轻松地执行 sail 的命令:
alias sail='bash vendor/bin/sail'
配置了Bash 别名之后,您可以通过简单地键入 sail
来执行 Sail 命令。本文档的其余示例将假定您已配置此别名:
sail up
开始 & 停止 Sail
Laravel Sail 的 docker-compose.yml
文件定义了一组 Docker 容器,这些容器一起工作以帮助您构建 Laravel 应用程序。每个容器实例都在 docker-compose.yml
文件中的 services
配置内。laravel.test
容器是为应用程序提供服务的主要应用程序容器。
在开始 Sail 之前,应确保本地计算机上没有运行其他 Web 服务器或数据库。若要启动应用程序docker-compose.yml
文件中定义的所有 Docker 容器,应执行"up"命令:
sail up
要在后台启动所有 Docker 容器,您可以在"分离"模式下启动 Sail:
sail up -d
启动应用程序的容器后,您可以在 Web 浏览器中访问项目:http://localhost 。
要停止所有容器,只需按 Control + C 即可停止容器的执行。如果容器在后台运行,您可以使用"down"命令:
sail down
执行命令
使用 Laravel Sail 时,应用程序在 Docker 容器中执行,并且与本地计算机隔离。不过 Sail 提供了一种针对应用程序运行各种命令的便捷方法,例如方便调用的 PHP 命令、Artisan 命令、Composer 命令和 Node/ NPM 命令。
当阅读Laravel文档时,您可能经常看到对Composer
,Artisan
,和Node/NPM
命令的使用参考,但是没有Sail
的。 因为这些例子都是假设这些工具都是安装在您本地的计算机上的。如果想使用Sail
作为你本地的开发环境的话,您需要在Sail
通过以下的方式执行命令:
# 在本地运行的Artisan命令...
php artisan queue:work
# 在Laravel Sail中运行的Artisan命令...
sail artisan queue:work
执行PHP命令
PHP命令可以使用php
命令执行。 当然,这些命令将使用为您的应用程序配置的PHP版本执行。 要了解有关Laravel Sail可用的PHP版本的更多信息,请查阅PHP版本文档:
sail php --version
sail php script.php
执行Composer命令
可以使用“composer”命令来执行Composer命令。 Laravel Sail的应用程序容器中已安装Composer 2.x:
sail composer require laravel/sanctum
执行Artisan命令
Laravel Artisan命令可以使用artisan
命令执行:
sail artisan queue:work
执行Node/NPM命令
Node命令可以使用node命令执行,而NPM命令可以使用npm命令执行:
sail node --version
sail npm run prod
与数据库交互
MySQL
您可能已经注意到,应用程序的docker-compose.yml文件包含一个MySQL容器的条目。该容器使用了Docker volume,以便即使在停止和重新启动容器时依然可以持久存储数据库中存储的数据。 另外,当MySQL容器启动时,它将确保存在名称与您的DB_DATABASE
环境变量的值匹配的数据库。
启动容器后,您可以通过将应用程序.env
文件中的DB_HOST
环境变量设置为mysql
来连接到应用程序中的MySQL实例。
要从本地计算机连接到应用程序的MySQL数据库,您可以使用图形数据库管理应用程序,例如TablePlus。 默认情况下,可以从localhost
的3306端口访问MySQL数据库。
Redis
应用程序的docker-compose.yml
文件也包含Redis容器。该容器使用Docker volume,以便即使在停止和重新启动容器后,Redis数据中存储的数据也可以持久保存。 启动容器后,可以通过将应用程序.env
文件中的环境变量Redis_HOST
设置为redis
来连接到应用程序中的Redis实例。
要从本地计算机连接到应用程序的Redis数据库,可以使用图形数据库管理应用程序,例如TablePlus。 默认情况下,可以从localhost
的6379端口访问Redis数据库。
运行测试
Laravel提供了开箱即用的测试支持,您可以使用Sail的test命令运行应用程序功能和单元测试。PHPUnit接受的任何CLI选项也可以传递给test
命令:
sail test
sail test --group orders
Sailtest
命令相当于运行Artisantest
命令:
sail artisan test
Laravel Dusk
Laravel Dusk 提供了非常优雅的、易于使用的浏览器自动化测试 API。 有了 Sail ,进行浏览器测试更加方便了,甚至不用在你的本地电脑上安装 Selenium 或者任何其他工具。要开启这项功能, 请在 docker-compose.yml 文件中取消 Selenium 服务注释:
selenium:
image: 'selenium/standalone-chrome'
volumes:
- '/dev/shm:/dev/shm'
networks:
- sail
然后,确保 docker-compose.yml 文件中的 laravel.test 服务 depends_on 配置项中包含 selenium:
depends_on:
- mysql
- redis
- selenium
最后, 你就可以通过如下 Sail dusk 命令运行 Dusk 测试用例了:
sail dusk
预览邮件
Laravel Sail 默认的 docker-compose.yml
文件还包括了一个服务条目 MailHog 。 该服务用于在本地开发期间拦截应用发送的所有邮件并提供一个 Web 界面在浏览器中预览这些邮件信息,方便测试和调试。MailHog 默认的 SMTP 端口号是 1025
:
MAIL_PORT=1025
当 Sail 运行时, 你可以通过 http://localhost:8025 访问 MailHog 的 Web 界面。
容器命令行
有时候,你可能想要在应用容器中开启一个 Bash 会话。 这时可以执行 shell
命令, 然后你就可以访问容器中的文件和已安装的服务了,同时还可以执行其他任意指令:
sail shell
想打开一个新的Laravel Tinker 会话, 你可以执行 tinker
命令:
sail tinker
PHP 版本
Sail 目前支持 PHP 8.0 或 PHP 7.4。更改 laravel.test
容器的 docker-compose.yml
文件的 build
字段来更新应用的 PHP 版本:
# PHP 8.0
context: ./vendor/laravel/sail/runtimes/8.0
# PHP 7.4
context: ./vendor/laravel/sail/runtimes/7.4
此外,你如果想更新你的镜像名称来反映当前应用的 PHP 版本,可以在 docker-compose.yml
文件中更改下面这个选项:
image: sail-8.0/app
在更新完 docker-compose.yml
后,你应该重启容器镜像:
sail build --no-cache
sail up
共享你的网站
如果你想将自己应用提供给同事预览或者在公网调试 webhook
,你可以使用 share
命令。运行该命令后,你将会得到一个随机的 laravel-sail.site
网址来访问你的应用。
sail share
如果你想自定义子域名,可以在 share
命令加上 subdomain
参数
sail share --subdomain=my-sail-site
技巧:
share
命令由 Expose 提供, 一个开源的网络隧道服务 BeyondCode 。
定制化
因为 Sail 采用 Docker 部署,所以你可以自定义它的任何内容。使用 sail:publish
命令可以发布 Sail 自己的 Dockerfile 。
sail artisan sail:publish
运行这个命令后,在你的项目根目录下会生成一个 docker
目录,里面包含有关你应用的 Dockerfile 和其他配置文件。如果你更新了配置,就需要采用下面的命令来重新构建容器:
sail build --no-cache