開始するには、PHPと Composer 、PHP依存関係管理ツールを実行できるコンテナー化された環境を作成する必要があります。 そうすれば、ローカルのマシンや開発サーバーにローカルのPHP環境をインストールしなくても、新しいLaravelアプリケーションを最初からブートストラップできるようになります。

このガイドでは、 Ubuntu 20.04にDockerComposeを使用してLaravelをインストールする方法のチュートリアルに基づいて、この環境をセットアップする方法についての合理化された手順を提供します。 このガイドで提供されるDockerComposeファイル内で使用される各オプションの詳細な手順については、そのチュートリアルを参照してください。

ホームフォルダにアプリケーションの新しいディレクトリを作成します。

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

次に、コンテナ化された環境を定義するdocker-compose.ymlファイルを作成します。 このファイルでは、appという名前のサービスを設定します。このサービスは、後で設定するDockerfileで構築されたカスタムDockerイメージに基づいています。

ビルド引数useruidは、どちらもdocker-compose.ymlファイルで定義され、ビルド時にDockerfileで使用されますが、ローカルのユーザー名とuidを反映するように変更する必要があります。マシンまたは開発サーバー。 現在のユーザーのuidを確認するには、次のように入力します。

  1. echo $UID
Output
1000

user変数とuid変数はビルド時に使用可能になり、Dockerfileで使用されて、appサービスに同じユーザー名とuidを持つ新しいユーザーを作成します。ローカルマシンまたは開発サーバー上の現在のシステムユーザー。 これにより、コンテナーとDockerを実行するホストの両方からのアプリケーションファイルを操作する際のアクセス許可と所有権の問題を回避できます。

選択したテキストエディタを使用して、新しいdocker-compose.ymlファイルを作成します。 ここでは、nanoを使用しています。

  1. 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サービスのカスタムイメージが設定されます。

  1. nano Dockerfile

このDockerfileは、デフォルトのphp:7.4-fpmDockerイメージから拡張されています。 userおよびuid変数を使用して、ArtisanおよびComposerコマンドを実行できる新しいユーザーを作成します。 また、LaravelとComposer実行可能ファイルに必要ないくつかのPHP依存関係をインストールします。

次のコンテンツを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

完了したら、ファイルを保存して閉じます。 次に、次の方法で環境を立ち上げることができます。

  1. docker-compose up -d

このコマンドは、Docker Composeをデタッチモードで実行します。つまり、バックグラウンドで実行されます。 カスタムイメージを使用して環境を初めて起動すると、Docker Composeは、必要なコンテナーを作成する前に、イメージを自動的に構築します。 これが完了するまでに少し時間がかかる場合があります。 次のような出力が表示されます。

Output
Creating 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

以下を使用して、環境が稼働していることを確認できます。

  1. 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サービスでコマンドを実行します。

次のコマンドは、DockerComposeを使用してcomposer create-projectを実行します。これにより、laravel/laravelパッケージに基づいてLaravelの新規インストールがブートストラップされます。

  1. 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ファイルと同じディレクトリにコピーして、Laravelの環境変数ファイルをDockerComposeと共有できるようにします。 次に、Composerによって作成されたapplicationディレクトリを削除できます。

cp -rT application .
rm -rfv application

これでアプリケーションはブートストラップされましたが、ブラウザーからアプリにアクセスできるようにするには、DockerComposeファイルにいくつかのサービスを含める必要があります。 nginxサービスはNginxWebサーバーを使用してアプリケーションにサービスを提供し、dbサービスはアプリケーションのMySQLデータベースをホストします。

まず、次の方法で環境をダウンにします。

  1. docker-compose down
Output
Stopping landing-laravel_app_1 ... done Removing landing-laravel_app_1 ... done Removing network landing-laravel_landing

これにより、この環境に関連付けられているすべてのコンテナとネットワークが削除されます。 docker-compose.ymlファイルを編集して新しいサービスを追加する前に、構成ファイルをコンテナーと共有するための新しいディレクトリーを作成してください。 Laravel PHPアプリケーションを処理するようにNginxを適切に設定するには、これが必要になります。

  1. mkdir -p docker-compose/nginx

次に、カスタムNginxサーバーブロックを含む新しいlanding-laravel.confファイルを作成します。 後で、nginxサービスコンテナ内でこのファイルを共有するボリュームを設定します。

次のコマンドで新しいNginx構成ファイルを開きます。

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

次のサーバーブロックは、PHPコードを処理するために外部サービス(app)を使用してLaravelアプリケーションを提供するようにNginxを構成します。 このコンテンツを独自の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ファイルを開きます。

  1. nano docker-compose.yml

以前に構成されたappサービスと同じレベルで、nginxサービスの次の構成を含めます。 これにより、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環境のコンテナ化の詳細については、 Ubuntu20.04にDockerComposeを使用してLaravelをインストールする方法に関する完全ガイドを参照してください。

編集が完了したら、ファイルを保存して閉じます。 最後に、Laravel dot envファイル(.env)を更新して、MySQLデータベースホスト構成が、dbと呼ばれるMySQLサービスが実行されるホストを指すようにします。

  1. nano .env

インストール時にComposerによって自動的に生成される.envファイルには、APP_NAMEAPP_URLなど、変更したいデフォルト値がいくつか含まれています。 データベースのDB_HOST変数は、MySQLが実行されるサービスを指すように変更する必要があり、docker-compose.ymlファイルで定義されているサービス名で参照できます。 この例では、データベースサービスの名前としてdbを使用しているため、これは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

...

このファイルの他のセクションを変更する必要はありませんが、特定のユースケースに自由に調整してください。

内容の編集が完了したら、ファイルを保存して閉じます。

これで、更新された環境を次のように起動できます。

  1. docker-compose up -d
Output
Creating 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

完全な環境が整ったら、ブラウザでポート8000localhostまたはリモートサーバーのIPアドレスを指定できます。

http://localhost:8000

すべてが期待どおりに機能する場合は、次のようなページが表示されます。

Laravel Landing Links - basic app

このシリーズの次のパートでは、リンクテーブルを設定するためのデータベース移行を作成します。