2020/02/05これならわかるDocker上にLaravel環境構築Docker上にLaravelの開発環境を構築したい場合に最初に思いつくのはLaradockしれません。手順通りに進めれば環境を構築することができたが何がどのように設定されているのかわからない人も多いと思います。本文書ではDockerについての基礎を学びながらできるだけシンプルにLaravel環境の構築を行っていきます。最初にLaravelコンテナ単体で動作確認を行い、MySQLコンテナ、Nginxコンテナを追加して最終的には3つのコンテナで動作する環境を構築します。作業はMac環境で行い、docker、docker-composeコマンドが利用できる状態から開始します。最初にLaravelコンテナの作成を行い、インストール後に表示されるトップ画面、ユーザ登録画面の表示までの手順を確認していきます。任意の場所にプロジェクトディレクトリlaravel_dockerを作成し、作成したディレクトリに移動します。本環境では/Users/reffect/Desktopの下に作成しています。laravel_dockerdocker-compose.ymlファイル作成Laravelのインストールを行うコンテナを作成するためにdocker-compose.ymlを作成します。docker-compose.ymlを利用することで複数のコンテナを一度に作成、制御することが可能になり効率的に環境構築を行うことができます。Nginxの設定に必要な情報もこのファイルに追記していきます。作成したdocker-compose.ymlの内容は下記の通りです。"8000:8000"versionではdocker-composeのフォーマットにはバージョンがあり、現在最新である3.7を指定しています。バージョンにより記述方法が異なります。servicesにphpが設定されていますが、このphpがコンテナを表しており、container_nameではコンテナの名前を指定しています。phpというコンテナ名で他のコンテナと区別することができます。後ほど追加するデータベースはdb、WebサーバのNginxはnginxとしてservicesを設定します。buildの下のcontextとdockerfileはイメージをビルドするために必要な情報が記述されたDockerfileへのパスとファイル名を指定しています。contextの.(ドット)はdocker-compose.ymlと同じディレクトリを意味し、dockerfileのDockerfileはファイル名を指定しています。docker-compose.ymlディレクトリの中にあるDockerfileをビルドで利用することになります。volumesではローカルのディレクトリとコンテナ上のディレクトリのリンクを設定しています。./srcはdocker-composer.ymlのディレクトリ直下にあるsrcを設定しています。コンテナが作成されるとsrcディレクトリからコンテナの/var/www/htmlにアクセスすることができます。portsではローカル側のポートとコンテナ側のポートを設定しています。8000ポートにアクセスするとコンテナ側の8000にアクセスすることができます。DockerfileについてDockerfileにはコンテナに利用するイメージ情報とそのイメージに追加するパッケージや構成変更を行うコマンド等を記述することができます。イメージ情報に構築するユーザ毎の個別の設定を追加しておくことで全く同じ環境を容易に構築することができます。pdo_mysqlコマンドが記述されています。LaravelではPHPを利用するためphp:7.4-fpm-alpineのイメージを利用します。pdo_mysqlコンテナの作成docker-compose.ymlとDockerfileが作成できたので、docker-composeコマンドを利用してコンテナの作成を行います。docker-composeコマンドは実行時にdocker-compose.ymlファイルの中身を確認するためのdocker-compose.ymlファイルが存在するディレクトリで実行してください。-dイメージ(php:7.4-fpm-alpine)がローカルにない場合はダウンロードを行い、ビルドを行うので初回は少し時間がかかります。2回目からはダウンロードしたイメージを利用するため短い時間で処理が完了します。-aコマンドを実行すると作成したコンテナのステータスを確認することができます。Statu列がUpになっているので起動していることがわかります。9000/tcpLaravelのインストールコンテナの作成が完了したので、Laravelのインストールを行います。Laravelをコンテナ上にインストールするためにはcomposerが必要になります。composerもDockerのコンテナを利用することができます。composerはDockerfileでインストールすることもできます。composerコンテナを利用して./srcディレクトリにLaravelのインストールを行います。.–rmを付けて実行するとコンテナ作成後処理が完了すると自動で削除されます。コマンドを実行しても削除されているためcomposerコンテナの情報は表示されません。-vオプションでは、ローカルPCのディレクトリとcomposerコンテナ上の/appディレクトリを紐づけています。そのため上記のコマンドを実行すると./srcディレクトリの下にLaravelに関連するディレクトリ、ファイルが保存されます。/appを別の場所に設定して実行すると./srcディレクトリには何も保存されません。開発サーバの起動Webサーバの設定を行っていないので開発サーバを起動することでLaravelのトプ画面を表示できるように下記の設定を行います。コマンドでphpコンテナのコマンドをローカルから実行することができます。serveだけではローカルアクセスできないので注意してください。0.0.0.0:8000)にアクセスするとトップ画面が表示されます。Laravelの初期画面laravel/uiパッケージのインストールユーザの認証の画面を作成するために必要となるlaravel/uiパッケージのインストールを行います。PHPのパッケージのインストールにはcomposerが必要となるのでLaravelのインストールと同様にcomposerコンテナを利用します。artisanコマンドを実行します。このコマンドで認証画面の追加が行われます。devでJavaScript関係パッケージのインストールとビルドが必要になります。nodeコンテナの利用npmコマンドを利用するためにはnodeが必要になります。nodeもcomposerと同様にコンテナを利用して実行します。devnodeもcomposerと同様にDockerfile内でインストールを行い、Laravelのコンテナ上から実行することは可能です。composerの場合は-vで/appを指定していましたが、nodeの場合は/usr/src/appを指定した上、-w(working_dir)で/usr/src/appを指定しています。実行するとインストールとビルドが行われます。開発サーバを起動した状態でアクセスするとログイン画面を表示することができます。Laravelログイン画面ログイン画面が表示されましたが、ユーザを登録を行うとエラーが発生します。理由はLaravelからデータベースに接続することができないためです。次はMySQLコンテナを追加します。MySQLコンテナの作成MySQLコンテナを利用してLaravel上で生成されるデータを保存します。docker-compose.ymlファイルへの追加sericesにmysqlを追加します。laravelLaravelコンテナの場合はdockerfileを利用しましたが、MySQLコンテナではイメージをそのまま使うためimageでmysql:5.7を設定しています。5.7はMySQLのバージョンを表しています。mysql:latestと設定すると最新版になります。コンテナ名であるcontainer_nameはmysqlを設定しています。portsはMySQLのデフォルトポートの3306を利用しローカル環境から3306ポートを使ってMySQLのデータベースに接続することができます。ローカルでMySQLデータベースが動作している場合は3307:3306を設定してポートが重複しないようにしてください。volumesには2つ設定していますが、./dbにはMySQLコンテナに保存されているデータとローカルディレクトリの./dbを紐づけています。my_confはMySQLコンテナの設定ファイルが保存されているディレクトリと紐づけています。environmentではMySQLのrootユーザのパスワードとデータベースの設定のみ行っています。Volumesの作成docker-compose.ymlで設定したdbとmy_confディレクトリを作成します。my_confmy_confの下には設定ファイルmysql5.7.cnfファイルを作成し、日本語対応できるように文字コードの設定を行います。[mysqld]character-set-server=utf8mb4[client]default-character-set=utf8mb4MySQLコンテナの作成MySQLコンテナを作成する前に一度Laravelコンテナの削除をしておきます。downコマンドを実行するとコンテナの停止と削除を同時に行います。laravel_docker_defaultLaravelコンテナとMySQLコンテナを作成します。-dコマンドで2つのコンテナが作成されます。done作成したら正常に起動しているか確認しておきます。コンテナ名を実行してログを確認してください。Laravelからの接続Laravelから接続するためにはデータベースの環境変数が記述されている.envファイルを更新する必要があります。srcディレクトリ内にある.envファイルを開いてデータベースの接続に関する設定を下記のように更新してください。DB_CONNECTION=mysqlDB_HOST=mysqlDB_PORT=3306DB_DATABASE=laravelDB_USERNAME=rootDB_PASSWORD=passwordDB_HOSTにはIPアドレスではなくmysqlが設定されています。これはDocker上でphpとmysqlが同じネットワーク上にいる場合に利用することができます。ネットワークはdocker-compose.ymlで明示的に指定していない場合はデフォルトでプロジェクト名_defaultで作成されます。本環境ではlaravel_docker_defaultとなります。lsコマンドで確認することができます。laravel_docker_defaultで確認できます。migrateコマンドを実行してデータベースにテーブルが作成されるか確認しましょう。接続が正常に行われた場合は下記のようなメッセージが表示されます。seconds)ここまでの設定でLaravelコンテナとMySQLコンテナな接続完了です。次はNginxコンテナの作成を行います。Nginxコンテナの作成ここまでは開発サーバを起動してLaravelへアクセスを行っていましたがNginxコンテナを作成し、Webサーバ経由でLaravelにアクセスします。docker-compose.ymlファイルへの追加docker-compose.ymlへの追加についてはphpとMySQLコンテナと同じです。mysqlnginxではimageはnginxのstable-alpineを使います。コンテナ名のcontainer_nameにはnginxを設定します。ポートはローカルから8080でアクセスできるように8080:80を設定しています。volumesの設定の1つはphpと同じ設定を行っています。一つはnginxの設定ファイルを指定します。設定ファイルはこの後作成します。phpのポートを先ほどまで8000:8000に設定していましたが、9000:9000に変更を行ってください。Nginxと通信する際にポート9000を利用するためです。nginxの設定ファイルの作成ローカル上に設定ファイルを保存するnginxディレクトリを作成します。nginxnginxディレクトリにはNginxの設定ファイルdefault.confファイルを作成し、下記のように記述します。}}設定している中身はDockerではなくNginxに関する設定なので詳細は説明しませんが、rootの箇所の/var/www/html/publicがlaravelのインストールディレクトリの下にあるpublicと一致する必要があります。コンテナの作成Nginxの設定が完了したので、コンテナの作成を行いますが作成を行う前に先ほど作成したLaravelとMySQLのコンテナは削除しておきます。laravel_docker_defaultコンテナを削除する際にネットワークのlaravel_docker_defaultも一緒に削除されていることが確認できます。コンテナの作成を行います。done起動しているか確認を行います。起動後ブラウザから127.0.0.1:8080にアクセスしてLaravelのトップページが表示されたらNginx経由でLaravelにアクセスしていることになります。ユーザの登録やログインが行えるか一通り動作確認を行ってください。トップ以外のloginやregisterで404が表示される時はNginxの設定ファイルの記述に間違いがある場合があります。ここまでの設定でLaravelにNginx経由でアクセスしMySQLデータベースへのデータの登録まで行えることを確認しました。シンプルなdocker-compose.ymlなので各自の要件に合うようにカスタマイズを行ってください。