如何使用DockerCompose引导新的Laravel应用程序
首先,您需要创建一个能够执行 PHP 和 Composer(PHP 依赖项管理工具)的容器化环境。 然后,您将能够从头开始引导新的 Laravel 应用程序,而无需在本地机器或开发服务器上安装本地 PHP 环境。
In this guide, streamlined instructions will be provided on how to set this environment up based on our tutorial on How To Install Laravel with Docker Compose on Ubuntu 20.04. 有关将在本指南中提供的 Docker Compose 文件中使用的每个选项的更详细说明,请参阅该教程。
在您的主文件夹中为您的应用程序创建一个新目录:
mkdir ~/landing-laravel cd ~/landing-laravel
接下来,您将创建将定义容器化环境的 docker-compose.yml
文件。 在此文件中,您将设置一个名为 app
的服务,该服务将基于使用您稍后设置的 Dockerfile 构建的自定义 Docker 映像。
构建参数 user
和 uid
都在 docker-compose.yml
文件中定义并在构建时在 Dockerfile 中使用,应更改以反映您自己的用户名和本地用户名和 uid机器或开发服务器。 要找出您当前用户的 uid,请键入:
echo $UID
Output1000
user
和 uid
变量将在构建时可用,并将在 Dockerfile 中用于在 app
服务中创建一个与您的用户名和 uid 相同的新用户本地机器或开发服务器上的当前系统用户。 当使用来自容器和执行 Docker 的主机的应用程序文件时,这将避免权限和所有权问题。
使用您选择的文本编辑器创建一个新的 docker-compose.yml
文件。 Here, nano
is used:
nano docker-compose.yml
将以下内容复制到该文件中,不要忘记根据运行 Docker 的系统上您自己的用户名和 uid 将突出显示的值替换为适当的值:
~/landing-laravel/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 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:
~/my-todo-list/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 依赖管理工具 Composer 来引导新的 Laravel 应用程序。 为此,您将使用 docker compose exec
在安装了 PHP 的 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.
此安装基于 Laravel 自带的默认 .env.example
文件创建一个新的 .env
文件。 .env
文件包含数据库凭据和其他敏感的应用程序设置,并且每个应用程序运行的环境应该是唯一的。 完成开发环境设置后,您将返回编辑此文件。
接下来,将应用程序文件复制到与 docker-compose.yml
文件相同的目录下,这样就可以与 Docker Compose 共享 Laravel 的环境变量文件。 然后,您可以删除 Composer 创建的 application
目录:
cp -rT application . rm -rfv application
您的应用程序现在已启动,但您需要在 Docker Compose 文件中包含几个服务才能从浏览器访问应用程序。 nginx
服务将使用 Nginx Web 服务器为应用程序提供服务,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
接下来,创建一个包含自定义 Nginx 服务器块的新 landing-laravel.conf
文件。 稍后,您将设置一个卷以在 nginx
服务容器中共享此文件。
打开一个新的 Nginx 配置文件:
nano docker-compose/nginx/landing-laravel.conf
以下服务器块配置 Nginx 以使用外部服务 (app
) 为 Laravel 应用程序提供服务来处理 PHP 代码。 将此内容复制到您自己的 Nginx 配置文件中:
docker-compose/nginx/landing-laravel.conf
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
镜像创建一个新的服务,所有在运行 Docker 的主机的端口 8000
上的请求将被重定向到服务容器中的端口 80
. 除了应用程序文件之外,您还将共享一个包含 Laravel 应用程序的 Nginx 配置文件的卷:
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
文件应如下所示:
~/landing-laravel/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
Composer 在安装时自动生成的 .env
文件带有一些您可能想要更改的默认值,例如 APP_NAME
和 APP_URL
。 必须将数据库 DB_HOST
变量更改为指向将运行 MySQL 的服务,并且您可以通过其服务名称来引用它,如 docker-compose.yml
文件中定义的那样。 In this example, you’ve used db
as the name for the database service, so this will be available in the containerized network as a host named db
.
使用以下示例作为基础,相应地更改您的 .env
。 此处更新了突出显示的值以反映正在开发的应用程序的状态:
~/landing-laravel/.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
如果一切正常,您将看到如下页面:
在本系列的下一部分中,您将创建一个数据库迁移来设置 links 表。