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 Sail 会自动安装在所有新的 Laravel 应用中,因此您可以立即开始使用它。
在现有应用中安装 Sail
如果您希望在现有的 Laravel 应用中使用 Sail,可以简单地使用 Composer 包管理器安装 Sail。当然,这些步骤假设您的现有本地开发环境允许您安装 Composer 依赖:
composer require laravel/sail --dev
安装 Sail 后,您可以运行 sail:install
Artisan 命令。此命令将 Sail 的 docker-compose.yml
文件发布到应用的根目录,并修改 .env
文件以连接到 Docker 服务所需的环境变量:
php artisan sail:install
最后,您可以启动 Sail。要继续学习如何使用 Sail,请继续阅读本文档的其余部分:
./vendor/bin/sail up
WARNING
如果您使用的是 Docker Desktop for Linux,您应该通过执行以下命令来使用 default
Docker 上下文:docker context use default
。
添加额外服务
如果您希望向现有的 Sail 安装中添加额外的服务,可以运行 sail:add
Artisan 命令:
php artisan sail:add
使用 Devcontainers
如果您希望在 Devcontainer 中进行开发,可以为 sail:install
命令提供 --devcontainer
选项。--devcontainer
选项将指示 sail:install
命令将默认的 .devcontainer/devcontainer.json
文件发布到应用的根目录:
php artisan sail:install --devcontainer
重建 Sail 镜像
有时您可能希望完全重建 Sail 镜像,以确保镜像的所有软件包和软件都是最新的。您可以使用 build
命令完成此操作:
docker compose down -v
sail build --no-cache
sail up
配置 Shell 别名
默认情况下,Sail 命令是通过包含在所有新 Laravel 应用中的 vendor/bin/sail
脚本调用的:
./vendor/bin/sail up
然而,您可能希望配置一个 shell 别名,以便更轻松地执行 Sail 的命令,而不是反复输入 vendor/bin/sail
:
alias sail='sh $([ -f sail ] && echo sail || echo vendor/bin/sail)'
为了确保它始终可用,您可以将其添加到主目录中的 shell 配置文件中,例如 ~/.zshrc
或 ~/.bashrc
,然后重启 shell。
一旦配置了 shell 别名,您可以通过简单地输入 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 停止容器的执行。或者,如果容器在后台运行,您可以使用 stop
命令:
sail stop
执行命令
使用 Laravel Sail 时,您的应用在 Docker 容器中执行,与本地计算机隔离。然而,Sail 提供了一种方便的方法来对应用执行各种命令,例如任意 PHP 命令、Artisan 命令、Composer 命令和 Node / NPM 命令。
在阅读 Laravel 文档时,您经常会看到引用 Composer、Artisan 和 Node / NPM 命令的示例,这些示例不引用 Sail。 这些示例假设这些工具已安装在本地计算机上。如果您使用 Sail 作为本地 Laravel 开发环境,您应该使用 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 安装:
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 dev
如果您愿意,可以使用 Yarn 而不是 NPM:
sail yarn
与数据库交互
MySQL
如您所见,应用的 docker-compose.yml
文件包含一个 MySQL 容器的条目。此容器使用 Docker 卷,以便即使在停止和重启容器时,数据库中存储的数据也能持久化。
此外,MySQL 容器首次启动时,将为您创建两个数据库。第一个数据库使用 DB_DATABASE
环境变量的值命名,用于本地开发。第二个是名为 testing
的专用测试数据库,确保您的测试不会干扰开发数据。
启动容器后,您可以通过将应用的 .env
文件中的 DB_HOST
环境变量设置为 mysql
来连接到应用的 MySQL 实例。
要从本地计算机连接到应用的 MySQL 数据库,可以使用图形数据库管理应用程序,例如 TablePlus。默认情况下,MySQL 数据库可通过 localhost
端口 3306 访问,访问凭据对应于 DB_USERNAME
和 DB_PASSWORD
环境变量的值。或者,您可以以 root
用户身份连接,该用户也使用 DB_PASSWORD
环境变量的值作为密码。
MongoDB
如果您选择在安装 Sail 时安装 MongoDB 服务,应用的 docker-compose.yml
文件将包含一个 MongoDB Atlas Local 容器的条目,该容器提供带有 Atlas 功能(如 搜索索引)的 MongoDB 文档数据库。此容器使用 Docker 卷,以便即使在停止和重启容器时,数据库中存储的数据也能持久化。
启动容器后,您可以通过将应用的 .env
文件中的 MONGODB_URI
环境变量设置为 mongodb://mongodb:27017
来连接到应用的 MongoDB 实例。默认情况下禁用身份验证,但您可以在启动 mongodb
容器之前设置 MONGODB_USERNAME
和 MONGODB_PASSWORD
环境变量以启用身份验证。然后,将凭据添加到连接字符串中:
MONGODB_USERNAME=user
MONGODB_PASSWORD=laravel
MONGODB_URI=mongodb://${MONGODB_USERNAME}:${MONGODB_PASSWORD}@mongodb:27017
为了与应用无缝集成 MongoDB,您可以安装 MongoDB 官方维护的包。
要从本地计算机连接到应用的 MongoDB 数据库,可以使用图形界面,例如 Compass。默认情况下,MongoDB 数据库可通过 localhost
端口 27017
访问。
Redis
应用的 docker-compose.yml
文件还包含一个 Redis 容器的条目。此容器使用 Docker 卷,以便即使在停止和重启容器时,Redis 实例中存储的数据也能持久化。启动容器后,您可以通过将应用的 .env
文件中的 REDIS_HOST
环境变量设置为 redis
来连接到应用的 Redis 实例。
要从本地计算机连接到应用的 Redis 数据库,可以使用图形数据库管理应用程序,例如 TablePlus。默认情况下,Redis 数据库可通过 localhost
端口 6379 访问。
Valkey
如果您选择在安装 Sail 时安装 Valkey 服务,应用的 docker-compose.yml
文件将包含 Valkey 的条目。此容器使用 Docker 卷,以便即使在停止和重启容器时,Valkey 实例中存储的数据也能持久化。您可以通过将应用的 .env
文件中的 REDIS_HOST
环境变量设置为 valkey
来连接到此容器。
要从本地计算机连接到应用的 Valkey 数据库,可以使用图形数据库管理应用程序,例如 TablePlus。默认情况下,Valkey 数据库可通过 localhost
端口 6379 访问。
Meilisearch
如果您选择在安装 Sail 时安装 Meilisearch 服务,应用的 docker-compose.yml
文件将包含此强大搜索引擎的条目,该引擎与 Laravel Scout 集成。启动容器后,您可以通过将 MEILISEARCH_HOST
环境变量设置为 http://meilisearch:7700
来连接到应用的 Meilisearch 实例。
从本地计算机,您可以通过在 Web 浏览器中导航到 http://localhost:7700
访问 Meilisearch 的基于 Web 的管理面板。
Typesense
如果您选择在安装 Sail 时安装 Typesense 服务,应用的 docker-compose.yml
文件将包含此开源搜索引擎的条目,该引擎与 Laravel Scout 原生集成。启动容器后,您可以通过设置以下环境变量来连接到应用的 Typesense 实例:
TYPESENSE_HOST=typesense
TYPESENSE_PORT=8108
TYPESENSE_PROTOCOL=http
TYPESENSE_API_KEY=xyz
从本地计算机,您可以通过 http://localhost:8108
访问 Typesense 的 API。
文件存储
如果您计划在生产环境中使用 Amazon S3 存储文件,您可能希望在安装 Sail 时安装 MinIO 服务。MinIO 提供了一个 S3 兼容的 API,您可以使用它在本地开发时使用 Laravel 的 s3
文件存储驱动,而无需在生产 S3 环境中创建“测试”存储桶。如果您在安装 Sail 时选择安装 MinIO,应用的 docker-compose.yml
文件中将添加一个 MinIO 配置部分。
默认情况下,应用的 filesystems
配置文件已经包含 s3
磁盘的配置。除了使用此磁盘与 Amazon S3 交互外,您还可以通过简单地修改控制其配置的相关环境变量来与任何 S3 兼容的文件存储服务(如 MinIO)交互。例如,使用 MinIO 时,文件系统环境变量配置应定义如下:
FILESYSTEM_DISK=s3
AWS_ACCESS_KEY_ID=sail
AWS_SECRET_ACCESS_KEY=password
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=local
AWS_ENDPOINT=http://minio:9000
AWS_USE_PATH_STYLE_ENDPOINT=true
为了在使用 MinIO 时生成正确的 URL,您应该定义 AWS_URL
环境变量,以便它与应用的本地 URL 匹配,并在 URL 路径中包含存储桶名称:
AWS_URL=http://localhost:9000/local
您可以通过 MinIO 控制台创建存储桶,该控制台可通过 http://localhost:8900
访问。MinIO 控制台的默认用户名为 sail
,默认密码为 password
。
WARNING
使用 temporaryUrl
方法生成临时存储 URL 时不支持 MinIO。
运行测试
Laravel 提供了出色的测试支持,您可以使用 Sail 的 test
命令运行应用的 功能和单元测试。Pest / PHPUnit 接受的任何 CLI 选项也可以传递给 test
命令:
sail test
sail test --group orders
Sail test
命令等同于运行 test
Artisan 命令:
sail artisan test
默认情况下,Sail 将创建一个专用的 testing
数据库,以确保您的测试不会干扰数据库的当前状态。在默认的 Laravel 安装中,Sail 还将配置 phpunit.xml
文件,以便在执行测试时使用此数据库:
<env name="DB_DATABASE" value="testing"/>
Laravel Dusk
Laravel Dusk 提供了一种表达性强、易于使用的浏览器自动化和测试 API。感谢 Sail,您可以在本地计算机上无需安装 Selenium 或其他工具即可运行这些测试。要开始,请取消注释应用的 docker-compose.yml
文件中的 Selenium 服务:
selenium:
image: 'selenium/standalone-chrome'
extra_hosts:
- 'host.docker.internal:host-gateway'
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
Apple Silicon 上的 Selenium
如果您的本地计算机包含 Apple Silicon 芯片,您的 selenium
服务必须使用 selenium/standalone-chromium
镜像:
selenium:
image: 'selenium/standalone-chromium'
extra_hosts:
- 'host.docker.internal:host-gateway'
volumes:
- '/dev/shm:/dev/shm'
networks:
- sail
预览邮件
Laravel Sail 的默认 docker-compose.yml
文件包含 Mailpit 服务条目。Mailpit 拦截应用在本地开发期间发送的电子邮件,并提供一个方便的 Web 界面,以便您可以在浏览器中预览电子邮件消息。使用 Sail 时,Mailpit 的默认主机为 mailpit
,可通过端口 1025 访问:
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_ENCRYPTION=null
当 Sail 运行时,您可以通过 http://localhost:8025 访问 Mailpit Web 界面。
容器 CLI
有时您可能希望在应用的容器中启动一个 Bash 会话。您可以使用 shell
命令连接到应用的容器,允许您检查其文件和已安装的服务,并在容器中执行任意 shell 命令:
sail shell
sail root-shell
要启动新的 Laravel Tinker 会话,您可以执行 tinker
命令:
sail tinker
PHP 版本
Sail 目前支持通过 PHP 8.4、8.3、8.2、8.1 或 PHP 8.0 提供应用服务。Sail 使用的默认 PHP 版本目前是 PHP 8.4。要更改用于提供应用服务的 PHP 版本,您应该更新应用的 docker-compose.yml
文件中 laravel.test
容器的 build
定义:
# PHP 8.4
context: ./vendor/laravel/sail/runtimes/8.4
# PHP 8.3
context: ./vendor/laravel/sail/runtimes/8.3
# PHP 8.2
context: ./vendor/laravel/sail/runtimes/8.2
# PHP 8.1
context: ./vendor/laravel/sail/runtimes/8.1
# PHP 8.0
context: ./vendor/laravel/sail/runtimes/8.0
此外,您可能希望更新 image
名称以反映应用使用的 PHP 版本。此选项也在应用的 docker-compose.yml
文件中定义:
image: sail-8.2/app
更新应用的 docker-compose.yml
文件后,您应该重建容器镜像:
sail build --no-cache
sail up
Node 版本
Sail 默认安装 Node 20。要更改构建镜像时安装的 Node 版本,您可以更新应用的 docker-compose.yml
文件中 laravel.test
服务的 build.args
定义:
build:
args:
WWWGROUP: '${WWWGROUP}'
NODE_VERSION: '18'
更新应用的 docker-compose.yml
文件后,您应该重建容器镜像:
sail build --no-cache
sail up
分享您的网站
有时您可能需要公开分享您的网站,以便为同事预览您的网站或测试与应用的 Webhook 集成。要分享您的网站,您可以使用 share
命令。执行此命令后,您将获得一个随机的 laravel-sail.site
URL,您可以使用该 URL 访问您的应用:
sail share
通过 share
命令分享您的网站时,您应该使用应用的 bootstrap/app.php
文件中的 trustProxies
中间件方法配置应用的受信代理。否则,URL 生成助手(如 url
和 route
)将无法确定在 URL 生成期间应使用的正确 HTTP 主机:
->withMiddleware(function (Middleware $middleware) {
$middleware->trustProxies(at: '*');
})
如果您希望选择共享网站的子域,可以在执行 share
命令时提供 subdomain
选项:
sail share --subdomain=my-sail-site
NOTE
share
命令由 Expose 提供支持,这是 BeyondCode 的开源隧道服务。
使用 Xdebug 调试
Laravel Sail 的 Docker 配置包括对 Xdebug 的支持,这是一个流行且强大的 PHP 调试器。要启用 Xdebug,请确保您已 发布 Sail 配置。然后,将以下变量添加到应用的 .env
文件中以配置 Xdebug:
SAIL_XDEBUG_MODE=develop,debug,coverage
接下来,确保已发布的 php.ini
文件包含以下配置,以便在指定模式下激活 Xdebug:
[xdebug]
xdebug.mode=${XDEBUG_MODE}
修改 php.ini
文件后,请记得重建 Docker 镜像,以便 php.ini
文件的更改生效:
sail 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:
networks:
custom_network:
ipam:
config:
- subnet: 172.20.0.0/16
services:
laravel.test:
networks:
custom_network:
ipv4_address: 172.20.0.2
设置静态 IP 后,在应用的 .env 文件中定义 SAIL_XDEBUG_CONFIG 变量:
SAIL_XDEBUG_CONFIG="client_host=172.20.0.2"
Xdebug CLI 使用
可以使用 sail debug
命令在运行 Artisan 命令时启动调试会话:
# 在没有 Xdebug 的情况下运行 Artisan 命令...
sail artisan migrate
# 在有 Xdebug 的情况下运行 Artisan 命令...
sail debug migrate
Xdebug 浏览器使用
要在通过 Web 浏览器与应用交互时调试应用,请按照 Xdebug 提供的说明 启动 Xdebug 会话。
如果您使用的是 PhpStorm,请查看 JetBrains 的文档,了解 零配置调试。
WARNING
Laravel Sail 依赖于 artisan serve
来提供应用服务。artisan serve
命令仅接受 XDEBUG_CONFIG
和 XDEBUG_MODE
变量(自 Laravel 版本 8.53.0 起)。旧版本的 Laravel(8.52.0 及以下)不支持这些变量,也不接受调试连接。
自定义
由于 Sail 只是 Docker,您可以自由地自定义几乎所有内容。要发布 Sail 自己的 Dockerfiles,您可以执行 sail:publish
命令:
sail artisan sail:publish
运行此命令后,Laravel Sail 使用的 Dockerfiles 和其他配置文件将放置在应用根目录的 docker
目录中。自定义 Sail 安装后,您可能希望更改应用的 docker-compose.yml
文件中应用容器的镜像名称。完成后,使用 build
命令重建应用的容器。在单台计算机上使用 Sail 开发多个 Laravel 应用时,为应用镜像分配唯一名称尤为重要:
sail build --no-cache