简介
Docker是一个用于创建应用程序容器的工具。这些容器是用来包装应用程序的, 所以它们可以在任何环境(或操作系统)中顺利运行, 而不需要任何特殊的设置或配置.
Sail为你的Laravel应用程序提供了一个Docker开发环境。有了它, 你不需要为你的Laravel应用手动创建一个Docker容器.它将为你提供一个本地开发环境, 默认情况下包括PHP, MySQL, 和Redis, 尽管你可以选择你想要的特定服务.这意味着Laravel开发者不再需要在他们的操作系统上做任何特殊的配置(如安装PHP, MySQL, 本地服务器等)来开始构建Laravel应用。有了Sail, 他们就可以开始运行了.
Sail的另一个优势是,开发人员不需要担心在他们的系统上安装正确版本的配置软件。有了Sail容器, 如果因为兼容性问题而出现中断, 你可以简单地删除容器并创建一个新的容器, 所有的容器都远离你的本地环境, 不留下任何脚印。
如果你在一个项目上与其他开发者合作,Sail将使共享变得简单而直接,因为不需要考虑其他开发者使用的操作系统。
Sail是继Homestead,Valet,Laragon,Takeout,Laradock和Vessel等一长串Laravel开发环境的尝试之后。
整个软件包是由两个文件组成的: 一个是docker-compose.yml
文件, 它包含了你的应用程序的Docker容器, 一个是Sail脚本, 它为你提供了与这些容器交互的CLI.docker-compose.yml
文件位于你的项目的根目录下,而Sail脚本则位于你的vendor/bin目录下。
在这篇文章中, 我们将学习如何安装和利用Laravel Sail.我们将创建一个新的项目,并仔细研究一些基本的Sail命令。
先决条件
Sail的唯一要求是在它要运行的操作系统上安装Docker。
如果你使用Windows,你需要安装并启用Windows Subsystem for Linux 2(WSL2)。它将允许你在你的Windows操作系统上原生运行Linux二进制可执行文件。此外,确保配置Docker Desktop以使用WSL2后端。
否则,不需要任何Docker经验。
步骤1: 安装和配置Sail
每一个新的Laravel应用程序都有开箱即用的Sail。它只需要一个简单的命令来启动它。
运行下面的命令来创建一个新的Laravel应用。
curl -s https://laravel.build/new-sail-application | bash
上面的命令在一个新的目录下创建了项目,名为new-sail-application
。随意重命名为任何你想要的项目的名称.
接下来, 导航到项目目录:
cd new-sail-application
要启动Sail,运行以下命令。
./vendor/bin/sail up
将Sail添加到一个现有的应用程序中
你也可以使用Composer将Sail安装到现有的应用程序中,前提是你的本地开发环境已设置为使用它。
composer require laravel/sail --dev
安装完成后,你可以用以下命令在你的项目目录中发布Sail的docker-compose.yml
文件。
php artisan sail:install
最后,为了启动Sail,运行以下命令。
./vendor/bin/sail up
第2步:仔细观察你的应用程序
现在你的开发环境已经启动并运行了。在Docker中,每个容器只能容纳一个服务。这意味着我们的Sail应用有三个服务:一个是PHP,一个是MySQL,还有一个是Redis。
这三个容器由Docker Compose放置和管理,使用你项目根部的docker-compose.yml
文件。如果你打开这个文件,你会看到services
部分,其中有三个组件:laravel.test
、mysql
、redis
。
laravel.test
处理PHP组件,其他两个处理它们名字所暗示的内容。
在mySQL
服务(这个服务管理你的数据库)下,你会发现image
参数,它表示这个容器正在实例化的图像。基本上,图像就像房子的蓝图,而容器就是建造的房子本身。要安装的MySQL版本(8.0)也被指定。
mysql:
image: 'mysql:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- 'sailmysql:/var/lib/mysql'
networks:
- sail
healthcheck:
test: ["CMD", "mysqladmin", "ping"]
我们需要的所有镜像都来自Docker Hub,这是网络上最大的镜像库。它们带有一些文档,解释如何使用它们。在这里查看MySQL的文档。
ports
参数用于同步你的容器端口和本地端口。DB_PORT:-3306
是你的本地端口,${FORWARD_DB_PORT:-3306}:3306
行将它与你的容器的端口同步。
在environment
,你的数据库凭证被定义。它们目前是指向位于项目根目录下的.env
文件中的值。
Docker使用卷来保持(或保存)容器使用的数据(甚至在容器被销毁后)。将数据外部化或将数据保存在容器之外是很重要的,原因有很多。
容器,根据设计,被创建为临时性的。因此,当它们崩溃或停止时,它们持有的所有数据都会丢失。当数据被写入卷,而它所属的容器被终止时,数据仍然存在,因此可以被一个新的容器使用。持久数据也可以被不同机器上的多个容器共享。
行volumes: - 'sailmysql:/var/lib/mysql'
,只是使用一个名为sailmysql
的卷来保存var/lib/mysql
目录中的所有数据(这就是我们的MySQL数据的存储位置)。
我们容器上的所有服务都必须连接到同一个网络上才能一起工作。networks
参数指定了你的容器应该使用哪个内部网络,在这种情况下,sail
。
最后,healthcare
参数指定了Docker要运行的命令,以检查你的容器的健康状况,确保它按预期工作。
如果你仔细看一下laravel.test
服务,首先出现的参数是build
。它指向一个位于./vendor/laravel/sail/runtimes/8.0
的Dockerfile。这个Dockerfile是由Laravel团队创建的, 它包含了我们在这里需要的镜像的构建说明, 所以我们不会从Docker Hub实例化任何镜像:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.0
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.0/app
ports:
- '${APP_PORT:-80}:80'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
- redis
- selenium
image
参数指向要实例化的镜像.在这种情况下,由build
创建的镜像。ports
将我们的容器和本地端口映射在一起。environments
指向我们的PHP代码中使用的证书。volumes
用于保存我们不希望丢失的相关PHP数据,networks
指定这个服务应该连接的内部网络。
depends_on
参数指定了在我们的应用程序启动之前,哪些服务应该启动和运行。我们的应用程序依赖于mysql
,redis
,和selenium
。
最后一个服务,redis
,类似于mysql
服务。
redis:
image: 'redis:alpine'
ports:
- '${FORWARD_REDIS_PORT:-6379}:6379'
volumes:
- 'sailredis:/data'
networks:
- sail
healthcheck:
test: ["CMD", "redis-cli", "ping"]
首先,一个Redis镜像被实例化。然后我们的容器和本地端口被同步。我们使用一个卷来保存我们的Redis数据,定义这个服务应该连接的内部网络,并执行健康检查以确保我们的容器正常运行。
第3步 - 试用一些Sail命令
默认情况下,要运行Sail命令,行vendor/bin/sail
应该在命令之前。然而,我们可以配置一个只有一个字的bash别名,以使我们的命令更短。
基本上,我们将用一个词sail
来代替这一行vendor/bin/sail
。
alias sail='bash vendor/bin/sail'
为了运行我们的docker-compose.yml
文件中的所有容器并启动我们的应用程序,我们使用以下命令。
sail up
要在后台启动这些容器,我们使用。
sail up -d
一旦你的应用程序启动并运行,你可以访问http://localhost来查看它。
要停止这些容器,按键盘上的Control + C。如果它们在后台运行,那么就运行。
sail down
当运行artisan
,composer
, 和npm
命令时,sail
别名必须在命令之前。
例如,不要运行
php artisan migrate
你运行
sail artisan migrate
而不是运行
composer require laravel/sanctum
你要运行。
sail composer require laravel/sanctum
结语
你已经走到了本教程的最后!我们已经能够创建和设置一个新的Sail应用程序了。我们浏览了Sail的docker-compose.yml
文件,了解了容器是如何设置的。我们还学习了一些运行Sail应用程序的基本命令。但还有更多的东西需要了解!要了解更多关于Sail的信息,请查看这里的官方文档。
The postLaravel and Docker:使用Laravel Sail的指南首次出现在LogRocket博客上。