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:clearphp 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にまとめることで、チーム全員が同じ前提で開発できます。

Laravelをマスターしよう

この記事で学んだLaravelの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。