如何使用 Docker Compose 引导新的 Laravel 应用程序

要开始,你需要创建一个容器化环境,可以运行 PHP 和 Composer, PHP 依赖管理工具. 然后,你将能够从头开始启动新的 Laravel 应用程序,而无需在本地机器或开发服务器上安装本地 PHP 环境。

在本指南中,将提供简化的说明,如何设置这个环境,基于我们的教程在 如何在Ubuntu 20.04上安装Laravel with Docker Compose

在您的主文件夹中为您的应用程序创建一个新目录:

1mkdir ~/landing-laravel
2cd ~/landing-laravel

接下来,您将创建定义集装箱环境的docker-compose.yml文件. 在此文件中,您将设置一个名为app的服务,该服务将基于自定义的 Docker 图像,用您稍后设置的 Dockerfile构建。

构建参数用户uid,既定义在docker-compose.yml文件中,而且在构建时使用在Dockerfile中,应更改以反映本地机器或开发服务器上的用户名和uid。

1echo $UID
1[secondary_label Output]
21000

用户uid变量将在构建时可用,并在Dockerfile中使用,以在本地机器或开发服务器上创建一个与当前系统用户相同的用户名和uid的应用程序服务中的新用户。

使用您所选择的文本编辑器创建一个新的 docker-compose.yml 文件. 在这里,使用了 nano:

1nano docker-compose.yml

将以下内容复制到此文件中,并不要忘记取代所突出的值,取决于您自己的用户名和运行 Docker 的系统上的 uid:

 1[label ~/landing-laravel/docker-compose.yml]
 2version: "3.7"
 3services:
 4  app:
 5    build:
 6      args:
 7        user: sammy
 8        uid: 1000
 9      context: ./
10      dockerfile: Dockerfile
11    image: landing-app
12    restart: unless-stopped
13    working_dir: /var/www/
14    volumes:
15      - ./:/var/www
16    networks:
17      - landing
18
19networks:
20  landing:
21    driver: bridge

如果您正在使用nano,您可以通过按CTRL+X,然后按YENTER来确认。

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

1nano Dockerfile

此 Dockerfile 扩展自默认的 php:7.4-fpm Docker 图像. 它使用 useruid 变量来创建一个能够执行 Artisan 和 Composer 命令的新用户。

将以下内容复制到您的 Dockerfile:

 1[label ~/my-todo-list/Dockerfile]
 2FROM php:7.4-fpm
 3
 4# Arguments defined in docker-compose.yml
 5ARG user
 6ARG uid
 7
 8# Install system dependencies
 9RUN apt-get update && apt-get install -y \
10    git \
11    curl \
12    libpng-dev \
13    libonig-dev \
14    libxml2-dev \
15    zip \
16    unzip
17
18# Clear cache
19RUN apt-get clean && rm -rf /var/lib/apt/lists/*
20
21# Install PHP extensions
22RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
23
24# Get latest Composer
25COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
26
27# Create system user to run Composer and Artisan Commands
28RUN useradd -G www-data,root -u $uid -d /home/$user $user
29RUN mkdir -p /home/$user/.composer && \
30    chown -R $user:$user /home/$user
31
32# Set working directory
33WORKDIR /var/www
34
35USER $user

完成后保存并关闭文件. 接下来,您可以将您的环境带上:

1docker-compose up -d

此命令将在 _detached 模式中执行 Docker Compose,这意味着它将在背景中运行。当您首次将环境带上自定义图像时,Docker Compose 会在创建所需容器之前自动为您构建图像。

 1[secondary_label Output]
 2Creating network "landing-laravel_landing" with driver "bridge"
 3Building app
 4Step 1/11 : FROM php:7.4-fpm
 5 ---> fa37bd6db22a
 6...
 7Step 10/11 : WORKDIR /var/www
 8 ---> Using cache
 9 ---> 769afd5d44d8
10Step 11/11 : USER $user
11 ---> Using cache
12 ---> 841eb5852b69
13
14Successfully built 841eb5852b69
15Successfully tagged landing-app:latest
16WARNING: 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`.
17Creating landing-laravel_app_1 ... done

您可以验证您的环境是否正在运行:

1docker-compose ps
1[secondary_label Output]
2        Name Command State Ports  
3------------------------------------------------------------------------
4landing-laravel_app_1 docker-php-entrypoint php-fpm Up 9000/tcp

一旦app服务启动,你可以运行Composer,PHP依赖管理工具,启动一个新的Laravel应用程序。

以下命令将使用 Docker Compose 执行composer create-project,该命令将启动基于laravel/laravel包的新的 Laravel 安装:

1docker-compose exec app composer create-project laravel/laravel --prefer-dist application
 1Creating a "laravel/laravel" project at "./application"
 2Installing laravel/laravel (v8.4.0)
 3  - Downloading laravel/laravel (v8.4.0)
 4  - Installing laravel/laravel (v8.4.0): Extracting archive
 5Created project in /var/www/application
 6> @php -r "file_exists('.env') || copy('.env.example', '.env');"
 7Loading composer repositories with package information
 8Updating dependencies
 9Lock file operations: 104 installs, 0 updates, 0 removals
10
11Package manifest generated successfully.
1271 packages you are using are looking for funding.
13Use the `composer fund` command to find out more!
14> @php artisan key:generate --ansi
15Application key set successfully.

此安装基于与 Laravel 附带的默认 .env.example 文件创建一个新的 .env 文件. 该 .env 文件包含数据库凭证和其他敏感的应用程序设置,并且应该是每个应用程序运行环境独一无二的。

接下來,將應用程式檔案複製到與「docker-compose.yml」檔案相同的目錄,以便您可以與 Docker Compose 共享 Laravel 的環境變量檔案。

1cp -rT application .
2rm -rfv application

您的应用程序现在已启动,但您需要在 Docker Compose 文件中包含几个服务,以便可以从浏览器访问该应用程序。

首先,将您的环境 带到下面 与:

1docker-compose down
1[secondary_label Output]
2Stopping landing-laravel_app_1 ... done
3Removing landing-laravel_app_1 ... done
4Removing network landing-laravel_landing

这将删除与此环境相关的所有容器和网络。在编辑您的docker-compose.yml文件以添加新服务之前,请创建一个新目录以与容器共享配置文件。

1mkdir -p docker-compose/nginx

接下来,创建一个新的 landing-laravel.conf 文件,其中包含一个自定义的 Nginx 服务器块。

打开一个新的 Nginx 配置文件:

1nano docker-compose/nginx/landing-laravel.conf

下列服务器块将 Nginx 配置为使用外部服务(‘app’)服务的 Laravel 应用程序,以处理 PHP 代码。

 1[label docker-compose/nginx/landing-laravel.conf]
 2server {
 3    listen 80;
 4    index index.php index.html;
 5    error_log  /var/log/nginx/error.log;
 6    access_log /var/log/nginx/access.log;
 7    root /var/www/public;
 8    location ~ \.php$ {
 9        try_files $uri =404;
10        fastcgi_split_path_info ^(.+\.php)(/.+)$;
11        fastcgi_pass app:9000;
12        fastcgi_index index.php;
13        include fastcgi_params;
14        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
15        fastcgi_param PATH_INFO $fastcgi_path_info;
16    }
17    location / {
18        try_files $uri $uri/ /index.php?$query_string;
19        gzip_static on;
20    }
21}

保存并关闭文件,当你完成。

接下来,打开您的docker-compose.yml文件:

1nano docker-compose.yml

包括以下配置为nginx服务,与之前配置的app服务相同的级别. 这将创建一个基于nginx:alpine图像的新服务,并且在运行 Docker 的主机端口8000上的所有请求将被重定向到服务容器中的端口80

 1nginx:
 2    image: nginx:alpine
 3    restart: unless-stopped
 4    ports:
 5      - 8000:80
 6    volumes:
 7      - ./:/var/www
 8      - ./docker-compose/nginx:/etc/nginx/conf.d/
 9    networks:
10      - landing

然后,为db服务添加下面的配置块,这将创建基于默认的MySQL 8图像的服务,然后拖入Laravel环境文件中定义的值来设置数据库访问:

 1db:
 2    image: mysql:8
 3    restart: unless-stopped
 4    environment:
 5      MYSQL_DATABASE: ${DB_DATABASE}
 6      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
 7      MYSQL_PASSWORD: ${DB_PASSWORD}
 8      MYSQL_USER: ${DB_USERNAME}
 9    networks:
10      - landing

以下是您完成后更新后的 dxd.dll 文件的样子:

 1[label ~/landing-laravel/docker-compose.yml]
 2version: "3.7"
 3services:
 4  app:
 5    build:
 6      args:
 7        user: sammy
 8        uid: 1000
 9      context: ./
10      dockerfile: Dockerfile
11    image: landing-app
12    restart: unless-stopped
13    working_dir: /var/www/
14    volumes:
15      - ./:/var/www
16    networks:
17      - landing
18
19  nginx:
20    image: nginx:alpine
21    restart: unless-stopped
22    ports:
23      - 8000:80
24    volumes:
25      - ./:/var/www
26      - ./docker-compose/nginx:/etc/nginx/conf.d/
27    networks:
28      - landing
29  db:
30    image: mysql:8
31    restart: unless-stopped
32    environment:
33      MYSQL_DATABASE: ${DB_DATABASE}
34      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
35      MYSQL_PASSWORD: ${DB_PASSWORD}
36      MYSQL_USER: ${DB_USERNAME}
37    networks:
38      - landing
39
40networks:
41  landing:
42    driver: bridge

<$>[注] :有关集装箱化Laravel环境的详细信息,包括关于共享卷和网络的解释,请参阅我们在Ubuntu 20.04上如何安装Laravel与Docker Compose的完整指南(https://andsky.com/tech/tutorials/how-to-install-and-set-up-laravel-with-docker-compose-on-ubuntu-20-04)。

最后,更新您的 Laravel 点 env 文件 (.env') 以将 MySQL 数据库主机配置指向运行 MySQL 服务的主机,称为 db`:

1nano .env

由作曲器在安装时自动生成的.env'文件带有一些默认值,您可能想要更改,例如APP_NAME'和APP_URL'。 数据库DB_HOST'变量必须更改,以指向 MySQL 将运行的服务,您可以根据docker-compose.yml文件中定义的服务名称引用它。 在这个例子中,你用"db"作为数据库服务的名称,因此这个名称将作为名为"db"的主机在集装箱网络中提供.

相应地更改您的 .env,使用下面的示例作为基础. 突出显示的值已更新,以反映正在开发的应用程序的状态:

 1[label ~/landing-laravel/.env]
 2APP_NAME=LandingLaravel
 3APP_ENV=local
 4APP_KEY=base64:ffYPNP8kPeQDf8gE/qh3kWjk59p6gFY66kCKhhKUa2w=
 5APP_DEBUG=true
 6APP_URL=http://localhost:8000
 7
 8LOG_CHANNEL=stack
 9LOG_LEVEL=debug
10
11DB_CONNECTION=mysql
12DB_HOST=db
13DB_PORT=3306
14DB_DATABASE=landing-db
15DB_USERNAME=landing-user
16DB_PASSWORD=dev-password
17
18...

您不需要更改此文件的任何其他部分,但可以轻松调整到您的特定用例。

保存并关闭文件,当你完成了编辑其内容。

您现在可以将更新的环境带上:

1docker-compose up -d
1[secondary_label Output]
2Creating network "landing-laravel_landing" with driver "bridge"
3Creating landing-laravel_app_1   ... done
4Creating landing-laravel_db_1    ... done
5Creating landing-laravel_nginx_1 ... done

有了完整的环境,您现在可以将浏览器指向本地主机或远程服务器的IP地址,在端口8000:

1http://localhost:8000

如果一切按预期工作,你会看到这样的页面:

Laravel Landing Links - basic app

在本系列的下一部分中,您将创建数据库迁移以设置 链接 表。

Published At
Categories with 技术
Tagged with
comments powered by Disqus