如何使用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 映像。

构建参数 useruid 都在 docker-compose.yml 文件中定义并在构建时在 Dockerfile 中使用,应更改以反映您自己的用户名和本地用户名和 uid机器或开发服务器。 要找出您当前用户的 uid,请键入:

echo $UID
Output1000

useruid 变量将在构建时可用,并将在 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,然后按 YENTER 确认。

接下来,您将设置 docker-compose.yml 文件中引用的 Dockerfile,该文件将为 app 服务设置自定义映像:

nano Dockerfile

此 Dockerfile 扩展自默认的 php:7.4-fpm Docker 映像。 它使用 useruid 变量来创建一个能够执行 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_NAMEAPP_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 表。