LaravelとDockerの基礎と実務的な活用方法
皆さんは「Laravelを使って開発を始めたいけれど、環境構築が難しそう」と感じていませんか。 初心者の方は設定ファイルやバージョン管理に不安を覚えることがあるようですね。
そこでDockerを使うと、環境構築をコンテナ化してしまうため、設定を統一しやすくなります。 特にLaravelはPHPのバージョンや拡張モジュールなどの依存関係が多いので、それらをDockerで一括管理できるのは便利です。
またコンテナ化すると、チームメンバー全員が同じ環境を簡単に再現できます。 本番サーバーと同じ構成をローカル環境でも用意しやすくなるため、動作のばらつきを減らせるでしょう。
一方で、Dockerを使うためには少しだけ学習が必要です。 しかし基本的なコマンドや設定ファイルを押さえておけば、Laravelを使った開発が安定しやすくなるのではないでしょうか。
LaravelとDockerを使うシーン
Laravelは主にWebアプリケーションやAPIサーバーを構築する際に利用されます。 ユーザー管理システムや掲示板、ブログなど幅広い分野で活用されてきました。
Dockerはこうしたアプリケーションを動かすための環境をコンテナという単位でまとめて管理します。 たとえば、開発チームで「PHP 8.2」「MySQL 8.0」「Redis」などを組み合わせたい場合、それぞれを個別のDockerコンテナに分離することができます。
実務では複数のプロジェクトを平行して進める場面があるかもしれません。 そんなときDockerを使っておくと、プロジェクトAではPHPの8.1系、プロジェクトBでは8.2系といったように簡単に切り替えられます。
社内サーバーやクラウド上で本番環境を動かすときにもDockerが有効です。 コンテナイメージを移動させるだけで環境を再現できるため、インフラの移行やスケールアップもやりやすいからです。
DockerでLaravelを動かすメリット
DockerでLaravelを動かす一番のメリットは「環境の一貫性」です。 ローカル開発環境と本番環境でできるだけ同じ構成にすれば、思わぬ不具合を避けやすくなるでしょう。
次に「依存関係の整理」というメリットがあります。 LaravelはComposerによるライブラリ管理や、PHPの拡張モジュールが必要になるケースが多いです。 Dockerfileにまとめて設定することで、必要なライブラリを自動的にインストールできます。
さらに「チームでの共同開発がしやすい」点も魅力です。 新しく入ったメンバーが環境構築に時間をかけずに、すぐに開発を始められるのは作業効率の面でも助かります。
一方で、Dockerを動かすためにPCのスペックがある程度必要になる場合があります。 ただし、最近のパソコンであれば問題ないケースが増えてきたので、あまり心配しすぎない方がいいかもしれません。
Laravel × Dockerの基本的なディレクトリ構成
LaravelとDockerを一緒に使うときは、アプリケーション用のディレクトリとDocker用の設定ファイルを並列に配置するのが分かりやすいです。 下記のような形で構成する場合があります。
my-laravel-app/ ├── docker/ │ ├── php/ │ │ └── Dockerfile │ └── nginx/ │ └── Dockerfile ├── docker-compose.yml └── src/ ├── app/ ├── config/ ├── database/ ├── public/ └── ...
Laravelのソースコードはsrc/
ディレクトリに置いて、Dockerの設定はdocker/
フォルダに分けておきます。
このように分けると、ファイル構成がシンプルになりますね。
Dockerfileとdocker-compose.ymlのサンプル
ここでは簡単な例としてPHPとNginxを組み合わせるDockerfileを紹介します。 Laravel 10を想定しています。
# docker/php/Dockerfile FROM php:8.2-fpm RUN apt-get update \ && apt-get install -y \ zip \ unzip \ libpq-dev \ libxml2-dev \ && docker-php-ext-install pdo_mysql bcmath soap WORKDIR /var/www/html COPY . /var/www/html RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN composer install --no-interaction --prefer-dist --optimize-autoloader
NginxのDockerfileは以下のようにします。
# docker/nginx/Dockerfile FROM nginx:1.23-alpine COPY default.conf /etc/nginx/conf.d/default.conf
そして、docker-compose.ymlの一例です。
version: "3.8" services: app: build: context: . dockerfile: ./docker/php/Dockerfile volumes: - ./src:/var/www/html depends_on: - db ports: - "9000:9000" web: build: context: . dockerfile: ./docker/nginx/Dockerfile volumes: - ./src:/var/www/html - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - app ports: - "80:80" db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: laravel_db MYSQL_USER: laravel_user MYSQL_PASSWORD: laravel_pass volumes: - db_data:/var/lib/mysql volumes: db_data:
上記の例ではMySQLを使っています。
docker-compose up -d
を実行すると、app・web・dbの3つのコンテナが起動します。
開発から本番運用までの流れ
まずはローカル環境でDockerコンテナを立ち上げ、Laravelが正しく動くかを確認します。 コンテナ内に入ってマイグレーションなどを実行し、データベースとの連携ができる状態を作りましょう。
問題なく動いたら、本番環境にも同じコンテナイメージを配置します。 ローカル環境と本番環境のDockerイメージが同じであれば、設定ファイルの違いで悩まされる確率は下がります。
ただし、本番環境ではコンテナのスケールアウトやSSL証明書など、セキュリティ面や負荷分散を考える必要があるかもしれません。 そうした場合はNginxの設定ファイルを拡張してHTTPS対応にする、あるいはロードバランサーを導入するなどの方法があります。
よくあるトラブルと回避策
Docker上でLaravelを動かす際に、ファイルパーミッションの問題が起こることがありそうです。 ホストOSとコンテナのユーザーIDが違うことで権限エラーが出る場合があります。 そんなときはDockerfileやdocker-compose.ymlでユーザーを合わせる設定を加えると解決しやすいです。
また、Laravelのキャッシュフォルダがコンテナ内に残り、古い設定を参照してしまうケースも考えられます。
その場合、php artisan cache:clear
やphp artisan config:clear
を使ってキャッシュを更新するといいでしょう。
さらに、複数のコンテナ間通信を行う場合は、docker-compose.ymlでネットワークを分けて整理すると見通しがよくなります。 サービス名やポートを正しく指定しておかないと、接続エラーが発生することがあるため注意してください。
権限エラーやキャッシュに関するトラブルは初心者の方が最初につまづきやすいポイントです。 設定ファイルを整理しながら、エラーが出た場合はコンテナ内部のファイルアクセス権やキャッシュを疑ってみてください。
チーム開発で役立つポイント
Dockerイメージをビルドするたびにライブラリをインストールするのは非効率と感じることがあります。
そんなときは、composer.json
が変更されていない限りキャッシュを使って処理をスキップするようにDockerfileを工夫するといいでしょう。
チームメンバー間でイメージを共有する際は、Dockerレジストリを用意してプッシュする方法があります。
レジストリを通してバージョンを管理できるため、特定のタグ(たとえばv1.0
など)で運用するとトラブルが少なくなるでしょう。
さらに、環境変数を使ってデータベースの接続情報やAPIキーをコンテナに渡す方法も多いです。
.env
ファイルに記載してdocker-compose.yml側で読み込むようにすると、設定の切り替えが簡単ですね。
まとめ
LaravelとDockerを組み合わせると、開発環境と本番環境を一貫して管理しやすくなります。 PHPのバージョンやライブラリ依存などもDockerfileで明確に定義できるので、チーム開発にも適していますね。
初めのうちはDockerコマンドやdocker-compose.ymlの書き方に戸惑うかもしれません。 しかし、コンテナイメージを正しく作成し、設定ファイルを整理しておけば、安定した環境を維持しやすいでしょう。
もし権限エラーやキャッシュの問題が出ても、慌てずにファイルの所有権やキャッシュフォルダを確認してみてください。 DockerとLaravelを上手に活用すれば、開発効率が高まりそうですね。
Dockerのおかげでバージョン切り替えや環境の複製が容易になります。 Laravel特有の依存関係もDockerfileにまとめることで、チーム全員が同じ前提で開発できます。