Laravel和Docker:使用Laravel Sail的指南

2,018 阅读7分钟

简介

Docker是一个用于创建应用程序容器的工具。这些容器是用来包装应用程序的, 所以它们可以在任何环境(或操作系统)中顺利运行, 而不需要任何特殊的设置或配置.

Sail为你的Laravel应用程序提供了一个Docker开发环境。有了它, 你不需要为你的Laravel应用手动创建一个Docker容器.它将为你提供一个本地开发环境, 默认情况下包括PHP, MySQL, 和Redis, 尽管你可以选择你想要的特定服务.这意味着Laravel开发者不再需要在他们的操作系统上做任何特殊的配置(如安装PHP, MySQL, 本地服务器等)来开始构建Laravel应用。有了Sail, 他们就可以开始运行了.

Sail的另一个优势是,开发人员不需要担心在他们的系统上安装正确版本的配置软件。有了Sail容器, 如果因为兼容性问题而出现中断, 你可以简单地删除容器并创建一个新的容器, 所有的容器都远离你的本地环境, 不留下任何脚印。

如果你在一个项目上与其他开发者合作,Sail将使共享变得简单而直接,因为不需要考虑其他开发者使用的操作系统。

Sail是继Homestead,Valet,Laragon,Takeout,LaradockVessel等一长串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 。随意重命名为任何你想要的项目的名称.

Screenshot of Laravel Sail installation
接下来, 导航到项目目录:

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.testmysqlredis

Screenshot of Docker programming environment

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 参数指定了在我们的应用程序启动之前,哪些服务应该启动和运行。我们的应用程序依赖于mysqlredis ,和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博客上。