DockerComposeで新しいLaravelアプリケーションをブートストラップする方法
開始するには、PHPと Composer 、PHP依存関係管理ツールを実行できるコンテナー化された環境を作成する必要があります。 そうすれば、ローカルのマシンや開発サーバーにローカルのPHP環境をインストールしなくても、新しいLaravelアプリケーションを最初からブートストラップできるようになります。
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. このガイドで提供されるDockerComposeファイル内で使用される各オプションの詳細な手順については、そのチュートリアルを参照してください。
ホームフォルダにアプリケーション用の新しいディレクトリを作成します。
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と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
完了したら、ファイルを保存して閉じます。 次に、次の方法で環境を立ち上げることができます。
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
サービスでコマンドを実行します。
次のコマンドは、DockerComposeを使用して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
ファイルと同じディレクトリにコピーして、Laravelの環境変数ファイルをDockerComposeと共有できるようにします。 次に、Composerによって作成されたapplication
ディレクトリを削除できます。
cp -rT application . rm -rfv application
これでアプリケーションはブートストラップされましたが、ブラウザーからアプリにアクセスできるようにするには、DockerComposeファイルにいくつかのサービスを含める必要があります。 nginx
サービスはNginxWebサーバーを使用してアプリケーションにサービスを提供し、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
ファイルを編集して新しいサービスを追加する前に、構成ファイルをコンテナーと共有するための新しいディレクトリーを作成してください。 Laravel PHPアプリケーションを処理するようにNginxを適切に設定するには、これが必要になります。
mkdir -p docker-compose/nginx
次に、カスタムNginxサーバーブロックを含む新しいlanding-laravel.conf
ファイルを作成します。 後で、nginx
サービスコンテナ内でこのファイルを共有するボリュームを設定します。
次のコマンドで新しいNginx構成ファイルを開きます。
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
ファイルを開きます。
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サービスが実行されるホストを指すようにします。
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
完全な環境が整ったら、ブラウザでポート8000
のlocalhost
またはリモートサーバーのIPアドレスを指定できます。
http://localhost:8000
すべてが期待どおりに機能する場合は、次のようなページが表示されます。
このシリーズの次のパートでは、リンクテーブルを設定するためのデータベース移行を作成します。