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文档时,您可能经常看到对ComposerArtisan,和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