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 应用程序一起自动安装,因此你可以立即的开始使用它. 要了解如何创建一个新的 Laravel 应用程序,请查阅适合你目前操作系统的 安装文档。在安装过程中,你将被要求选择你的应用程序将与哪些 Sail 支持的服务进行交互。
安装 Sail 到当前应用中
假如你有兴趣在你现有的 Laravel 应用程序中使用 Sail,你可以透过 Composer 套件管理简单的安装 Sail。当然,这些步骤的前提是假设你现有的本地开发环境允许你安装 Copmoser 依赖:
composer require laravel/sail --dev
在 Sail 完成安装后,你可以运行 Artisan 命令 sail:install
。这个命令将会发布 Sail 的 docker-compose.yml
文件到你应用程序的根目录:
php artisan sail:install
最后,你可以启动 Sail 的服务了。想要继续学习如何使用 Sail,请接着阅读本文挡的其余部分:
./vendor/bin/sail up
使用开发容器
如果你想在 Devcontainer 中进行开发,你可以在执行 sail:install
命令时添加 --devcontainer
参数。--devcontainer
将指示 sail:install
命令将默认的 .devcontainer/devcontainer.json
文件发布到你的应用程 序根目录:
php artisan sail:install --devcontainer
配置 Bash 别名
默认情况下,Sail 命令使用 vendor/bin/sail
脚本调用,该脚本已包含在所有新建的 Laravel 应用程序中:
./vendor/bin/sail up
但与其重复的输入 vendor/bin/sail
来执行 Sail 命令,你可能会希望配置一个 Bash 别名方便你更容易的执行 Sail 命令:
alias sail='[ -f sail ] && bash sail || bash vendor/bin/sail'
补充:通过 vim ~/.bashrc
或 vim ~/.zshrc
加入别名,可以让别名常驻。
一旦配置了 Bash 别名,你可以通过简单的键入 sail
来执行 Sail 命令。本文接下来的示例都假定你已经配置了此别名:
sail up
启动 & 停止 Sail
Laravel Sail 的 docker-compose.yml
文件定义了各种 Docker 容器,它们可以协同工作以帮助你构建 Laravel 应用程序。每一个容器都定义在 docker-compose.yml
文件的 services
的配置内。 laravel.test
容器是将服务于你的应用程序的主要应用程序容器。
在开始 Sail 之前,你应该确认没有其他的网站服务器或数据库正运行在你的本地计算机上。要开始启用 docker-compose.yml
文件中定义的所有 Docker 容器,请执行 up
命令:
sail up
要在后 台启动所有 Docker 容器,你可以在「分离 (detached)」模式下启动 Sail:
sail up -d
启动应用程序的容器后,你可以通过 Web 浏览器中访问项目:http://localhost.
要停止所有容器,只需按下 Control + C
即可停止容器的执行。如果容器在后台运行,你可以使用 stop
命令:
sail stop
执行命令
使用 Laravel Sail 时,应用程序在 Docker 容器中执行,并且与本地计算机隔离。不过 Sail 提供了一种针对应用程序运行各种命令的便捷方法,例如任意的 PHP 命令,Artisan 命令,Composer 命令和 Node / NPM 命令。
当你阅读 Laravel 文档时,你可能经常看到在未使用 Sail 的状况下运行 Composer,Artisan 或是 Node / NPM 命令。 以下示例假设你已经在本地计算机上安装上述工具。如果你打算使用 Sail 建构你的本地开发环境 ,你需要改用 Sail 运行这些命令:
# 在本地运行 Artisan 命令...
php artisan queue:work
# 在 Laravel Sail 中运行 Artisan 命令...
sail artisan queue:work
执行 PHP 命令
PHP 命令可以使用 php
命令执行。当然,这些命令将使用为你的应用程序配置的 PHP 版本执行。要了解更多关于 PHP 版本可用的 Laravel Sail 信息,请查阅 PHP 版本文档:
sail php --version
sail php script.php
执行 Composer 命令
Composer 命令可以使用 composer
命令执行。Laravel Sail 的应用程序容器中已经安装 Composer 2.x:
sail composer require laravel/sanctum
在已运行的应用中安装 Composer 依赖
假如你与团队一起开发应用程序,你也许不是最初创建 Laravel 应用程序的人。因此,当你克隆应用程序的仓库到本地计算机后,仓库默认不会安装的任何 Composer 依赖项,也包括 Sail。
你可以进入到应用程序目录下并执行以下命令来安装应用所需的依赖,这个命令使用一个包含 PHP 与 Composer 的小型 Docker 容器进行应用程序依赖的安装:
docker run --rm \
-u "$(id -u):$(id -g)" \
-v $(pwd):/var/www/html \
-w /var/www/html \
laravelsail/php81-composer:latest \
composer install --ignore-platform-reqs
当你使用 laravelsail/phpXX-composer
镜像时,你应该选择和你的应用程序所用环境相同的 PHP 版本(74
、80
或 81
)。
执行 Artisan 命令
Artisan 命令可以使用 artisan
命令执行:
sail artisan queue:work
执行 Node / NPM 命令
Node 命令可以使用 node
命令执行,而 NPM 命令可以使用 npm
命令执行:
sail node --version
sail npm run prod
如果你愿意,你可以使用 Yarn 代替 NPM:
sail yarn
与数据库交互
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 数据库。
MeiliSearch
如果你在安装 Sail 时选择安装 MeiliSearch 服务,你的应用程序的 docker-compose.yml
文件将包含一个 Laravel Scout 兼容且强大的搜索引擎服务组件配置。启动容器后,你可以通过将环境变量 MEILISEARCH_HOST
设置为 http://meilisearch:7700
来连接到应用程序中的 MeiliSearch 实例。
要从本地计算机访问 MeiliSearch 的 Web 管理面板,你可以通过浏览器访问 http://localhost:7700
。
文件存储
如果你计划在生产环境中运行应用程序时使用 Amazon S3 存储文件,你可能希望在安装 Sail 时安装 MinIO 服务。 MinIO 提供了一个与 S3 兼容的 API,你可以使用 Laravel 的 s3
文件存储驱动程序在本地进行开发,而无需在生产 S3 环境中创建用于测试的存储桶。如果在安装 Sail 时选择安装 MinIO,部分 MinIO 相关的配置将添加到应用程序的 docker-compose.yml
文件中。
默认情况下,应用程序的 filesystems
配置文件已经包含 s3
磁盘的磁盘配置。除了使用此磁盘与 Amazon S3 交互之外,你还可以使用它与任何 S3 兼容的文件存储服务(例如 MinIO)进行交互,只需修改控制其配置的关联环境变量即可。例如,在使用 MinIO 时,你的文件系统环境变量配置应定义如下:
FILESYSTEM_DRIVER=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