Laravel Sail
- Introduction
- Installation and Setup
- Starting and Stopping Sail
- Executing Commands
- Interacting With Databases
- File Storage
- Running Tests
- Previewing Emails
- Container CLI
- PHP Versions
- Node Versions
- Sharing Your Site
- Debugging With Xdebug
- Customization
介绍
Laravel Sail是一个轻量级的命令行界面,用于与 Laravel 的默认 Docker 开发环境交互。Sail 为使用 PHP、MySQL 和 Redis 构建 Laravel 应用程序提供了一个良好的起点,无需任何 Docker 经验。
Sail 的核心是存储在项目根目录下的docker-compose.yml
文件和脚本。该脚本提供了一个 CLI,其中包含与文件定义的 Docker 容器交互的便捷方法。sail
sail
docker-compose.yml
Laravel Sail 在 macOS、Linux 和 Windows(通过WSL2)上受支持。
安装和设置
Laravel Sail 会自动随所有新的 Laravel 应用程序安装,因此您可以立即开始使用它。
将 Sail 安装到现有应用程序中
如果您有兴趣在现有的 Laravel 应用程序中使用 Sail,您可以直接使用 Composer 包管理器安装 Sail。当然,以下步骤假设您现有的本地开发环境允许您安装 Composer 依赖项:
1composer require laravel/sail --dev
安装 Sail 后,您可以运行sail:install
Artisan 命令。此命令会将 Sail 的docker-compose.yml
文件发布到应用程序的根目录,并.env
使用所需的环境变量修改文件,以便连接到 Docker 服务:
1php artisan sail:install
最后,您可以启动 Sail 了。要继续学习如何使用 Sail,请继续阅读本文档的其余部分:
1./vendor/bin/sail up
如果您正在使用适用于 Linux 的 Docker Desktop,则应default
通过执行以下命令来使用 Docker 上下文:docker context use default
。
添加附加服务
如果您想在现有的 Sail 安装中添加附加服务,您可以运行sail:add
Artisan 命令:
1php artisan sail:add
使用 Devcontainers
如果您想在Devcontainer中进行开发,可以--devcontainer
向sail:install
命令提供选项。该--devcontainer
选项将指示sail:install
命令将默认文件发布.devcontainer/devcontainer.json
到应用程序的根目录:
1php artisan sail:install --devcontainer
重建Sail船图像
有时,您可能需要完全重建 Sail 镜像,以确保镜像中的所有软件包和软件都是最新的。您可以使用以下build
命令完成此操作:
1docker compose down -v2 3sail build --no-cache4 5sail up
配置 Shell 别名
vendor/bin/sail
默认情况下,使用所有新 Laravel 应用程序附带的脚本调用 Sail 命令:
1./vendor/bin/sail up
vendor/bin/sail
但是,您可能希望配置一个 shell 别名,以便更轻松地执行 Sail 的命令,而不是重复键入以执行 Sail 命令:
1alias sail='sh $([ -f sail ] && echo sail || echo vendor/bin/sail)'
为了确保它始终可用,您可以将其添加到主目录中的 shell 配置文件中,例如~/.zshrc
或~/.bashrc
,然后重新启动 shell。
配置好 shell 别名后,只需输入 即可执行 Sail 命令sail
。本文档的其余示例都假定您已配置此别名:
1sail up
启航和停航
Laravel Sail 的docker-compose.yml
文件定义了各种 Docker 容器,它们协同工作以帮助您构建 Laravel 应用程序。每个容器都是文件services
配置中的一个条目docker-compose.yml
。laravel.test
容器是将为您的应用程序提供服务的主要应用程序容器。
在启动 Sail 之前,请确保本地计算机上没有运行其他 Web 服务器或数据库。要启动应用程序文件中定义的所有 Docker 容器docker-compose.yml
,请执行以下up
命令:
1sail up
要在后台启动所有 Docker 容器,您可以以“分离”模式启动 Sail:
1sail up -d
应用程序的容器启动后,您可以通过 Web 浏览器访问该项目:http://localhost。
要停止所有容器,只需按 Control + C 即可停止容器的执行。或者,如果容器在后台运行,可以使用以下stop
命令:
1sail stop
执行命令
使用 Laravel Sail 时,您的应用程序将在 Docker 容器中执行,并且与您的本地计算机隔离。然而,Sail 提供了一种便捷的方式,可以针对您的应用程序运行各种命令,例如任意 PHP 命令、Artisan 命令、Composer 命令以及 Node / NPM 命令。
阅读 Laravel 文档时,您经常会看到一些引用 Composer、Artisan 和 Node/NPM 命令的命令,但这些命令并未引用 Sail。这些示例假设这些工具已安装在您的本地计算机上。如果您在本地 Laravel 开发环境中使用 Sail,则应使用 Sail 执行这些命令:
1# Running Artisan commands locally...2php artisan queue:work3 4# Running Artisan commands within Laravel Sail...5sail artisan queue:work
执行 PHP 命令
可以使用该命令执行 PHP 命令php
。当然,这些命令将使用为您的应用程序配置的 PHP 版本执行。要了解有关 Laravel Sail 可用的 PHP 版本的更多信息,请参阅PHP 版本文档:
1sail php --version2 3sail php script.php
执行 Composer 命令
可以使用该命令执行 Composer 命令composer
。Laravel Sail 的应用程序容器包含一个 Composer 安装:
1sail composer require laravel/sanctum
执行 Artisan 命令
可以使用以下命令执行 Laravel Artisan 命令artisan
:
1sail artisan queue:work
执行 Node / NPM 命令
Node 命令可以使用以下命令执行,node
而 NPM 命令可以使用以下命令执行npm
:
1sail node --version2 3sail npm run dev
如果你愿意,你可以使用 Yarn 代替 NPM:
1sail yarn
与数据库交互
MySQL
你可能已经注意到,你的应用程序docker-compose.yml
文件包含一个 MySQL 容器的条目。该容器使用Docker 卷,这样即使停止并重新启动容器,数据库中存储的数据也会保留下来。
此外,MySQL 容器首次启动时,它会为您创建两个数据库。第一个数据库使用您的DB_DATABASE
环境变量值命名,用于本地开发。第二个数据库是专用的测试数据库,名为testing
,用于确保您的测试不会干扰您的开发数据。
一旦启动了容器,您就可以通过将应用程序文件DB_HOST
中的环境变量设置为来连接到应用程序中的 MySQL 实例。.env
mysql
要从本地计算机连接到应用程序的 MySQL 数据库,您可以使用图形数据库管理应用程序(例如TablePlus )。默认情况下,MySQL 数据库可通过端口 3306 访问,访问凭据与localhost
您的环境变量值相对应。或者,您可以以用户身份连接,这也会使用环境变量的值作为密码。DB_USERNAME
DB_PASSWORD
root
DB_PASSWORD
MongoDB
如果您在安装 Sail 时选择安装MongoDB服务,则应用程序文件将包含一个MongoDB Atlas Localdocker-compose.yml
容器的条目,该容器为 MongoDB 文档数据库提供 Atlas 功能,例如搜索索引。此容器使用Docker 卷,以便即使在停止和重新启动容器时,存储在数据库中的数据也会保留下来。
启动容器后,您可以通过将应用程序文件MONGODB_URI
中的环境变量设置为 来连接到应用程序中的 MongoDB 实例。默认情况下,身份验证是禁用的,但您可以在启动容器之前设置和环境变量以启用身份验证。然后,将凭据添加到连接字符串:.env
mongodb://mongodb:27017
MONGODB_USERNAME
MONGODB_PASSWORD
mongodb
1MONGODB_USERNAME=user2MONGODB_PASSWORD=laravel3MONGODB_URI=mongodb://${MONGODB_USERNAME}:${MONGODB_PASSWORD}@mongodb:27017
为了将 MongoDB 与您的应用程序无缝集成,您可以安装MongoDB 维护的官方包。
要从本地计算机连接到应用程序的 MongoDB 数据库,可以使用图形界面(例如Compass )localhost
。默认情况下,可以通过端口访问 MongoDB 数据库27017
。
Redis
您的应用程序文件还包含一个Redisdocker-compose.yml
容器的条目。此容器使用Docker 卷,因此即使停止并重新启动容器,存储在 Redis 实例中的数据也会保留下来。启动容器后,您可以通过将应用程序文件中的环境变量设置为 来连接到应用程序中的 Redis 实例。REDIS_HOST
.env
redis
要从本地计算机连接到应用程序的 Redis 数据库,可以使用图形数据库管理应用程序(例如TablePlus )。默认情况下,Redis 数据库可通过localhost
端口 6379 访问。
瓦尔基
如果您在安装 Sail 时选择安装 Valkey 服务,则应用程序文件将包含Valkeydocker-compose.yml
的条目。此容器使用Docker 卷,以便即使在停止和重新启动容器时,存储在 Valkey 实例中的数据也能保留。您可以通过将应用程序文件中的环境变量设置为 来连接到此容器。REDIS_HOST
.env
valkey
要从本地计算机连接到应用程序的 Valkey 数据库,可以使用图形数据库管理应用程序(例如TablePlus )。默认情况下,Valkey 数据库可通过localhost
端口 6379 访问。
美丽搜索
如果您在安装 Sail 时选择安装Meilisearch服务,您的应用程序文件将包含一个与Laravel Scoutdocker-compose.yml
集成的强大搜索引擎的条目。启动容器后,您可以通过将环境变量设置为 来连接到应用程序中的 Meilisearch 实例。MEILISEARCH_HOST
http://meilisearch:7700
您可以从本地计算机通过http://localhost:7700
Web 浏览器访问 Meilisearch 的基于 Web 的管理面板。
Typesense
如果您在安装 Sail 时选择安装Typesense服务,则应用程序docker-compose.yml
文件将包含此快速开源搜索引擎的条目,该搜索引擎与Laravel Scout原生集成。启动容器后,您可以通过设置以下环境变量连接到应用程序中的 Typesense 实例:
1TYPESENSE_HOST=typesense2TYPESENSE_PORT=81083TYPESENSE_PROTOCOL=http4TYPESENSE_API_KEY=xyz
您可以从本地机器通过访问 Typesense 的 API http://localhost:8108
。
文件存储
如果您计划在生产环境中运行应用程序时使用 Amazon S3 存储文件,则可能需要在安装 Sail 时安装MinIO服务。MinIO 提供了兼容 S3 的 API,您可以使用 Laravel 的s3
文件存储驱动程序进行本地开发,而无需在生产 S3 环境中创建“测试”存储桶。如果您选择在安装 Sail 时安装 MinIO,则 MinIO 配置部分将添加到应用程序的docker-compose.yml
文件中。
默认情况下,应用程序的filesystems
配置文件已包含该磁盘的磁盘配置s3
。除了使用此磁盘与 Amazon S3 交互之外,您还可以通过修改控制其配置的相关环境变量,使用它与任何兼容 S3 的文件存储服务(例如 MinIO)进行交互。例如,使用 MinIO 时,您的文件系统环境变量配置应定义如下:
1FILESYSTEM_DISK=s32AWS_ACCESS_KEY_ID=sail3AWS_SECRET_ACCESS_KEY=password4AWS_DEFAULT_REGION=us-east-15AWS_BUCKET=local6AWS_ENDPOINT=http://minio:90007AWS_USE_PATH_STYLE_ENDPOINT=true
为了使 Laravel 的 Flysystem 集成在使用 MinIO 时生成正确的 URL,您应该定义AWS_URL
环境变量,使其与应用程序的本地 URL 匹配,并在 URL 路径中包含存储桶名称:
1AWS_URL=http://localhost:9000/local
您可以通过 MinIO 控制台创建 bucket,该控制台位于http://localhost:8900
。MinIO 控制台的默认用户名是sail
,默认密码是password
。
temporaryUrl
使用 MinIO 时不支持
通过该方法生成临时存储 URL 。
运行测试
Laravel 提供了出色的开箱即用测试支持,您可以使用 Sail 的test
命令来运行应用程序的功能和单元测试。任何 Pest / PHPUnit 接受的 CLI 选项也可以传递给该test
命令:
1sail test2 3sail test --group orders
Sailtest
命令相当于运行test
Artisan 命令:
1sail artisan test
默认情况下,Sail 会创建一个专用testing
数据库,这样你的测试就不会干扰数据库的当前状态。在默认的 Laravel 安装中,Sail 还会将你的配置phpunit.xml
文件配置为在执行测试时使用此数据库:
1<env name="DB_DATABASE" value="testing"/>
Laravel Dusk
Laravel Dusk提供了一套简洁易用的浏览器自动化测试 API。借助 Sail,您无需在本地计算机上安装 Selenium 或其他工具即可运行这些测试。首先,在应用程序docker-compose.yml
文件中取消注释 Selenium 服务:
1selenium:2 image: 'selenium/standalone-chrome'3 extra_hosts:4 - 'host.docker.internal:host-gateway'5 volumes:6 - '/dev/shm:/dev/shm'7 networks:8 - sail
接下来,确保laravel.test
应用程序docker-compose.yml
文件中的服务具有以下depends_on
条目selenium
:
1depends_on:2 - mysql3 - redis4 - selenium
最后,您可以通过启动 Sail 并运行以下命令来运行 Dusk 测试套件dusk
:
1sail dusk
Apple Silicon 上的 Selenium
如果您的本地机器包含 Apple Silicon 芯片,则您的selenium
服务必须使用以下selenium/standalone-chromium
映像:
1selenium:2 image: 'selenium/standalone-chromium'3 extra_hosts:4 - 'host.docker.internal:host-gateway'5 volumes:6 - '/dev/shm:/dev/shm'7 networks:8 - sail
预览电子邮件
Laravel Sail 的默认文件包含Mailpitdocker-compose.yml
的服务入口。Mailpit 会在本地开发期间拦截应用程序发送的邮件,并提供便捷的 Web 界面,方便您在浏览器中预览邮件内容。使用 Sail 时,Mailpit 的默认主机是,可通过端口 1025 访问:mailpit
1MAIL_HOST=mailpit2MAIL_PORT=10253MAIL_ENCRYPTION=null
当 Sail 运行时,您可以通过以下网址访问 Mailpit 网页界面:http://localhost:8025
容器 CLI
有时你可能希望在应用程序的容器内启动一个 Bash 会话。你可以使用以下shell
命令连接到应用程序的容器,从而检查其文件和已安装的服务,并在容器内执行任意 shell 命令:
1sail shell2 3sail root-shell
要启动新的Laravel Tinker会话,您可以执行以下tinker
命令:
1sail tinker
PHP 版本
Sail 目前支持通过 PHP 8.4、8.3、8.2、8.1 或 PHP 8.0 为您的应用程序提供服务。Sail 默认使用的 PHP 版本是 PHP 8.4。要更改用于服务应用程序的 PHP 版本,您需要更新应用程序文件中容器build
的定义:laravel.test
docker-compose.yml
1# PHP 8.4 2context: ./vendor/laravel/sail/runtimes/8.4 3 4# PHP 8.3 5context: ./vendor/laravel/sail/runtimes/8.3 6 7# PHP 8.2 8context: ./vendor/laravel/sail/runtimes/8.2 9 10# PHP 8.111context: ./vendor/laravel/sail/runtimes/8.112 13# PHP 8.014context: ./vendor/laravel/sail/runtimes/8.0
此外,您可能希望更新您的image
名称,以反映应用程序所使用的 PHP 版本。此选项也定义在您的应用程序docker-compose.yml
文件中:
1image: sail-8.2/app
更新应用程序docker-compose.yml
文件后,您应该重建容器镜像:
1sail build --no-cache2 3sail up
Node 版本
Sail 默认安装 Node 22。要更改构建镜像时安装的 Node 版本,您可以更新应用程序文件中的服务build.args
定义:laravel.test
docker-compose.yml
1build:2 args:3 WWWGROUP: '${WWWGROUP}'4 NODE_VERSION: '18'
更新应用程序docker-compose.yml
文件后,您应该重建容器镜像:
1sail build --no-cache2 3sail up
共享您的网站
有时您可能需要公开共享您的网站,以便同事预览您的网站,或测试与您的应用程序的 Webhook 集成。要共享您的网站,您可以使用以下share
命令。执行此命令后,您将获得一个随机laravel-sail.site
URL,您可以使用该 URL 访问您的应用程序:
1sail share
通过命令共享网站时,您应该使用应用程序文件中的中间件方法share
配置应用程序的受信任代理。否则,URL 生成Helpers(例如和 )将无法确定在 URL 生成过程中应使用的正确 HTTP 主机:trustProxies
bootstrap/app.php
url
route
1->withMiddleware(function (Middleware $middleware) {2 $middleware->trustProxies(at: '*');3})
如果您想为共享站点选择子域,您可以subdomain
在执行share
命令时提供选项:
1sail share --subdomain=my-sail-site
该命令由BeyondCode的开源隧道服务Exposeshare
提供支持。
使用 Xdebug 进行调试
Laravel Sail 的 Docker 配置包含对Xdebug的支持,Xdebug 是一款流行且功能强大的 PHP 调试器。要启用 Xdebug,请确保已发布 Sail 配置。然后,将以下变量添加到应用程序的.env
文件中以配置 Xdebug:
1SAIL_XDEBUG_MODE=develop,debug,coverage
接下来,确保发布的php.ini
文件包含以下配置,以便在指定模式下激活 Xdebug:
1[xdebug]2xdebug.mode=${XDEBUG_MODE}
修改php.ini
文件后,请记住重建 Docker 镜像,以便对php.ini
文件的更改生效:
1sail build --no-cache
Linux 主机 IP 配置
在内部,XDEBUG_CONFIG
环境变量定义为,client_host=host.docker.internal
以便 Xdebug 能够针对 Mac 和 Windows (WSL2) 进行正确配置。如果您的本地计算机运行的是 Linux,并且您使用的是 Docker 20.10+,host.docker.internal
则可用,无需手动配置。
对于 20.10 之前的 Docker 版本,host.docker.internal
Linux 上不支持,您需要手动定义主机 IP。为此,请在docker-compose.yml
文件中定义自定义网络,为容器配置静态 IP:
1networks: 2 custom_network: 3 ipam: 4 config: 5 - subnet: 172.20.0.0/16 6 7services: 8 laravel.test: 9 networks:10 custom_network:11 ipv4_address: 172.20.0.2
设置静态 IP 后,在应用程序的 .env 文件中定义 SAIL_XDEBUG_CONFIG 变量:
1SAIL_XDEBUG_CONFIG="client_host=172.20.0.2"
Xdebug CLI 使用
sail debug
运行 Artisan 命令时,可以使用命令来启动调试会话:
1# Run an Artisan command without Xdebug...2sail artisan migrate3 4# Run an Artisan command with Xdebug...5sail debug migrate
Xdebug 浏览器使用
要在通过 Web 浏览器与应用程序交互时调试应用程序,请按照Xdebug 提供的说明从 Web 浏览器启动 Xdebug 会话。
如果您正在使用 PhpStorm,请查看 JetBrains 关于零配置调试的文档。
Laravel Sail 依赖它来artisan serve
为您的应用程序提供服务。该artisan serve
命令仅接受Laravel 8.53.0 及以上版本的XDEBUG_CONFIG
和XDEBUG_MODE
变量。旧版本的 Laravel(8.52.0 及以下版本)不支持这些变量,并且不接受调试连接。
定制
由于 Sail 本身就是 Docker,因此您可以自由地自定义几乎所有内容。要发布 Sail 自己的 Dockerfile,您可以执行以下sail:publish
命令:
1sail artisan sail:publish
运行此命令后,Laravel Sail 使用的 Dockerfile 和其他配置文件将被放置在docker
应用程序根目录下的一个目录中。自定义 Sail 安装后,您可能希望在应用程序docker-compose.yml
文件中更改应用程序容器的镜像名称。完成后,使用以下build
命令重建应用程序的容器。如果您使用 Sail 在一台机器上开发多个 Laravel 应用程序,则为应用程序镜像分配一个唯一的名称尤为重要:
1sail build --no-cache