LaravelとDockerで開発環境を自作!Dockerfileとdocker-composeの設定ガイド
生徒
「Laravelの開発環境を作りたいのですが、Dockerを使って自分で設定ファイルを作るのは難しいですか?」
先生
「Dockerを使えば、パソコンの中を汚さずに自分専用の開発用サーバーを作ることができます。Dockerfileとdocker-compose.ymlという二つの設計図を用意するだけで大丈夫ですよ。」
生徒
「設計図ですね!初心者でもゼロから作成することは可能でしょうか?」
先生
「もちろんです。一つずつの項目の意味を丁寧に解説しながら、環境構築の手順を見ていきましょう!」
1. DockerとLaravelの関係を知ろう
プログラミングを始めるときに、一番最初にぶつかる壁が環境構築です。これは、自分のパソコンでプログラムが動くように、必要な道具を揃える作業のことです。Laravel(ララベル)はPHPという言葉で動く道具ですが、これに加えてデータベースやWebサーバーなど、たくさんの準備が必要になります。
ここで登場するのがDocker(ドッカー)です。Dockerは、パソコンの中に仮想の「魔法の箱(コンテナ)」を作り、その中でプログラムを動かす技術です。この箱を使えば、あなたのパソコンの設定を変えることなく、プロの本番環境と同じ状態を簡単に作り出すことができます。この箱を作るための手順書が、今回作成するDockerfile(ドッカーファイル)とdocker-compose.yml(ドッカーコンポーズ)です。
初心者の方は「難しそう」と感じるかもしれませんが、一度作ってしまえば、新しいパソコンに買い替えても、同じファイルをコピーするだけで一瞬で開発が始められるようになる非常に便利な技術です。まずは、この箱の中身をどう定義するかを学んでいきましょう。
2. Dockerfileの役割と基本設定
Dockerfileは、一つの箱(コンテナ)の中身を詳しく指定する料理のレシピのようなものです。「PHPのバージョンは何にするか」「どんな追加機能をインストールするか」を一行ずつ書いていきます。Laravelを動かすためには、PHPというプログラミング言語本体に加えて、データベースと通信するための拡張機能が必要になります。
まず、基本となる土台(ベースイメージ)を決めます。これは「OS(オペレーティングシステム)」のようなもので、今回はPHPが最初から入っているイメージを使います。そこに、Laravelが推奨する設定を書き加えていく流れになります。例えば、ファイルの読み書きを許可する設定や、インターネットから必要な部品をダウンロードする命令などを記述します。
以下は、Laravelを動かすための最小限のDockerfileの例です。まずは、プロジェクトのフォルダの中に「Dockerfile」という名前のファイルを作ってみましょう。
# 1. 土台となるPHPのバージョンを指定
FROM php:8.2-fpm
# 2. サーバーの中で作業する場所(ディレクトリ)を決める
WORKDIR /var/www
# 3. Laravelに必要な拡張機能をインストールする命令
RUN apt-get update && apt-get install -y \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
zip \
unzip \
git \
curl \
&& docker-php-ext-install pdo_mysql gd
# 4. パッケージ管理ツール「Composer」を別の場所からコピーしてくる
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
このファイルを作成することで、Dockerに対して「PHP8.2を使い、画像処理やデータベース通信ができるように準備して、Composerという便利な道具も入れておいてね」と頼むことができるようになります。これが、あなた専用のLaravelサーバーの基礎となります。
3. docker-compose.ymlで複数の箱を連携させる
Laravelを動かすには、PHPが入った箱だけでは足りません。データを保存する「データベース」の箱や、インターネットからのリクエストを受け取る「Webサーバー(Nginxなど)」の箱など、複数の箱を組み合わせて使うのが一般的です。これら複数の箱をまとめて管理するのがdocker-compose.ymlというファイルです。
yml(ヤムル)形式という書き方で、どの箱とどの箱をつなげるかを記述します。例えば「PHPの箱は8080番のドア(ポート)で外の世界とつながる」「データベースのパスワードはこれにする」といった全体の設定を行います。これを設定することで、コマンド一つで全ての箱が同時に起動し、互いに協力して動くようになります。
初心者の方は、まず「複数のアプリを合体させる司令塔」だとイメージしてください。以下に、PHP(Laravel)とデータベース(MySQL)をセットにした設定例を紹介します。
version: '3.8'
services:
# アプリケーション(PHP)の箱
app:
build:
context: .
dockerfile: Dockerfile
image: my-laravel-app
container_name: laravel-app
volumes:
- .:/var/www
networks:
- laravel-network
# データベース(MySQL)の箱
db:
image: mysql:8.0
container_name: laravel-db
environment:
MYSQL_DATABASE: laravel_db
MYSQL_ROOT_PASSWORD: password
networks:
- laravel-network
networks:
laravel-network:
driver: bridge
このように記述することで、app(アプリ)とdb(データベース)という2つのコンテナが誕生し、内部で通信できるようになります。volumes(ボリューム)という設定は、自分のパソコンにあるプログラムファイルをDockerの箱の中に同期させるための仕組みで、コードを書き換えるとすぐに箱の中に反映されるようになります。
4. Webサーバー(Nginx)の設定を追加しよう
実は、PHPの箱だけではブラウザからアクセスして画面を見ることはできません。外部からの「このページを見せて!」という要求を交通整理するWebサーバー(Nginx:エンジンエックスなど)が必要です。通常、実務ではNginxというソフトウェアを別の箱として用意します。
Nginxの設定ファイルは少し複雑に見えますが、基本的には「どのURLに来たら、どのPHPファイルに処理を渡すか」を指示するだけです。これを設定しないと、ブラウザでアクセスしても真っ白な画面やエラーが出てしまいます。Dockerでは、このNginxも一つの独立した箱として追加し、先ほどのdocker-compose.ymlに追記する形で利用します。
具体的には、設定ファイル(default.confなど)を作成し、それをNginxのコンテナに読み込ませます。初心者のうちは、この交通整理のおかげで、安全にウェブサイトが表示されているのだと理解しておけば十分です。Dockerなら、設定を間違えてもコンテナを消して作り直すだけなので、パソコンが壊れる心配はありません。安心して試行錯誤してみましょう。
5. コンテナを起動して接続確認する方法
設定ファイルができたら、いよいよ魔法の箱を起動します。パソコンの「ターミナル」や「コマンドプロンプト」という、文字で命令を出す画面を開いて、魔法の言葉(コマンド)を打ち込みます。Dockerの操作は非常にシンプルで、基本的には数種類のコマンドを覚えるだけで運用できます。
コンテナを起動するコマンドは docker-compose up -d です。このコマンドを打つと、Dockerfileの内容に従って材料がダウンロードされ、組み立てが始まります。初回は少し時間がかかりますが、二回目以降は一瞬で起動します。起動が成功すれば、自分のパソコンの中に小さなサーバーが立ち上がったことになります。
正しく動いているか確認するために、以下のコマンドを使ってみましょう。これは現在動いている箱の一覧を表示する命令です。
CONTAINER ID IMAGE STATUS PORTS
abc123456789 my-laravel-app Up 10 minutes 9000/tcp
def987654321 mysql:8.0 Up 10 minutes 3306/tcp
「STATUS」が「Up」になっていれば、無事に起動しています!これで、Laravelを動かすための土台が整いました。次は、この箱の中でLaravelのプログラムを実際にインストールしていく作業に移ることになります。自分の手で作った環境が動き出す瞬間は、プログラミング学習の中で最もワクワクする場面の一つです。
6. データベースとの接続設定を修正する
コンテナが動いたら、次はLaravel側で「データベースはどこにあるの?」という設定を教えてあげる必要があります。Laravelには .env(ドットエンブ)という、秘密の設定を書き込むためのファイルがあります。ここで、先ほどdocker-compose.ymlで決めたデータベースの名前やパスワードを指定します。
ここで初心者が間違えやすいポイントがあります。通常、自分のパソコンで動かすときはデータベースの場所を localhost と書きますが、Dockerの場合は違います。Dockerの世界では、箱に付けた名前(今回の例では db)がそのまま住所になります。箱同士がお互いの名前で呼び合えるようになっているのです。この設定を間違えると、データベースに接続できずエラーになってしまいます。
以下は、Laravelの .env ファイルをDocker環境用に書き換える際のコード例です。ここを正しく設定することで、データの保存や読み込みができるようになります。
# データベース接続の設定
DB_CONNECTION=mysql
# ここを localhost ではなく、docker-composeで決めたサービス名にする
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=password
このように設定を合わせることで、プログラムとデータベースが連携し、ユーザー登録やブログ投稿などの機能が正常に動作するようになります。連携がうまくいかないときは、スペルミスがないか、パスワードが一致しているかをじっくり確認してみましょう。
7. Artisanコマンドをコンテナ内で実行する
Laravelには、開発を助けてくれる Artisan(アルチザン) という便利なコマンドがあります。例えば、データベースのテーブル(表)を作成したり、キャッシュをクリアしたりするときに使います。しかし、Dockerを使っている場合、自分のパソコンにPHPが入っていないことが多いため、そのままコマンドを打っても動きません。
コマンドは「Dockerの箱の中」で実行させる必要があります。そのためには、docker-compose exec という命令を頭に付けます。これは「指定した箱の中で、この命令を実行してきて!」という指示になります。最初は少し面倒に感じるかもしれませんが、慣れてしまえば「箱の中の職人に仕事を頼む」ような感覚でスムーズに操作できるようになります。
例えば、データベースのマイグレーション(テーブル作成)を行うときは、以下のように入力します。これにより、自分のパソコンではなく、Dockerの中にあるPHPとデータベースが動き出し、正しく処理が行われます。
# docker-compose exec [サービス名] [実行したいコマンド]
docker-compose exec app php artisan migrate
この仕組みを理解すると、Docker環境を自由自在に操れるようになります。自分のパソコンの環境を汚さず、安全に色々なコマンドを試せるのがDockerの最大のメリットです。たくさん失敗しても、コンテナを作り直せばすぐに元通りになりますので、積極的に色々なコマンドを試していきましょう。
8. エラーが起きた時の対処法とログの確認
環境構築にエラーは付きものです。画面が動かない、接続できないといったトラブルが起きたとき、初心者が最も頼りにすべきなのがログ(記録)です。Dockerには、それぞれの箱が「今何をしているか」「どこで困っているか」をリアルタイムで表示する機能があります。これを見れば、エラーの原因がすぐに見つかることが多いです。
例えば、データベースの起動に失敗しているのか、それともPHPの書き方が間違っているのかを切り分けることができます。エラーメッセージをコピーして検索エンジンで調べれば、世界中の誰かが解決策を教えてくれています。プログラミングは、この「調べて解決する」作業の繰り返しで上達していきます。
ログを確認するためのコマンドは docker-compose logs -f です。これを使うと、各コンテナの出力がまとめて表示されます。困ったときはまずこのコマンドを打ち、赤い文字や「Error」という単語が出ていないか探してみましょう。原因がわかれば、解決への道筋が見えてきます。一歩ずつ、確実に知識を積み重ねていきましょう。
まとめ
今回の記事では、Laravel(ララベル)の開発環境をDocker(ドッカー)を使ってゼロから自作する方法について詳しく解説してきました。環境構築はプログラミング学習において最初の大きなハードルですが、Dockerを活用することで、個々のPC環境に依存しない、堅牢で再現性の高い開発基盤を手に入れることができます。
Docker導入によるメリットの再確認
従来の開発環境構築では、自分のパソコンに直接PHPやMySQLをインストールする必要がありました。しかし、この方法ではプロジェクトごとにバージョンが異なると管理が非常に困難になります。Dockerを利用すれば、Dockerfileに記述した設計図を基に、必要なミドルウェアをコンテナとして分離して管理できるため、システム全体をクリーンに保つことが可能です。
特に、docker-compose.ymlを利用した複数コンテナのオーケストレーションは、モダンなWeb開発において必須のスキルと言えます。PHPを動かすためのアプリケーションコンテナ、データを蓄積するデータベースコンテナ、そしてリクエストを制御するWebサーバーコンテナを一つのネットワーク内で連携させる仕組みは、実務現場でのサーバー構成そのものです。
実践的な設定のポイント
設定において最も重要なのは、コンテナ間の通信設定です。.envファイルにおけるDB_HOSTの設定をlocalhostではなく、docker-composeで定義したサービス名(例:db)に書き換える点は、初心者が最も躓きやすいポイントです。また、コンテナ内で実行されるArtisanコマンドの扱いについても、docker-compose execを介して命令を送るというDocker特有の作法をマスターすることが、スムーズな開発への近道となります。
さらに一歩進んだ環境構築のために
基本の構成に慣れてきたら、次はRedisを用いたキャッシュ機能の追加や、Mailpit(旧MailHog)を使ったメール送信テスト環境の構築など、さらなる機能拡張に挑戦してみましょう。Dockerであれば、新しいツールを試したい時も、設定ファイルに数行追記して再起動するだけで、即座に環境をアップデートできます。
エラーが発生した際には、焦らずにログを確認する癖をつけましょう。コンテナが正常に動作しない原因の多くは、ポートの競合やタイポ(打ち間違い)です。この記事で紹介したデバッグ手法を活用し、トライアンドエラーを繰り返すことで、インフラ構築のスキルは着実に向上していきます。
サンプルコード:開発効率を上げる便利なコマンド集
日常的な開発で頻繁に使用するコマンドをまとめておきます。これらをシェルスクリプトやエイリアスに登録しておくと、さらに作業効率が向上します。
// Laravelのマイグレーションとシードを一気に実行する
// docker-compose exec app php artisan migrate:fresh --seed
// キャッシュを完全にクリアして環境をリフレッシュする
// docker-compose exec app php artisan optimize:clear
// コンテナを停止し、作成されたボリューム(データ)も一緒に削除する
// docker-compose down --volumes
本ガイドの内容をマスターすれば、あなたはもう環境構築に怯える必要はありません。自分専用の最強の開発環境を手に、素晴らしいLaravelアプリケーションの開発をスタートさせてください。
生徒
「先生、ありがとうございました!Dockerfileとdocker-compose.ymlを作成して、無事にLaravelのウェルカム画面を表示させることができました!」
先生
「素晴らしいですね。初めての環境構築成功、おめでとうございます!実際に動かしてみて、何か気づいたことはありますか?」
生徒
「はい。最初はコマンドを打つのが怖かったのですが、エラーが出てもログを見れば何が起きているか分かるのが面白いと感じました。特に.envのホスト名をdbに変えるところで少し苦戦しましたが、コンテナ名がそのまま住所になるという仕組みを理解したらスッキリしました。」
先生
「その通りです。Docker内のネットワークは独自の世界観を持っているので、そこを掴むのがコツですね。次はデータベースの操作や、実際のプログラミングを進めていくことになりますが、準備はいいですか?」
生徒
「もちろんです!Artisanコマンドもdocker-compose exec appを付ければ自分のPCと同じように使えると分かったので、どんどんコードを書いていきたいと思います。もし環境を壊してしまっても、またコンテナを作り直せば良いと思うと、色々な設定に挑戦する勇気が湧いてきますね。」
先生
「その意気です!失敗を恐れずに環境をカスタマイズしていくことで、エンジニアとしての基礎体力がついていきます。もしNginxの設定を変えたくなったり、PHPのバージョンを上げたくなったりした時は、またDockerfileを書き換えてみてくださいね。応援しています!」