为云准备 Laravel 应用
2024 年 9 月 6 日
最近在 拉拉康 重新激发了 Laravel 社区对基于云的部署的兴趣。随着关于如何部署应用程序的争论不断升温,有一点是明确的:云正在成为 Laravel 用户更可行的选择。
在本文中,我们将探讨如何使用以下工具准备 Laravel 应用程序以在云环境中部署 弗兰肯PHP , 球童 、Dockerfiles,最后将其部署到 塞维利亚 。
那么我们从哪里开始呢?当然是在本地环境中!🤓
本地开发环境
为了简单起见,我们假设您在本地机器上安装了一个新的 Laravel 应用程序,它连接到 PostgreSQL 数据库来读取/写入一些数据。
在我们继续之前,请确保你有一个
.env
项目根目录中的文件包含以下内容:
.env
:
...
DB_CONNECTION=pgsql
...
一旦验证通过,我们就可以开始构建。🤓☕️
拥有与生产环境非常相似的本地开发环境始终是一个好主意。这样,您可以尽早发现任何问题,并避免在生产中部署应用时出现意外。
为了模拟我们将要使用的生产设置,我们将依赖 Docker 和 Docker Compose。如果你的机器上没有安装 Docker,你可以从 官方网站 。
运行没有数据库的 Laravel
首先,创建一个名为
compose.yml
在 Laravel 项目的根目录中添加以下内容:
compose.yml
:
services:
php:
image: dunglas/frankenphp:php8.3-alpine
command: php artisan serve --host 0.0.0.0 --port 8080
ports:
- 8080:8080
volumes:
- .:/app
此配置文件定义了一个名为的服务
php
使用
dunglas/frankenphp:php8.3-alpine
镜像,这是一个轻量级的 FrankenPHP 镜像,包含运行 Laravel 应用程序所需的扩展。我们还公开了端口
8080
从主机访问该应用程序。
要测试您的配置,请尝试在终端中运行以下命令:
docker compose up [-d]
当你导航到
http://0.0.0.0:8080
在您的浏览器中。这是意料之中的,因为我们还没有将 Laravel 应用程序连接到数据库。
太棒了,到目前为止,我们已经将 Laravel 应用程序配置为由运行
php artisan serve
。
接下来,让我们将本地应用程序与 PostgreSQL 数据库连接起来!
使用数据库运行 Laravel
要将您的 Laravel 应用程序连接到 PostgreSQL 数据库,我们需要做几件事。
首先,我们需要在
.env
文件:
.env
:
...
DB_CONNECTION=pgsql
DB_HOST=db
DB_PORT=5432 # default PostgreSQL port
DB_DATABASE=main
DB_USERNAME=admin
DB_PASSWORD=password
之后,您需要向你的
compose.yml
文件,并创建自定义
Dockerfile
适用于您的开发环境。创建并更新具有以下内容的文件:
Dockerfile.dev
:
FROM dunglas/frankenphp:php8.3-alpine
RUN install-php-extensions pdo_pgsql
Dockerfile.dev
仅供您的本地/开发环境使用,它扩展了
dunglas/frankenphp:php8.3-alpine
图像包含
pdo_pgsql
扩展,这是连接到 PostgreSQL 数据库所必需的。
compose.yml
:
services:
init:
build:
dockerfile: Dockerfile.dev
command: php artisan migrate
depends_on:
db:
condition: service_healthy
volumes:
- .:/app
php:
build:
context: .
dockerfile: Dockerfile.dev
command: php artisan serve --host 0.0.0.0 --port 8080
ports:
- 8080:8080
depends_on:
init:
condition: service_completed_successfully
volumes:
- .:/app
db:
image: postgres:16.4-alpine
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: password
POSTGRES_DB: main
volumes:
- /var/lib/postgresql/data
healthcheck:
test: pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB
interval: 1s
这里发生了很多事情,让我们看看发生了什么变化以及为什么发生变化:
- 我们更新了
php
使用名为Dockerfile.dev
构建一个包含连接 PostgreSQL 数据库所需扩展的新图像。 - 我们添加了一项新服务,名为
db
使用postgres:16.4-alpine
图像来运行 PostgreSQL 数据库。我们还定义了一些环境变量来设置数据库用户、密码和数据库名称。 - 我们创建了一个名为
db_data
将数据保存在您机器的数据库中,并且 Docker 可以在您重新启动服务时重复使用它。 - 一项名为
init
还补充说,重复使用Dockerfile.dev
。此图像用于运行php artisan migrate
命令来运行数据库迁移。depends_on
关键确保db
在运行迁移之前,服务已启动并正在运行。 - 这
php
服务现在取决于init
服务以确保数据库迁移在 Laravel 应用程序启动之前运行。 - 我们已将健康检查添加到
db
服务,以确保 PostgreSQL 数据库在init
服务运行迁移。
要测试您的配置,请在终端中运行以下命令:
docker compose up --build
您的应用程序现在应该连接到您的 PostgreSQL 数据库,并且您的数据库迁移始终运行。🎉
您的本地环境现已准备好模拟您的生产环境。您现在可以在本地开发您的应用并测试与生产环境非常相似的设置。
准备生产
现在是时候对您的生产环境做出必要的改变了。
第一步是告诉 Docker 在构建生产镜像时可以安全忽略哪些目录。创建一个名为
.dockerignore
在 Laravel 项目的根目录中添加以下内容:
.dockerignore
:
vendor
bootstrap/chache/*
tests
此文件告诉 Docker 忽略
vendor
,
bootstrap/cache
, 和
tests
目錄。
然后,创建一个
Dockerfile
将用于构建你的生产图像:
Dockerfile
:
FROM dunglas/frankenphp:php8.3-alpine
ENV SERVER_NAME=":8080"
RUN install-php-extensions @composer pdo_pgsql
WORKDIR /app
COPY . .
RUN composer install \
--ignore-platform-reqs \
--optimize-autoloader \
--prefer-dist \
--no-interaction \
--no-progress \
--no-scripts
这
Dockerfile
类似于
Dockerfile.dev
我们之前创建的,但它包括一些额外的步骤:
- 由于 FrankenPHP 镜像使用 Caddy 作为默认 Web 服务器,因此我们设置了
SERVER_NAME
环境变量:8080
指示 Caddy 监听端口8080
。 - 我们安装
@composer
PHP 扩展用于在图像中安装 Composer。 composer install
运行命令来安装 Laravel 应用程序的依赖项。- 我们将工作目录设置为
/app
并将你的 Laravel 应用程序的内容复制到图像中。
要在本地环境中测试您的更改,您需要生成应用的生产版本。在终端中运行以下命令:
docker build -t my-laravel-app .
此命令将构建一个名为
my-laravel-app
基于
Dockerfile
在当前目录中。
要测试新构建的生产映像,请使用以下命令:
docker run -p 8080:8080 -e APP_KEY=<your-app-key> my-laravel-app
代替
<your-app-key>
与价值
APP_KEY
您的环境变量
.env
文件或从中获取密钥
这里
。
在浏览器中访问 0.0.0.0:8080,你的应用应该会以生产模式启动。它可能会因为缺少数据库连接而出错,但这是正常现象。
部署到云
现在您已经有了可用于生产的 Docker 映像,您可以将其部署到云提供商。🚀
在本教程中,我们将使用
塞维利亚
,一家新的云提供商,提供一种简单的部署方式
Dockerfile
的部署。
由于您的应用依赖于 PostgreSQL 数据库,因此最好先在 Sevalla 上配置一个新的 PostgreSQL 数据库。登录后 Sevalla 仪表板 ,
- 导航到创建数据库模式
- 选择 PostgreSQL 数据库
- 确认设置并创建数据库
一旦数据库准备就绪,您就可以在 Sevalla 上创建 Laravel 应用程序。
- 导航到创建应用模式
- 从您首选的 Git 提供商中选择您的应用存储库
- 确保选择与数据库相同的数据中心
- 设置
APP_KEY
Laravel 所需的环境变量 - 选择
Dockerfile
作为构建类型 - 确认其余设置并点击“稍后部署”按钮
如果您的应用程序已准备就绪,您现在可以将其与您的 PostgreSQL 数据库连接。
- 导航到应用页面
- 转到“网络”选项卡
- 单击“添加连接”按钮并选择您的 PostgreSQL 数据库
- 确认设置并点击“连接”
然后,使用数据库的连接详细信息在“环境变量”选项卡中设置以下环境变量:
DB_CONNECTION
DB_HOST
DB_PORT
DB_DATABASE
DB_USERNAME
DB_PASSWORD
我们建议使用数据库的内部网络地址作为
DB_HOST
值。这样,您的应用就可以通过专用网络连接到数据库。
最后一步是在启动应用程序之前为您的应用程序设置一个作业进程以运行数据库迁移。
- 导航到“流程”选项卡
- 点击“创建流程”按钮并选择“作业”
- 将命令设置为
php artisan migrate --force
- 将启动策略设置为“部署之前”
- 确认设置并点击“创建”
如果也完成了此操作,您现在可以在“部署”选项卡中启动应用程序的手动部署。🎉
如果一切顺利,恭喜!您已成功为云准备了 Laravel 应用。🚀
结论
在本文中,我们探讨了:
- 如何使用 Docker 设置本地环境来模拟生产环境以及
docker compose
。 - 如何使用 Docker、FrankenPHP 和 Caddy 准备 Laravel 应用程序以在云环境中部署。
- 我们还介绍了如何将你的应用部署到云提供商,例如 塞维利亚 。
通过遵循这些步骤,您可以将 Laravel 应用提升到新的高度,并享受基于云的部署的好处。🌤
帖子 为云准备 Laravel 应用 首先出现在 Laravel 新闻 。
加入 Laravel 时事通讯 获取最新信息 类似这样的 Laravel 文章将直接发送到您的收件箱。