この記事では、Dockerを使って最小限のコードでローカル開発環境を構築する方法(Apache)をご紹介します。
この記事を読めば、以下のことができるようになります。
- Dockerを使ってLaravelのローカル開発環境を構築し、Laravelのデフォルト画面を表示する
- Laravelからローカルのデータベースコンテナに接続する
なるべく細かく丁寧に説明するので、参考にして頂けると幸いです。
- Apache:2.4.38
- PHP:8.0.5
- Laravel:8.40.0
- MySQL:8.0
Laravel開発環境をDockerを使ってサクッと構築する【最小限のコード】
「Dockerを使って開発環境でLaravelのデフォルト画面を表示する + ローカルのデータベースコンテナと接続する」を目標に、最小構成でのLaravel環境構築を目指します。
最終的なディレクトリ構成は以下です。
以下の順にファイルの生成と動作確認を行います。
- Dockerfileの作成
- docker-compose.yamlの作成
- Laravelのインストール
- 画面表示確認
- データベース接続確認
Dockerfileの作成
まず最初に、Dockerfile(ベースイメージをカスタマイズして独自のDockerイメージを作るためのファイル)を作成します。
laravel-dockerの下にdockerディレクトリを作成し、dockerディレクトリの下に以下のDockerfileを記述して下さい。
FROM php:8.0-apache COPY --from=composer:latest /usr/bin/composer /usr/bin/composer RUN apt-get update && apt-get install -y \ git \ && docker-php-ext-install pdo_mysql RUN sed -i 's!/var/www/html!/var/www/app/public!g' /etc/apache2/sites-available/000-default.conf
簡単にコードの説明をします。
FROMではベースとなるイメージを指定します。
今回はApacheの拡張(モジュール版)としてPHPを実行します。バージョンは、現在(2021/5)のPHPのサポートバージョンである8.0を選択しました。
COPYでは、マルチステージビルドという手法でコンテナ内にComposer(PHPのパッケージ管理ツールでLaravelをインストールする際に使う)をインストールしています。
マルチステージビルドとは、Dockerイメージの一部を別のイメージで使用する手法のことです。
例えば今回だと、--from=composer:latest
でイメージを指定し、その中の/usr/bin/composer
を今回作成するコンテナ内の/usr/bin/composer
にコピーしています。
この手法は裏技でもなんでもなく、DockerHubのComposerのところでも紹介されている手法です。
一つ目のRUNでは、必要なパッケージとPHP拡張モジュールをインストールしています。
今回はComposerを使ってLaravelをインストールする際に必要なgitと、LaravelからMySQLコンテナに接続する際に必要なPHPのMySQL拡張をインストールしています。
二つ目のRUNではsedコマンドを使ってApacheのドキュメントルート(Webサーバがリクエストを流す場所)を書き換えています。
Laravelの場合は、publicディレクトリ配下のindex.phpで最初にリクエストを処理する仕様になっているため、Apacheドキュメントルートにpublicディレクトリを指定する必要があります。
今回はsedコマンド(ファイル内の記述を置換するコマンド)を使って000-default.conf内の/var/www/htmlを/var/www/app/publicに書き換えました。
docker-compose.yamlの作成
laravel-dockerの下に、以下の構成でdocker-compose.yamlを作成して下さい。
version: '3' services: app: build: ./docker ports: - 80:80 volumes: - ./app:/var/www/app working_dir: /var/www/app db: image: mysql:8.0 ports: - 3306:3306 environment: MYSQL_DATABASE: database MYSQL_USER: user MYSQL_PASSWORD: pass
簡単にコードの説明をします。
versionはdocker-compose.yamlのバージョンです。
servicesでは、立てるコンテナ群を指定します。今回はアプリ用のappコンテナとデータベース用のdbコンテナを立てます。
次に、appコンテナの説明です。
buildでは、コンテナを作る素となるDockerイメージを作成するのに使うDockerfileの位置を指定します。
今回はdockerディレクトリ配下にDockerfileを作成したので、./dockerを指定しています。
portsでは、割り当てるポート番号を指定します。
左側がホスト側のポート番号で、右側がコンテナ側のポート番号です。
これを設定しておくことにより、ホスト側から80番ポートでコンテナ側の80番ポートにアクセスできます。(ポートフォワーディング)
volumesではコンテナ内に配置するローカルのファイルを指定します。
今回は、Laravelのコードを配置するappディレクトリをコンテナ内のvar/www配下に置いています。
この設定により、コンテナ内での操作(ファイルの作成や変更など)がローカルのファイルにも反映されます。
working_dirでは、コンテナに入った際のデフォルトのディレクトリを指定します。
この設定により、execコマンドでコンテナに入った際に、/var/www/appから操作をスタートすることができます。
次に、dbコンテナです。
imageではコンテナを作るのに必要なDockerイメージを指定します。
コンテナを作る際には、DockerイメージかDockerfileのどちらかを必ず指定する必要があります。(コンテナの素(Dockerイメージ)が無い状態でコンテナは作れません)
environmentではコンテナの環境変数を指定します。
今回は、Laravelからデータベース(MySQLコンテナ)に接続するために必要な接続情報を設定しました。
必要なファイルの作成は以上です。
Laravelのインストール
次に、コンテナを立ち上げて、Laravelをインストールしていきます。
以下のコマンドを実行してコンテナを立ち上げて下さい。
docker-compose up -d
コンテナが立ち上がったら、以下のコマンドでappコンテナに入りましょう。
docker-compose exec app bash
コンテナに入ったら、appディレクトリ配下にLaravelのコードをインストールしていきます。
var/www/appにいる状態で以下のコマンドを実行して下さい。
composer create-project laravel/laravel .
参考:Laravelアプリをカレントディレクトリ配下にインストールする方法
ローカルのappディレクトリ配下にLaravelのコード群が生成されていたらOKです。
画面表示確認
ここまで設定できたら、Laravelのデフォルト画面が表示できるはずです。
以下のURLをブラウザの検索窓に打ち込んで下さい。
Laravel(8.x)のデフォルト画面が表示されていたらOKです。
http://localhost:80
データベース接続確認
次に、データベース接続の確認をしていきます。
Laravelからデータベースに接続するには、Laravel内の.envファイル(環境情報を記述するファイル)に以下の設定を記述します。(docker-compose.yamlでdbコンテナに設定した値です)
DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=database DB_USERNAME=user DB_PASSWORD=pass
これでDBコンテナには接続できるはずです。マイグレーションを実行して確かめてみましょう。
コンテナ内で以下のコマンドを実行して下さい。
php artisan migrate
以下の様にマイグレーションを実行できたら、データベースコンテナへの接続は上手くいっています。
Laravel開発環境をDockerを使ってサクッと構築する まとめ
今回は、以下を達成することを目標に、Laravelの開発環境構築をしました。
- Dockerを使ってLaravelのローカル開発環境を構築し、Laravelのデフォルト画面を表示する
- ローカルのデータベースコンテナと接続する
そして、Laravelのデフォルト画面を表示し、データベースとも接続することができました。
ただ、これだけでLaravelに関する全ての設定がOKな訳ではありません。
例えば、Laravelのデフォルト画面以外を表示させる場合には、Apacheのrewriteモジュールを有効にする必要があります。(DockerfileにRUN a2enmod rewrite
を追加)
その他、必要な機能によって、追加でモジュールやライブラリをインストールする必要も出てくるでしょう。
そのため、今回の実装はあくまで「最低限のもの」と捉えて、必要なときに必要なコードを追加して頂けるとありがたいです。
今回は以上となります。
この記事が少しでもDockerでLaravelの開発環境を構築する際の参考になっていれば幸いです。
Twitterで発信中!
Twitterでプログラミング学習やブログ運営に関するTipsを発信しています。
ぜひフォローをお願いします!
とても参考になりました
ありがとうございます!!
ありがとうございます!