PHP

実務向け PHP-FPM/nginx/MySQL の Docker Compose 環境

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

この記事の目的と完成イメージ・前提条件

このガイドは php-fpm + nginx + MySQL を軸にした Docker Compose 開発環境を、実務で使えるテンプレートとして短時間で構築できるよう示します。デバッグ、権限、パフォーマンス、セキュリティ、CI を含めた運用上の注意点と再現性の高いサンプルを提供します。前提は Docker(Engine または Docker Desktop)と Compose plugin、Git です。

推奨アーキテクチャ、ディレクトリ構成、PHPバージョン選定

ここではサービス構成とディレクトリ設計、PHP バージョン選定の方針を示します。実務で扱いやすく、拡張・本番移行しやすい設計を意識しています。

サービス一覧/役割

以下は開発フェーズで最低限用意すると良いサービスです。責務を分離し、公開範囲は最小化します。

  • app(php-fpm): PHP 実行環境。CLI、テスト、composer 実行も担う。
  • web(nginx): 静的配信とリバースプロキシ。ドキュメントルートは /var/www/html/public を想定。
  • db(MySQL / MariaDB): 永続化ボリュームを持つ DB。ホスト公開は原則しない。
  • admin(phpMyAdmin / Adminer): 開発用 DB 管理ツール(profiles で切替)。
  • redis: キャッシュ/セッション用。開発時は profiles で切替。
  • mail(MailHog 等): 送信メールのキャプチャ。
  • worker: queue ワーカー用(必要に応じて追加)。

推奨ディレクトリ構成

プロジェクトの最低構成例です。ファイル配置と名前は後述のサンプルに合わせて統一してください。

  • project-root/
  • docker/
    • php/
    • Dockerfile
    • php.ini.d/
      • 20-xdebug.ini
      • 99-dev.ini
    • nginx/
    • default.conf
    • mysql/
    • initdb.d/
  • src/
    • public/
    • index.php
  • tests/
  • docker-compose.yml
  • .env.example
  • composer.json
  • .gitignore

PHP バージョン選定の方針

サポート期間とプロジェクト要件を優先してバージョンを固定してください。運用上はパッチレベルまで固定すると安全です。Docker イメージは .env で明示的に指定して運用することを推奨します。

  • 開発向け: 安定したマイナーバージョン(例: 8.2.x の明示的なパッチ)。
  • イメージ基盤: debian-slim 系(php:-fpm)を推奨。Alpine は軽量だが一部拡張で追加のビルドパッケージが必要になります。

参考リンク(代表的な資料)

  • Composer 公式ダウンロードと検証手順(署名/ハッシュの検証): https://getcomposer.org/download/
  • Docker + PHP 開発の実践記事(例): https://zenn.dev/topics/docker-php (Zenn のタグ一覧ページ)

実務向け Dockerfile と docker-compose の実例と解説

ここでは、実際に動く最小構成と重要な注意点を示します。ビルド依存の一時導入と削除、Composer の安全な扱い、ドキュメントルートの整合性に重点を置いています。

Dockerfile(開発用: ビルド依存を一時的に導入して削除する例)

この Dockerfile はビルドツールを一時的に入れて拡張をコンパイルし、その同じ RUN レイヤー内で不要なビルド依存を purge して削除します。これにより最終イメージに不要なツールを残しません。

ポイントの補足:

  • ビルド用パッケージは必ず同じ RUN レイヤーで purge して削除してください。別レイヤーだと残ってしまいます。
  • Composer はインストーラのハッシュ(署名)検証を行ってからインストールしています。安全性の面で必須です。
  • default-mysql-client 等の不要なクライアントは入れないでください。攻撃面が増えます。

docker-compose.yml(ドキュメントルートの整合とイメージ固定)

ここではドキュメントルートを /var/www/html/public に統一し、ソースはホストの ./src を /var/www/html にマウントします。イメージは .env で明示的なタグを指定する形にして再現性を高めます。

  • イメージは .env で具体的なパッチレベルやタグを指定してください(例: MYSQL_IMAGE=mysql:8.0.33、PHPMYADMIN_IMAGE=phpmyadmin:5.2.0)。major タグや latest は避けてください。
  • extra_hosts の host-gateway を使うと Linux や Docker Desktop でホストへのルーティング設定が簡単になります(Xdebug の接続先設定で後述)。
  • ボリュームのマウントオプション(:delegated/:cached)は macOS 向けの最適化です。後述のプラットフォーム別注意を参照してください。

Nginx の最小設定(ドキュメントルート整合)

以下は docker/nginx/default.conf の例です。ドキュメントルートは /var/www/html/public に統一しています。

サンプルファイル一覧(名前と配置を統一)

  • docker/php/Dockerfile
  • docker/php/php.ini.d/20-xdebug.ini
  • docker/php/php.ini.d/99-dev.ini
  • docker/nginx/default.conf
  • docker/mysql/initdb.d/*.sql
  • docker-compose.yml
  • .env.example
  • src/public/index.php

ファイル名・配置は上記で統一してください。特に php.ini と xdebug のファイル名・パスは一致させてください。

開発ワークフロー、デバッグ、ファイル権限とパフォーマンス対策

運用時に混乱しやすいポイントをまとめます。Xdebug の接続先や Composer 実行、ボリュームの権限調整について実例を示します。

Xdebug(v3)と接続先の扱い

Xdebug 設定例と接続先の注意点を示します。開発環境ごとに接続先の指定方法が変わるため、複数方法を用意しておくと便利です。

  • Mac/Windows (Docker Desktop): host.docker.internal が使えます。
  • Linux: Docker のバージョンが新しければ docker-compose の extra_hosts に "host.docker.internal:host-gateway" を追加すると動作します。
  • サーバ/古い環境: ホストの IP を固定して extra_hosts に明示的に設定するか、IDE とコンテナのネットワーク設計を見直してください(例: extra_hosts: ["host.docker.internal:172.17.0.1"])。
  • セキュリティ上、Xdebug は開発プロファイルでのみ有効にしてください。

Composer の運用と vendor の扱い

Composer は基本的にコンテナ内で実行し、キャッシュは named volume に置くのが実務的です。vendor の扱いはプロジェクト方針次第です。

  • ローカルでの実行例(UNIX 系):

  • Windows(PowerShell / WSL2)ではユーザー指定方法が異なります。うまくいかない場合は root で実行してからボリュームの所有権を調整してください。

  • vendor をホストと共有すると権限・パフォーマンス問題を招きます。大きなプロジェクトは CI でビルドし、成果物をコンテナに組み込む運用(マルチステージ)を推奨します。

バインドマウントのパフォーマンス対策(macOS / Linux の違い)

マウントオプションや代替手段を明示します。macOS と Linux で挙動が異なります。

  • Docker Desktop(macOS)の最適化: マウントに :delegated や :cached を付けて改善する場合があります(例: ./src:/var/www/html:delegated)。
  • Linux: :delegated/:cached は効果が限定的で無視されます。代替として NFS、rsync、または Mutagen(ファイル同期ツール)を検討してください。
  • 長期的には Mutagen や docker-sync を使った同期が大規模アプリで効果的です。

運用・CI・セキュリティ・保守・トラブルシューティング

本番移行や CI、セキュリティ運用、よくある障害と対処をまとめます。イメージの最小化とスキャン、自動化が重要です。

CI とマルチステージビルド(本番イメージの例)

CI や本番イメージではマルチステージビルドで依存とランタイムを分離します。以下は概念例です。

  • CI ではキャッシュレイヤ(actions/cache など)や buildx のキャッシュを活用してください。
  • テストはサービスを定義して行い、Xdebug は CI で無効にします。

セキュリティ強化と脆弱性スキャン

  • イメージにビルドツールや余分なクライアントを残さないでください(Dockerfile の purge を参照)。
  • シークレット (.env 等) をリポジトリにコミットしないこと。代わりに Docker Secrets やクラウドの Secret Manager を使用してください。
  • 定期的に Trivy や Clair でイメージスキャンを実行してください。例:

  • 最小権限の原則を守り、運用アカウントは必要最小限の権限に制限してください。

ボリュームとパーミッション運用手順

named volume(例: composer_cache 等)は初期作成時に root 所有になることが多いです。運用手順の例を示します。

  • 初回作成後に一度だけ chown を実行する例(ホスト上で):

  • またはコンテナの entrypoint で起動時に存在しなければ所有権を調整するスクリプトを用意すると運用が楽になります。
  • CI や自動化スクリプトで定期的に権限を検査する運用ルールを設けてください。

よくある障害と対処(要点)

  • ポート競合: 127.0.0.1 バインドやポート変更で回避。
  • DB 接続エラー: アプリ側はサービス名(db)を使う。環境変数を再確認。
  • 権限エラー: HOST_UID/HOST_GID を見直し、必要なら chown を実行。
  • パフォーマンス低下(macOS): :delegated/:cached、Mutagen、gRPC FUSE の検討。

まとめ

  • php-fpm + nginx + MySQL の開発環境はサービスの責務分離とドキュメントルートの整合が重要です。
  • Dockerfile ではビルド依存を一時インストールして同一レイヤーで削除し、不要なツールを残さないでください。
  • Composer はインストーラの署名/ハッシュ検証を行うか、公式 composer イメージを使うことで安全に扱います。
  • ボリュームの権限は初期 chown や entrypoint スクリプトで調整し、macOS のマウント最適化はプラットフォーム差を考慮して運用してください。
  • CI ではマルチステージビルドとキャッシュ活用、脆弱性スキャン(Trivy 等)を組み込み、最小権限の原則を守ってください。
スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-PHP