まえがき
Dockerは、アプリケーションの開発、配布、実行を簡単にするコンテナプラットフォームです。
Laravel開発にDockerを使用することで、環境設定の煩雑さを解消し、どこでも一貫した開発環境を保つことができます。
この記事では、Dockerを使ってLaravelを始める方法を初心者にも分かりやすく説明します。
Dockerとは?
Dockerは、アプリケーションとその依存関係をコンテナという形でパッケージ化します。
これにより、異なる環境間でのアプリケーションの実行を一貫して行えるようになります。
LaravelのDocker環境の構築
必要なツール
- Docker Desktopのインストール
- Docker Compose(Docker Desktopに含まれています)
Laravelプロジェクトのセットアップ
1.Laravel環境構築のルートディレクトリを作成
まず、適当な場所にsample-projectsディレクトリを作成します。sample-projectsディレクトリをLaravel環境構築のルートディレクトリとします。
ここに各プロジェクトのディレクトリを作成していくイメージになります。
2.Docker Composeファイルの作成
PHPはComposerのインストールが必要なため、公式イメージをベースにしてComposerをインストールするDockerfileを作成してルートディレクトリに配置します。
FROM php:8.2-fpm
RUN apt-get update && apt-get install -y \
git \
unzip \
libzip-dev \
zip \
mariadb-client \
&& docker-php-ext-install pdo_mysql zip
# Composerのインストール
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Composerのグローバルベンダーバイナリのパスを取得し、PATH環境変数に追加
ENV PATH="${PATH}:/root/.composer/vendor/bin"
次にdocker-compose.ymlファイルをルートディレクトリに作成し、必要なサービス(例: PHP、MySQL、Nginx)を定義します。
appの部分がPHPなので上記で作成したdockerfileを指定します。
今回test1というプロジェクトを作成するため、DB名はtest1になっています。
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- .:/var/www/html
depends_on:
- app
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "8000:8000"
volumes:
- .:/var/www/html
depends_on:
- db
environment:
DB_CONNECTION: mysql
DB_HOST: db
DB_PORT: 3306
DB_DATABASE: test1
DB_USERNAME: root
DB_PASSWORD: test1234
db:
image: mysql:8.2
environment:
MYSQL_DATABASE: test1
MYSQL_ROOT_PASSWORD: test1234
ports:
- "3306:3306"
※MYSQL_ROOT_PASSWORDは適宜書き換えて下さい
※開発環境のためパスワードを直書きしていますが、本番環境ではパスワードは別の方法で設定しましょう
この時点のファイル構成は下記のようになっています。
~/sample-project$ tree
.
├── Dockerfile
└── docker-compose.yml
3.Docker Composeを使ってコンテナを起動
プロジェクトのルートディレクトリでコマンドラインで以下のコマンドを実行し、Docker Composeを使用してコンテナを起動します。
docker-compose up -d
4.Laravelをインストール
docker-compose exec app composer global require laravel/installer:v5.8.5
今回はLaravel installerを使用して、コンテナ内にLaravelをインストールします。
laravelはバージョンによって手順や設定が変わることが多いため、バージョンを指定しています。
5.Laravelプロジェクトの作成
Laravelプロジェクトを作成します。これもコンテナ内で行うことができます。test1というプロジェクトを作成してみましょう。
docker-compose exec app laravel new test1
上記コマンドを実行すると1つ目の選択肢が出力されます。
- No starter kit
- Laravel Breeze
- Laravel Jetstream
Laravel BreezeやLaravel Jetstreamはそれぞれ便利なパッケージが最初からインストールされているものになります。
今回はテストで作ってみるだけなので、No starter kitを選択しましょう。
次にテストフレームワークの選択肢が出力されます。
- Pest
- PHPUnit
こちらはとりあえずPestを選択しましょう。PestとPHPUnitについては別で記事を書く予定です。
次にGitリポジトリの作成を行うかの選択肢が出力されます。
今回は特に使わないのでNoを選択します。
ここで必要なパッケージのダウンロードとインストールが実施されます。
インストール完了後、使用するデータベースの選択肢が出力されます。
- SQLite
- MySQL
- MariaDB
- PostgreSQL
- SQL Server
こちらはMySQLを選択します。
次はマイグレーションを実行するかどうかの選択肢が出力されます。
こちらはyesを選択しましょう。
そうでないと実行に必要なテーブルが作成されません。
6.アプリケーションのアクセス
docker-compose exec app php test1/artisan serve --host=0.0.0.0
上記コマンドを実行後、ブラウザでhttp://localhost:8000
にアクセスしてみましょう。
※http://0.0.0.0:8000にアクセスしても繋がらないのでご注意ください
すると下記画像のようにInternal Server Errorが表示されると思います。
エラーメッセージを確認すると、どうやらMySQLのDBにアクセスできていないようです。
様々な原因が考えられますが、まずは接続情報が正しいか確認してみましょう。
test1/.envファイルの22行目を見てみるとDB関連の設定は下記のようになっていました。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test1
DB_USERNAME=root
DB_PASSWORD=
DB_DATABASEはプロジェクトを作成したコマンドのプロジェクト名test1が設定されていますが、DB_HOSTはデフォルトのIPアドレスに、DB_PASSWORDは未設定になっていますね。docker-compose.ymlで設定したDBのホスト名はdbになっていますのでまずはこちらをdbに修正します。
次にパスワードはtest1234に設定していますのでこちらも修正します。
修正後の.envファイルは次のようになります。
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=test1
DB_USERNAME=root
DB_PASSWORD=test1234
今回docker-composeで作成しているため.envファイルのユーザーがrootになっており、修正しようとすると書き込みができないはずです。
ですので、下記コマンドで自分のユーザーに設定しなおしましょう。
sudo chown {ユーザー名}:{ユーザー名} -R test1
権限を設定しなおして.envファイルを保存するとartisan serveコマンドのプロンプトに下記メッセージが表示されるはずです。
INFO Environment modified. Restarting server...
laravelは.envファイルの修正を監視していて、修正されると即座に更新されるようになっています。
では、もう一度ブラウザでhttp://localhost:8000
にアクセスしてみましょう。
どうでしょうか?今度はエラーにならずデフォルトの画面が表示されたと思います。
まとめ
Dockerを使用することで、Laravelの開発環境を素早く簡単に構築できます。
これにより、開発プロセスがスムーズになり、環境依存の問題を避けることができます。
このガイドが、LaravelとDockerの世界への第一歩となることを願っています。