本系列的一部分:
如何使用 Laravel 和 Docker Compose 在 PHP 中构建链接登陆页面
Laravel是一个开源 PHP 框架,它提供了一组工具和资源来构建现代 PHP 应用程序。在这个基于项目的教程系列中,您将使用 Laravel 框架构建一个Links Landing Page应用程序,使用由 Docker Compose 管理的容器化 PHP 开发环境。
最后,您将拥有一个使用 Laravel 构建并通过 Artisan 命令管理的单页网站,您可以在其中将相关链接分享给社交渠道和演示文稿上的受众。
首先,您需要创建一个能够执行 PHP 和Composer(PHP 依赖项管理工具)的容器化环境。然后,您就可以从头开始引导新的 Laravel 应用程序,而无需在本地机器或开发服务器上安装本地 PHP 环境。
在本指南中,我们将根据我们关于如何在 Ubuntu 20.04 上使用 Docker Compose 安装 Laravel 的教程,提供有关如何设置此环境的简化说明。有关将在本指南中提供的 Docker Compose 文件中使用的每个选项的更详细说明,请参阅该教程。
在您的主文件夹中为您的应用程序创建一个新目录:
- mkdir ~/landing-laravel
- cd ~/landing-laravel
接下来,您将创建docker-compose.yml
将定义容器化环境的文件。在此文件中,您将设置名为 的服务app
,该服务将基于使用稍后设置的 Dockerfile 构建的自定义 Docker 映像。
构建参数user
anduid
都在docker-compose.yml
文件中定义并在构建时在 Dockerfile 中使用,应该更改以反映您在本地计算机或开发服务器上的用户名和 uid。要找出您当前用户的 uid,请键入:
- echo $UID
Output1000
该user
和uid
变量将可在编译时,将在Dockerfile被用来创建的新用户app
使用相同的用户名和服务uid作为本地机器或开发服务器上的当前系统用户。这将避免在处理来自容器和执行 Docker 的主机的应用程序文件时的权限和所有权问题。
docker-compose.yml
使用您选择的文本编辑器创建一个新文件。在这里,我们使用nano
:
- nano docker-compose.yml
将以下内容复制到此文件中,并且不要忘记根据您在运行 Docker 的系统上自己的用户名和 uid 将突出显示的值替换为适当的值:
version: "3.7"
services:
app:
build:
args:
user: sammy
uid: 1000
context: ./
dockerfile: Dockerfile
image: landing-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- landing
networks:
landing:
driver: bridge
完成后保存并关闭文件。如果您正在使用nano
,您可以通过按CTRL
+ X
、Y
和ENTER
来确认。
接下来,您将设置docker-compose.yml
文件中引用的 Dockerfile ,这将为服务设置自定义映像app
:
- nano Dockerfile
这个 Dockerfile 扩展自默认的php:7.4-fpm
Docker 镜像。它使用user
和uid
变量来创建能够执行 Artisan 和 Composer 命令的新用户。它还安装了 Laravel 所需的一些 PHP 依赖项和 Composer 可执行文件。
将以下内容复制到您的 Dockerfile:
FROM php:7.4-fpm
# Arguments defined in docker-compose.yml
ARG user
ARG uid
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user
# Set working directory
WORKDIR /var/www
USER $user
完成后保存并关闭文件。接下来,您可以启动您的环境:
- docker-compose up -d
此命令将以分离模式执行 Docker Compose ,这意味着它将在后台运行。第一次使用自定义镜像启动环境时,Docker Compose 会在创建所需容器之前自动为您构建镜像。这可能需要一些时间才能完成。你会看到类似这样的输出:
OutputCreating network "landing-laravel_landing" with driver "bridge"
Building app
Step 1/11 : FROM php:7.4-fpm
---> fa37bd6db22a
...
Step 10/11 : WORKDIR /var/www
---> Using cache
---> 769afd5d44d8
Step 11/11 : USER $user
---> Using cache
---> 841eb5852b69
Successfully built 841eb5852b69
Successfully tagged landing-app:latest
WARNING: Image for service app was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating landing-laravel_app_1 ... done
您可以通过以下方式验证您的环境是否已启动并正在运行:
- docker-compose ps
Output Name Command State Ports
------------------------------------------------------------------------
landing-laravel_app_1 docker-php-entrypoint php-fpm Up 9000/tcp
一旦app
服务,你可以运行作曲,PHP的依赖管理工具,来引导新的Laravel应用。为此,您将使用在安装了 PHPdocker compose exec
的app
服务上运行命令。
以下命令将使用 Docker Compose 来执行composer create-project
,这将根据laravel/laravel
包引导全新安装的 Laravel :
- docker-compose exec app composer create-project laravel/laravel --prefer-dist application
Creating a "laravel/laravel" project at "./application"
Installing laravel/laravel (v8.4.0)
- Downloading laravel/laravel (v8.4.0)
- Installing laravel/laravel (v8.4.0): Extracting archive
Created project in /var/www/application
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
Lock file operations: 104 installs, 0 updates, 0 removals
…
Package manifest generated successfully.
71 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan key:generate --ansi
Application key set successfully.
此安装.env
基于.env.example
Laravel 附带的默认文件创建一个新文件。该.env
文件包含数据库凭据和其他敏感的应用程序设置,并且在应用程序运行的每个环境中应该是唯一的。完成开发环境设置后,您将回来编辑此文件。
接下来,将应用程序文件复制到与文件相同的目录docker-compose.yml
,以便您可以与 Docker Compose 共享 Laravel 的环境变量文件。然后,您可以删除application
Composer 创建的目录:
cp -rT application .
rm -rfv application
您的应用程序现已启动,但您需要在 Docker Compose 文件中包含几个服务,以便能够从浏览器访问该应用程序。一个nginx
服务将成为使用Nginx的网络服务器应用程序,一个db
服务将托管应用程序的MySQL数据库。
首先,通过以下方式降低您的环境:
- docker-compose down
OutputStopping landing-laravel_app_1 ... done
Removing landing-laravel_app_1 ... done
Removing network landing-laravel_landing
这将删除与此环境关联的所有容器和网络。在编辑docker-compose.yml
文件以添加新服务之前,请创建一个新目录以与容器共享配置文件。你需要它来正确设置 Nginx 来处理 Laravel PHP 应用程序。
- mkdir -p docker-compose/nginx
接下来,创建一个landing-laravel.conf
包含自定义 Nginx 服务器块的新文件。稍后,您将设置一个卷以在nginx
服务容器内共享此文件。
打开一个新的 Nginx 配置文件:
- nano docker-compose/nginx/landing-laravel.conf
以下服务器块将 Nginx 配置为使用外部服务 ( app
) 来处理Laravel 应用程序来处理 PHP 代码。将此内容复制到您自己的 Nginx 配置文件中:
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/public;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
完成后保存并关闭文件。
接下来,打开您的docker-compose.yml
文件:
- nano docker-compose.yml
包括服务的以下配置,nginx
与之前配置的app
服务处于同一级别。这将创建一个基于nginx:alpine
镜像的新服务,所有在8000
运行 Docker 的主机端口上的请求都将被重定向到80
服务容器中的端口。除了应用程序文件之外,您还将共享一个包含 Nginx 的 Laravel 应用程序配置文件的卷:
nginx:
image: nginx:alpine
restart: unless-stopped
ports:
- 8000:80
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
- landing
然后,为db
服务包含以下配置块。这将基于默认的 MySQL 8 镜像创建一个服务,并拉入 Laravel 的环境文件中定义的值来设置数据库访问:
db:
image: mysql:8
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
networks:
- landing
docker-compose.yml
完成后,您的更新文件应如下所示:
version: "3.7"
services:
app:
build:
args:
user: sammy
uid: 1000
context: ./
dockerfile: Dockerfile
image: landing-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- landing
nginx:
image: nginx:alpine
restart: unless-stopped
ports:
- 8000:80
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
- landing
db:
image: mysql:8
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
networks:
- landing
networks:
landing:
driver: bridge
注意:有关容器化 Laravel 环境的更多详细信息,包括有关共享卷和网络的说明,请参阅我们关于如何在 Ubuntu 20.04 上使用 Docker Compose 安装 Laravel 的完整指南。
完成编辑后保存并关闭文件。最后,更新 Laravel dot env 文件 ( .env
) 以将 MySQL 数据库主机配置指向运行 MySQL 服务的主机,称为db
:
- nano .env
.env
Composer 在安装时自动生成的文件带有一些您可能想要更改的默认值,例如APP_NAME
和APP_URL
. DB_HOST
必须更改数据库变量以指向将运行 MySQL 的服务,您可以通过docker-compose.yml
文件中定义的服务名称引用它。在本例中,我们使用了db
作为数据库服务的名称,因此它将在容器化网络中作为名为db
.
.env
使用以下示例作为基础,相应地更改您的内容。此处突出显示的值已更新,以反映正在开发的应用程序的状态:
APP_NAME=LandingLaravel
APP_ENV=local
APP_KEY=base64:ffYPNP8kPeQDf8gE/qh3kWjk59p6gFY66kCKhhKUa2w=
APP_DEBUG=true
APP_URL=http://localhost:8000
LOG_CHANNEL=stack
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=landing-db
DB_USERNAME=landing-user
DB_PASSWORD=dev-password
...
您不需要更改此文件的任何其他部分,但可以随意调整您的特定用例。
完成编辑内容后保存并关闭文件。
您现在可以使用以下内容启动更新的环境:
- docker-compose up -d
OutputCreating network "landing-laravel_landing" with driver "bridge"
Creating landing-laravel_app_1 ... done
Creating landing-laravel_db_1 ... done
Creating landing-laravel_nginx_1 ... done
完整环境启动后,您现在可以将浏览器localhost
或远程服务器的 IP 地址指向端口8000
:
http://localhost:8000
如果一切正常,您将看到如下页面:
在本系列的下一部分中,您将创建一个数据库迁移来设置链接表。