はじめに

アプリケーションの*コンテナ化*とは、コンテナと呼ばれる軽量環境で実行できるように、アプリケーションおよびそのコンポーネントを適応させるプロセスを指します。このような環境は他から分離され、使い捨てできるため、アプリケーションの開発、テスト、および実稼働環境へのデプロイに活用できます。

このガイドでは、開発用にDocker Composeを使用してLaravelアプリケーションをコンテナ化します。終了すると、3つの別々のサービスコンテナで実行されるデモ用Laravelアプリケーションが作成されます。

  • PHP7.4-FPMを実行するappサービス。
  • MySQL 5.7を実行するdbサービス。
  • Laravelアプリケーションを最終ユーザーに提供する前に、 appサービスを利用してPHPコードを解析するnginxサービス。

開発プロセスを合理化し、アプリケーションのデバグを容易にするために、共有ボリュームを使用してアプリケーションファイルの同期を維持します。また、docker-compose execコマンドを使用して、appコンテナでComposerおよびArtisanを実行する方法についても説明します。

前提条件

docker compose illustration for: 前提条件
  • sudo権限を持つroot以外のユーザーとして、Ubuntu 20.04ローカルマシンまたは開発サーバーにアクセス。リモートサーバーを使用している場合、アクティブなファイアウォールをインストールしておくことをお勧めします。これらのセットアップは、Ubuntu 20.04の初期サーバー設定ガイドを参照してください。

ステップ1 — デモアプリケーションの入手

まず、デモ用LaravelアプリケーションをGithubリポジトリから取得します。このシリーズの最初のガイドで作成した基本的なLaravelアプリケーションが含まれているtutorial-01ブランチに注目しましょう。

このチュートリアルと互換性のあるアプリケーションコードを取得するには、次のコマンドを使用してリリース tutorial-1.0.1をホームディレクトリにダウンロードします。

				
					
cd ~

curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip

				
			

アプリケーションコードを展開するには、unzipコマンドが必要です。このパッケージを以前にインストールしたことがない場合は、次のコマンドを使用してください。

				
					
sudo apt update

sudo apt install unzip

				
			

これで、アプリケーションの内容を展開し、展開したディレクトリの名前を変更してアクセスしやすくします。

				
					
unzip travellist.zip

mv travellist-laravel-demo-tutorial-1.0.1 <^>travellist-demo<^>

				
			

travellist-demoディレクトリに移動します。

				
					
cd travellist-demo

				
			

次のステップでは、アプリケーションを設定するための.env設定ファイルを作成します。

ステップ2 —アプリケーションの.envファイルの設定

Laravel設定ファイルは、アプリケーションのrootディレクトリ内のconfigというディレクトリにあります。さらに、資格情報やデプロイ間で異なる可能性のある情報など、環境に依存する設定を設定するために.envファイルが使用されます。このファイルはリビジョン管理に含まれません 。

[warning]

警告:環境設定ファイルには、データベース資格情報およびセキュリティキーなど、サーバーに関する機密性の高い情報が含まれています。そのため、このファイルは公開しないでください。

.envファイルに含まれる値は、 config ディレクトリにある通常の設定ファイルに設定された値よりも優先されます。新しい環境にインストールするたびに、データベース接続設定、デバグオプション、アプリケーション URL など、アプリケーションが実行されている環境によって異なる可能性のある項目を定義するために、調整された環境ファイルが必要です。

次に、セットアップする開発環境の設定オプションをカスタマイズするために新しい.envファイルを作成します。Laravelには、独自のファイルを作成するためにコピーできる.envのサンプルファイルが付属しています。

				
					
cp .env.example .env

				
			

nanoまたは適切なテキストエディターを使用してこのファイルを開きます。

				
					
nano .env

				
			

travellistデモアプリケーションの現在の.envファイルには、127.0.0.1をデータベースホストとして、ローカルのMySQLデータベースを使用するための設定が含まれています。Docker環境で作成するデータベースサービスを指すように、DB_HOST変数を更新する必要があります。このガイドでは、データベースサービスdbを呼び出します。それでは、DB_HOSTのリストの値をデータベースサービス名に置き換えます。

				
					
[label .env]

APP_NAME=Travellist

APP_ENV=dev

APP_KEY=

APP_DEBUG=true

APP_URL=http://localhost:8000



LOG_CHANNEL=stack



DB_CONNECTION=mysql

DB_HOST=<^>db<^>

DB_PORT=3306

DB_DATABASE=<^>travellist<^>

DB_USERNAME=<^>travellist_user<^>

DB_PASSWORD=<^>password<^>

...

				
			

必要に応じて、データベース名、ユーザー名、パスワードも変更してください。これらの変数は、サービスを設定するためのdocker-compose.ymlファイルを設定した後のステップで活用されます。

編集が完了したらファイルを保存します。nanoを使用した場合は、CTRL+XYENTERを押して保存ができます。

ステップ3 —アプリケーションのDockerfileを設定

MySQLサービスとNginxサービスはどちらもDocker Hubから取得したデフォルトイメージに基づいていますが、アプリケーションコンテナ用にカスタムイメージを作成する必要があります。そのために新しいDockerfileを作成します。

travellistイメージは、Docker Hubのphp:7.4-fpm公式PHPイメージに基づいています。その基本的なPHP-FPM環境に加えて、追加のPHPモジュールおよびComposer依存関係管理ツールをいくつかインストールします。

また、新しいシステムユーザーを作成します。これは、アプリケーションの開発中にartisanおよびcomposerコマンドを実行するために必要です。このuid設定により、コンテナ内のユーザーはDockerを実行しているホストマシン上のシステムユーザーと同じuidを持つことができます。このようにして、これらのコマンドによって作成されたファイルは、適切なアクセス権が付与されホストに複製されます。つまり、ホストマシンで選択したコードエディターを使用して、コンテナ内で実行されるアプリケーションを開発することもできます。

次のコマンドを使用して、新しいDockerfileを作成します。

				
					
nano Dockerfile

				
			

次の内容をDockerfileにコピーします。

				
					
[label 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



				
			

完了したら、必ずファイルを保存してください。

Dockerfileは php:7.4-fpmのように、使用するベースイメージを定義することから始まります。

システムパッケージとPHP拡張機能をインストールした後、composerの実行可能ファイルを最新の公式イメージから独自のアプリケーションイメージにコピーしてComposerをインストールします。

次に、Dockerfileの先頭に記述されたuser引数とuid引数を使用して新しいシステムユーザーが作成され、設定されます。これらの値は、ビルド時にDocker Composeによって挿入されます。

最後に、デフォルトの作業ディレクトリを/var/wwwに設定し、新しく作成されたユーザーに変更します。これにより、通常のユーザーとして接続し、アプリケーションコンテナでcomposerおよびartisanコマンドを実行する時に正しいディレクトリにいることが確認されます。

ステップ4 — Nginx設定とデータベースダンプファイルのセットアップ

Docker Composeで開発環境を作成する際、サービスをセットアップまたはブートストラップするために、設定ファイルや初期化ファイルをサービスコンテナと共有する必要が生じることがよくあります。この方法により、アプリケーション開発中に設定ファイルを変更して環境を微調整することが容易になります。

これから、サービスコンテナの設定および初期化に使用されるファイルを含むフォルダをセットアップします。

Nginxをセットアップするには、アプリケーションの提供方法を設定するtravellist.confファイルを共有します。次のコマンドを使用して、docker-compose/nginxフォルダを作成します。

				
					
mkdir -p docker-compose/nginx

				
			

ディレクトリ内で、travellist.confという名前の新しいファイルを開きます。

				
					
nano docker-compose/nginx/travellist.conf

				
			

次のNginx設定をそのファイルにコピーします。

				
					
[label docker-compose/nginx/travellist.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;

 }

}

				
			

このファイルは、ポート80でリッスンし、index.phpをデフォルトのインデックスページとして使用するようにNginxを設定します。ドキュメントrootを/var/www/publicに設定し、Nginxがポート9000appサービスを使用して*.phpファイルを処理するように設定します。

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

MySQLデータベースをセットアップするために、コンテナの初期化時にインポートされるデータベースダンプを共有します。これは、コンテナで使用するMySQL 5.7イメージが提供する機能です。

docker-composeフォルダ内にMySQL初期化ファイル用の新しいフォルダを作成します。

				
					
mkdir docker-compose/mysql

				
			

新しい.sqlファイルを開きます。

				
					
nano docker-compose/mysql/init_db.sql

				
			

次のMySQLダンプは、LEMPでのLaravel ガイドで設定したデータベースに基づいています。placesという名前の新しいテーブルが作成されます。次に、テーブルに場所のサンプルデータが入力されます。

次のコードをファイルに追加します。

				
					
[label docker-compose/mysql/db_init.sql]

DROP TABLE IF EXISTS `places`;



CREATE TABLE `places` (

 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

 `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,

 `visited` tinyint(1) NOT NULL DEFAULT '0',

 PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;



INSERT INTO `places` (name, visited) VALUES ('Berlin',0),('Budapest',0),('Cincinnati',1),('Denver',0),('Helsinki',0),('Lisbon',0),('Moscow',1),('Nairobi',0),('Oslo',1),('Rio',0),('Tokyo',0);

				
			

placesテーブルには、idnamevisitedの3つのフィールドがあります。 visitedフィールドは、まだ*訪れていない*場所を識別するために使用されるフラグです。必要に応じてサンプルの場所を変更したり、新しい場所を加えたりしてください。完了したら、ファイルを保存して閉じます。

アプリケーションのDockerfileとサービス設定ファイルのセットアップを完了しました。次に、サービスの作成時にこれらのファイルを使用するように、Docker Composeを設定します。

ステップ5 — Docker Composeを使用したマルチコンテナ環境の作成

Docker Composeを使用すると、Dockerで実行されるアプリケーション用のマルチコンテナ環境を作成できます。*サービス定義*を使用して、ネットワークやデータボリュームを共有できる複数のコンテナで完全にカスタマイズ可能な環境を構築します。これにより、アプリケーションコンポーネント間のシームレスな統合が可能になります。

サービス定義を設定するために、docker-compose.ymlという新しいファイルを作成します。通常、このファイルはアプリケーションフォルダのrootにあり、コンテナの構築に使用するベースイメージ、およびサービスの相互作用など、コンテナ化された環境を定義します。

docker-compose.ymlファイルでappdbnginxの3つの異なるサービスを定義します。

appサービスは、既に作成したDockerfileに基づいて、travellistというイメージを作成します。このサービスで定義されたコンテナは、php-fpmサーバーを実行してPHPコードを解析し、結果を別のコンテナで実行されるnginxサービスに返します。mysqlサービスは、MySQL 5.7サーバーを実行するコンテナを定義します。このサービスは、travellistというブリッジネットワークを共有します。

アプリケーションファイルは、バインドマウントによってappサービスとnginxサービスの両方で同期されます。バインドマウントは、ホストマシンとコンテナ間で優れたパフォーマンスの双方向同期を可能にするため、開発環境で役立ちます。

アプリケーションフォルダーのrootに新しいdocker-compose.ymlファイルを作成します。

				
					
nano docker-compose.yml

				
			

一般的なdocker-compose.ymlファイルは、バージョン定義で始まり、次にservicesノードが続き、その下にすべてのサービスが定義されます。共有ネットワークは、通常ファイルの最後に定義されます。

開始するには、このボイラープレートコードをdocker-compose.ymlファイルにコピーします。

				
					
[label docker-compose.yml]

version: "3.7"

services:





networks:

 <^>travellist<^>:

 driver: bridge

				
			

ここで、appdbnginxサービスを加えるようにservicesノードを編集します。

appサービス

appサービスは、travellist-appという名前のコンテナを設定します。Docker-compose.ymlファイルと同じパスにあるDockerファイルに基づいて、新しいDockerイメージを構築します。新しいイメージは、travellistという名前でローカルに保存されます。

アプリケーションとして提供されているドキュメントrootはnginxコンテナにありますが、appコンテナ内のどこかにアプリケーションファイルも必要なので、Laravel Artisanツールを使用してコマンドラインタスクを実行します。

次のサービス定義を、docker-compose.ymlファイル内のservicesノードの下にコピーします。

				
					
[label docker-compose.yml]

 app:

 build:

 args:

 user: <^>sammy<^>

 uid: <^>1000<^>

 context: ./

 dockerfile: Dockerfile

 image: <^>travellist<^>

 container_name: <^>travellist-app<^>

 restart: unless-stopped

 working_dir: /var/www/

 volumes:

 - <^>./:/var/www<^>

 networks:

 - <^>travellist<^>

				
			

これらの設定は次のことを行います。

  • build:この設定は、指定したパス(コンテキスト)とDockerfileを使用して、Docker Composeにappサービスのローカルイメージを構築するよう指示します。引数useruidはDockerfileに挿入され、ビルド時にユーザー作成コマンドをカスタマイズします。
  • image: 作成中のイメージに使用される名前。
  • container_name:サービスのコンテナ名を設定します。
  • restart:サービスが停止されない限り、常に再起動します。
  • working_dir:サービスのデフォルトディレクトリを/var/wwwに設定します。
  • volumes:現在のディレクトリの内容をコンテナ内の/var/wwwに同期する共有ボリュームを作成します。nginxコンテナ内にあるため、これはドキュメントrootではないことに注意してください。
  • networks:travellistというネットワークを使用するように、サービスを設定します。

dbサービス

dbサービスは、Docker Hubの構築済みのMySQL 5.7イメージを使用します。Docker Composeはdocker-compose.ymlファイルと同じディレクトリにある.env変数ファイルを自動的に読み込むため、前のステップで作成したLaravel .envファイルからデータベース設定を取得できます。

appサービスの直後に、servicesノードに次のサービス定義を加えます。

				
					
[label docker-compose.yml]

 db:

 image: <^>mysql:5.7<^>

 container_name: <^>travellist-db<^>

 restart: unless-stopped

 environment:

 MYSQL_DATABASE: <^>${DB_DATABASE}<^>

 MYSQL_ROOT_PASSWORD: <^>${DB_PASSWORD}<^>

 MYSQL_PASSWORD: <^>${DB_PASSWORD}<^>

 MYSQL_USER: <^>${DB_USERNAME}<^>

 SERVICE_TAGS: dev

 SERVICE_NAME: mysql

 volumes:

 - <^>./docker-compose/mysql:/docker-entrypoint-initdb.d<^>

 networks:

 - travellist

				
			

これらの設定は次のことを行います。

  • image:コンテナに使用するDockerイメージを定義します。この場合、Docker HubのMySQL 5.7イメージを使用してします。
  • container_name:サービスのコンテナ名をtravellist-dbに設定します。
  • restart:明示的に停止しない限り、 常にサービスを再起動します。
  • environment: 新しいコンテナで環境変数を定義します。Laravel .envファイルから取得した値を使用してMySQLサービスを設定します。これにより、指定された環境変数に基づいて新しいデータベースとユーザーが自動的に作成されます。
  • volumes:アプリケーションデータベースの初期化に使用される.sqlデータベースダンプを共有するボリュームを作成します。MySQLイメージは、コンテナ内の/docker-entrypoint-initdb.dディレクトリに配置された.sqlファイルを自動的にインポートします。
  • networks:travellistというネットワークを使用するように、サービスを設定します。

nginxサービス

nginxサービスでは、軽量LinuxディストリビューションであるAlpineに構築済みのNginxイメージを使用します。travellist-nginxという名前のコンテナを作成し、ports定義を使用して、ホストシステムのポート8000からコンテナ内のポート80へのリダイレクトを作成します。

dbサービスの直後に、servicesノードに次のサービス定義を加えます。

				
					
[label docker-compose.yml]

 nginx:

 image: <^>nginx:1.17-alpine<^>

 container_name: <^>travellist-nginx<^>

 restart: unless-stopped

 ports:

 - <^>8000:80<^>

 volumes:

 - <^>./:/var/www<^>

 - <^>./docker-compose/nginx:/etc/nginx/conf.d<^>

 networks:

 - travellist

				
			

これらの設定は次のことを行います。

  • image:コンテナに使用するDockerイメージを定義します。この場合、Alpine Nginx 1.17イメージを使用しています。
  • container_name:サービスのコンテナ名をtravellist-nginxに設定します。
  • restart:明示的に停止しない限り、 常にサービスを再起動します。
  • ports:ポート8000を介してコンテナ内のポート80で実行されているWebサーバーに外部アクセスできるようにポートリダイレクトを設定します。
  • volumes: 2つの共有ボリュームを作成します。1つ目は、現在のディレクトリの内容をコンテナ内の/var/wwwに同期します。このように、アプリケーションファイルにローカルの変更を加えると、コンテナ内のNginxが提供するアプリケーションにすぐに反映されます。2つ目のボリュームでは、docker-compose/nginx/travellist.confにあるNginx設定ファイルがコンテナ内のNginx設定フォルダにコピーされます。
  • networks:travellistというネットワークを使用するようにサービスを設定します。

完成したdocker-compose.ymlファイル

完成したdocker-compose.ymlファイルは次のようになります。

				
					
[label docker-compose.yml]

version: "3.7"

services:

 <^>app<^>:

 build:

 args:

 user: sammy

 uid: 1000

 context: ./

 dockerfile: Dockerfile

 image: travellist

 container_name: <^>travellist-app<^>

 restart: unless-stopped

 working_dir: /var/www/

 volumes:

 - ./:/var/www

 networks:

 - travellist



 <^>db<^>:

 image: mysql:5.7

 container_name: <^>travellist-db<^>

 restart: unless-stopped

 environment:

 MYSQL_DATABASE: ${DB_DATABASE}

 MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}

 MYSQL_PASSWORD: ${DB_PASSWORD}

 MYSQL_USER: ${DB_USERNAME}

 SERVICE_TAGS: dev

 SERVICE_NAME: mysql

 volumes:

 - ./docker-compose/mysql:/docker-entrypoint-initdb.d

 networks:

 - travellist



 <^>nginx<^>:

 image: nginx:alpine

 container_name: <^>travellist-nginx<^>

 restart: unless-stopped

 ports:

 - 8000:80

 volumes:

 - ./:/var/www

 - ./docker-compose/nginx:/etc/nginx/conf.d/

 networks:

 - travellist



networks:

 travellist:

 driver: bridge

				
			

完了したら、必ずファイルを保存してください。

ステップ6 — Docker Composeを使用してアプリケーションを実行する

これから、docker-composeコマンドを使用してアプリケーションイメージを構築し、セットアップで指定したサービスを実行します。

次のコマンドを使用して、appイメージを構築します。

				
					
docker-compose build app

				
			

このコマンドは、完了するまでに数分かかる場合があります。次のような出力が表示されます。

				
					
[secondary_label Output]

Building app

Step 1/11 : FROM php:7.4-fpm

 ---> fa37bd6db22a

Step 2/11 : ARG user

 ---> Running in f71eb33b7459

Removing intermediate container f71eb33b7459

 ---> 533c30216f34

Step 3/11 : ARG uid

 ---> Running in 60d2d2a84cda

Removing intermediate container 60d2d2a84cda

 ---> 497fbf904605

Step 4/11 : RUN apt-get update && apt-get install -y git curl libpng-dev libonig-dev ...

Step 7/11 : COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

 ---> e499f74896e3

Step 8/11 : RUN useradd -G www-data,root -u $uid -d /home/$user $user

 ---> Running in 232ef9c7dbd1

Removing intermediate container 232ef9c7dbd1

 ---> 870fa3220ffa

Step 9/11 : RUN mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user

 ---> Running in 7ca8c0cb7f09

Removing intermediate container 7ca8c0cb7f09

 ---> 3d2ef9519a8e

Step 10/11 : WORKDIR /var/www

 ---> Running in 4a964f91edfa

Removing intermediate container 4a964f91edfa

 ---> 00ada639da21

Step 11/11 : USER $user

 ---> Running in 9f8e874fede9

Removing intermediate container 9f8e874fede9

 ---> fe176ff4702b



Successfully built fe176ff4702b

Successfully tagged travellist:latest



				
			

ビルドが完了したら、次のコマンドを使用してこの動作環境をバックグラウンドモードで実行できます。

				
					
docker-compose up -d

				
			
				
					
[secondary_label Output]

Creating travellist-db ... done

Creating travellist-app ... done

Creating travellist-nginx ... done

				
			

これにより、コンテナがバックグラウンドで実行されます。アクティブなサービスの状態に関する情報を表示するには、次のコマンドを使用します。

				
					
docker-compose ps

				
			

出力は次のようになります。

				
					
[secondary_label Output]

 Name Command State Ports 

--------------------------------------------------------------------------------

<^>travellist-app<^> docker-php-entrypoint php-fpm Up 9000/tcp 

<^>travellist-db<^> docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp

<^>travellist-nginx<^> /docker-entrypoint.sh ngin ... Up 0.0.0.0:8000->80/tcp

				
			

これで動作環境が起動して稼働中になりましたが、アプリケーションのセットアップを完了するには、いくつかのコマンドを実行する必要があります。docker-compose execコマンドを使用して、ls -lなどのサービスコンテナ内のコマンドを実行し、アプリケーションディレクトリ内のファイルに関する詳細情報を表示できます。

				
					
docker-compose exec <^>app<^> <^>ls -l<^>

				
			
				
					
[secondary_label Output]

total 260

-rw-rw-r-- 1 sammy sammy 737 Jun 9 11:19 Dockerfile

-rw-rw-r-- 1 sammy sammy 101 Jan 7 08:05 README.md

drwxrwxr-x 6 sammy sammy 4096 Jan 7 08:05 app

-rwxr-xr-x 1 sammy sammy 1686 Jan 7 08:05 artisan

drwxrwxr-x 3 sammy sammy 4096 Jan 7 08:05 bootstrap

-rw-rw-r-- 1 sammy sammy 1501 Jan 7 08:05 composer.json

-rw-rw-r-- 1 sammy sammy 179071 Jan 7 08:05 composer.lock

drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 config

drwxrwxr-x 5 sammy sammy 4096 Jan 7 08:05 database

drwxrwxr-x 4 sammy sammy 4096 Jun 9 11:19 docker-compose

-rw-rw-r-- 1 sammy sammy 965 Jun 9 11:27 docker-compose.yml

-rw-rw-r-- 1 sammy sammy 1013 Jan 7 08:05 package.json

-rw-rw-r-- 1 sammy sammy 1405 Jan 7 08:05 phpunit.xml

drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 public

-rw-rw-r-- 1 sammy sammy 273 Jan 7 08:05 readme.md

drwxrwxr-x 6 sammy sammy 4096 Jan 7 08:05 resources

drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 routes

-rw-rw-r-- 1 sammy sammy 563 Jan 7 08:05 server.php

drwxrwxr-x 5 sammy sammy 4096 Jan 7 08:05 storage

drwxrwxr-x 4 sammy sammy 4096 Jan 7 08:05 tests

drwxrwxr-x 41 sammy sammy 4096 Jun 9 11:32 vendor

-rw-rw-r-- 1 sammy sammy 538 Jan 7 08:05 webpack.mix.js

				
			

次に、composer installを実行してアプリケーションの依存関係をインストールします。

				
					
docker-compose exec app <^>composer install<^>

				
			

出力は次のようになります。

				
					
[secondary_label Output]

Loading composer repositories with package information

Installing dependencies (including require-dev) from lock file

Package operations: 85 installs, 0 updates, 0 removals

 - Installing doctrine/inflector (1.3.1): Downloading (100%) 

 - Installing doctrine/lexer (1.2.0): Downloading (100%) 

 - Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%) 

 - Installing erusev/parsedown (1.7.4): Downloading (100%) 

 - Installing symfony/polyfill-ctype (v1.13.1): Downloading (100%) 

 - Installing phpoption/phpoption (1.7.2): Downloading (100%) 

 - Installing vlucas/phpdotenv (v3.6.0): Downloading (100%) 

 - Installing symfony/css-selector (v5.0.2): Downloading (100%) 

…

Generating optimized autoload files

> Illuminate\Foundation\ComposerScripts::postAutoloadDump

> @php artisan package:discover --ansi

Discovered Package: facade/ignition

Discovered Package: fideloper/proxy

Discovered Package: laravel/tinker

Discovered Package: nesbot/carbon

Discovered Package: nunomaduro/collision

Package manifest generated successfully.

				
			

アプリケーションをテストする前に最後に行う必要があるのは、 artisan Laravel コマンドラインツールを使用して一意のアプリケーションキーを生成することです。このキーは、ユーザーセッションやその他の機密性の高いデータを暗号化するために使用されます。

				
					
docker-compose exec app <^>php artisan key:generate<^>

				
			
				
					
[secondary_label Output]

Application key set successfully.

				
			

ここでブラウザに移動して、ポート8000でサーバーのドメイン名またはIPアドレスにアクセスします。

				
					
http://server_domain_or_IP:8000

				
			

:ローカルマシンでこのデモを実行している場合は、http://localhost:8000を使用して、ブラウザからアプリケーションにアクセスしてください。

以下のページが表示されます。

logsコマンドを使用して、サービスによって生成されたログをチェックできます。

				
					
docker-compose logs <^>nginx<^>

				
			
				
					
Attaching to <^>travellist-nginx<^>

…

travellist-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh

travellist-nginx | /docker-entrypoint.sh: Configuration complete; ready for start up

travellist-nginx | 192.168.0.1 - - [09/Jun/2020:11:46:34 +0000] "GET / HTTP/1.1" 200 627 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"

travellist-nginx | 192.168.0.1 - - [09/Jun/2020:11:46:35 +0000] "GET / HTTP/1.1" 200 627 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"

				
			

すべてのサービスの状態を維持したまま、Docker Compose環境を一時停止する場合は、次のコマンドを使用します。

				
					
docker-compose pause

				
			
				
					
[secondary_label Output]

Pausing travellist-db ... done

Pausing travellist-nginx ... done

Pausing travellist-app ... done

				
			

その後、次のコマンドを使用してサービスを再開できます。

				
					
docker-compose unpause

				
			
				
					
[secondary_label Output]

Unpausing travellist-app ... done

Unpausing travellist-nginx ... done

Unpausing travellist-db ... done

				
			

Docker Composeの環境をシャットダウンし、コンテナ、ネットワーク、ボリュームをすべて削除するには、次のコマンドを使用します。

				
					
docker-compose down

				
			
				
					
[secondary_label Output]

Stopping travellist-nginx ... done

Stopping travellist-db ... done

Stopping travellist-app ... done

Removing travellist-nginx ... done

Removing travellist-db ... done

Removing travellist-app ... done

Removing network travellist-laravel-demo_travellist

				
			

すべてのDocker Composeコマンドの概要については、Docker Composeコマンドラインリファレンスを参照してください。

まとめ

このガイドでは、Docker Composeを使用して3つのコンテナでDocker環境を設定し、YAMLファイルにインフラストラクチャを定義しました。

今後は、開発・テスト用にローカル Webサーバーをインストールおよびセットアップする必要なく、Laravelアプリケーションで作業できます。さらに、複製や分散が容易な使い捨てできる環境で作業することもできるので、アプリケーションの開発や実稼働環境への移行に役立ちます。