現在Laravelの教材を鋭意制作中です!完成まで今しばらくお待ちください

#10 Dockerのファイル解説

このページでは、Laravel開発環境をDockerで構築する際に使用する主要な設定ファイルについて解説します。

Dockerを使うことで、OSやツールの違いによる環境差をなくし、誰でも同じ状態で開発・動作確認ができるようになります。

対象となるファイルは、PHP・MySQL・Nginxそれぞれのサービスに関連する設定ファイル(Dockerfile, php.ini, my.cnf, default.conf)と、全体を統括する docker-compose.yml です。

これらのファイルは、単にコンテナを起動するだけでなく、開発効率や動作の安定性、セキュリティ、拡張性にも関わる重要な役割を担っています。

これらのファイルがどのような役割を持ち、どこを調整すればよいのかを理解することで、より柔軟で安定した開発環境を構築できるようになります。

ファイル一覧と役割

Laravelの開発環境をDockerで構築する際には、複数の設定ファイルが連携して動作します。

以下ではそれぞれのファイルがどのサービスに属し、どのような役割を持っているかを整理します。

ファイル名 所属サービス 役割概要
docker-compose.yml 全体 各サービス(PHP, MySQL, Nginx)の定義と連携設定を行うファイル
php/Dockerfile PHP PHP環境の構築。Laravel実行に必要なモジュールやツールを導入
php/php.ini PHP PHPの設定ファイル。メモリ制限やタイムゾーンなどを調整
nginx/default.conf Nginx Webサーバーのルーティング設定。ドキュメントルートやリバースプロキシの定義
mysql/my.cnf MySQL データベースの設定ファイル。文字コードやバッファサイズなどを調整

フォルダの作成箇所

それぞれのファイルは以下のフォルダに作成していきます。

contactform/
├── docker-compose.yml
├── php/
│ ├── Dockerfile
│ └── php.ini
├── nginx/
│ └── default.conf
├── mysql/
│ └── my.cnf
├── .gitignore
└── src

※1 srcフォルダの中にはLaravelのアプリが入ります
※2 contactform内でLarave linstallを行うと、自動的にsrcフォルダが生成されます

各ファイルの説明

ここからは、Dockerを使用する場合に作成すべきファイルについて解説していきます。

php/Dockerfile

このファイルは、Laravelアプリケーションを動かすための PHP実行環境を構築するレシピです。

Laravelが依存するPHPモジュールやツール(composerなど)をインストールし、開発に適した環境を整えます。

# バージョン 8.3 のPHPをインストールしています
FROM php:8.3-fpm

# 必要なパッケージとPHP拡張モジュールのみインストール
RUN apt-get update && apt-get install -y \
  unzip libzip-dev \
  && docker-php-ext-install pdo_mysql zip mbstring
# Composerのインストール(公式推奨の方法)
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# php.ini を配置(任意)
COPY php.ini /usr/local/etc/php/

# 作業ディレクトリの設定
WORKDIR /var/www

# 権限調整(Laravelのstorageなどで必要)
RUN chown -R www-data:www-data /var/www

php/php.ini

php.iniは主に「PHPの動作を制御する設定ファイル」となっています。

今回は最小構成となっています。

date.timezone = "Asia/Tokyo"

[mbstring]
default_charset = "UTF-8"
mbstring.language = Japanese
mbstring.detect_order = UTF-8,SJIS,EUC-JP

nginx/default.conf

このファイルは、Nginx コンテナ内の仮想ホスト設定ファイルであり、ブラウザから送られてくるリクエストをどこにどう届けるかを定義します。

LaravelをPHP-FPM経由で実行するため、リバースプロキシやドキュメントルートの指定が含まれます。

server {
    # リクエストを受け取るポート番号の設定。ポート番号 80 番 を指定。
    listen 80;

    # サーバ名の設定。localhostを指定。
    server_name localhost;

    # インデックスとして使用するファイルの設定。index.phpとindex.htmlを指定。
    index index.php index.html;

    # ドキュメントルートの設定。/var/www/publicを指定。
    root /var/www/public;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
    # URI のパス毎の設定。/と~ \.php(それ以外)の時の指定をしている
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

mysql/my.cnf

このファイルは、MySQL(またはMariaDB)の動作全般を制御する設定ファイルです。

LaravelはDBとの連携が非常に重要なので、my.cnf を適切に設定することで、開発時の安定性や日本語データの整合性が高まります。

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[client]
default-character-set = utf8mb4

docker-compose.yml の役割

  • 複数のコンテナ(サービス)を同時に定義・起動・連携するためのファイル
  • サービスのビルド設定、ネットワーク、ボリューム、環境変数などを一括管理
  • 開発環境の再現性やチームでの統一運用を実現

🔍 Laravel構成の例(最小構成)

version: '3.8'

services:
  php:
    build:
      context: ./php
    volumes:
      - .:/var/www
    depends_on:
      - mysql

  nginx:
    image: nginx:stable
    volumes:
      - .:/var/www
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "8080:80"
    depends_on:
      - php

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: laravel
    volumes:
      - db-data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf

volumes:
  db-data:

🧠 設定ポイント解説

セクション 内容
services コンテナごとに定義(PHP・Nginx・MySQL)
build.context PHPサービスのビルド元フォルダ(Dockerfileのある場所)
volumes ホストとコンテナ間のディレクトリ共有。Laravelコードをマウント
depends_on 起動順の制御。PHPはMySQLより後に起動、NginxはPHPより後に起動
ports 外部アクセス用ポート設定。localhost:8080 でアプリにアクセス可能
environment MySQLの初期設定(DB名、ユーザー、パスワード)
volumes: 名前付きボリューム。DBの永続化領域を定義

✅ 教育目的におけるメリット

  • 全体構成が明示的で、各サービスがどう連携するかを直感的に理解できる
  • Laravelのコア機能に絞った最小構成なので、学習に集中できる
  • .env ファイルの内容と連携することで、環境変数の理解も深まる

次章:#12 LaravelのインストールとPHPのバージョン に進む