Docker Compose一発でPHP環境構築:DNMP完全ガイド(Nginx+MySQL+PHP)

午前2時。
「NginxがPHP-FPMのsocketを見つけられません」——今夜8回目のエラーです。手動でLNMP環境を構築しようとして、nginx.conf、php-fpm.conf、my.cnfを行ったり来たり。再起動を繰り返しても動かない。窓の外は白み始めています。
さらに辛いのは、隣の席の先輩が「俺のPCだと動くんだけどなぁ、PHPのバージョン違うんじゃない?」と言ってくることです。
確認すると彼はPHP 7.4、私は8.1。MySQLも彼は5.7、私は8.0。そりゃ動きません。
正直、こんな経験ありませんか? チームメンバーごとに環境がバラバラ、「私の環境では動く」問題、新人の環境構築に半日潰れる……。
この地獄から脱出する唯一の方法、それが Docker ComposeによるDNMP環境(Docker + Nginx + MySQL + PHP)の一発構築 です。これなら10分で全環境が揃い、設定ファイル一つでチーム全員の環境を統一できます。もう「環境差異」で時間を無駄にするのはやめましょう。
なぜDocker Composeなのか?
従来の「手動インストール」の3大苦痛
設定が散らばって管理不能
/etc/nginx/,/etc/php/,/etc/mysql/… 設定ファイルがあちこちに散在し、一つ間違えると全滅。依存関係の解決(libzipがない等)で半日溶かすこともザラです。バージョンの呪い
「このプロジェクトはPHP 5.6で、あっちは8.1」。ローカルマシンに複数のPHPバージョンを入れて切り替えるのは至難の業です。MySQL 5.7と8.0の共存?考えたくもありません。チーム共有ができない
「環境構築手順書.docx」を作っても、3ヶ月後には古くて使えなくなります。新人が来るたびに先輩がつきっきりで教える羽目に。
Docker Composeの3大メリット
「設定即コード(IaC)」
docker-compose.ymlという1つのファイルに全構成を書きます。これをGitで共有すれば、誰でも100%同じ環境が手に入ります。コマンド一発で起動・破棄
docker-compose up -dで環境完成、docker-compose downで綺麗サッパリ消せます。失敗してもやり直しが簡単です。複数バージョンの共存が楽勝
PHP 7.4のコンテナとPHP 8.1のコンテナを同時に立ち上げ、Nginxの設定で振り分けるだけ。互いに干渉しません。
DNMPアーキテクチャ解説
DNMP とは、LNMP(Linux Nginx MySQL PHP)のDocker版です。
- D: Docker(コンテナ基盤)
- N: Nginx(Webサーバー)
- M: MySQL(データベース)
- P: PHP(アプリケーション実行環境)
これに Redis(キャッシュ)や phpMyAdmin(DB管理ツール)を加えるのが一般的です。
仕組みのイメージ:
これらは独立したコンテナ(小さな仮想サーバーのようなもの)として動きますが、Docker Networkを通じて繋がっています。
- ブラウザ →
localhost:80(Nginxコンテナ) - Nginx → 転送 →
php:9000(PHPコンテナ) - PHP → 接続 →
mysql:3306(MySQLコンテナ)
重要なのは、コンテナ間の通信には「サービス名(php, mysqlなど)」使える点です。IPアドレスを気にする必要はありません。
10分で完了!DNMP環境構築チュートリアル
2つのルートを用意しました。
- 爆速ルート:完成済みのオープンソースプロジェクトを使う(推奨)。
- 自作ルート:自分で設定ファイルを書いて理解を深める(上級者向け)。
前提条件
- PCにDocker Desktop(またはDocker Engine + Docker Compose)がインストールされていること。
推奨ルート:完成済みプロジェクトを使う
私が愛用している imeepo/dnmp などをベースにするのが一番早いです(Apple M1/M2チップも対応)。
手順1:プロジェクトをクローン
git clone https://github.com/imeepo/dnmp.git
cd dnmp手順2:設定ファイルの準備.env ファイルでパスワードなどを設定します。
cp .env.example .env.env を開いて、MySQLのルートパスワードなどを変更してください。
MYSQL_ROOT_PASSWORD=my_strong_password手順3:一発起動
docker-compose up -d初回はイメージのダウンロードに数分かかります。
手順4:動作確認
ブラウザで http://localhost を開きます。PHPのバージョン情報(phpinfo)が表示されれば成功です!http://localhost:8080 でphpMyAdminにもアクセスできるはずです。
自作ルート:docker-compose.yml を手書きする
仕組みを理解するために、最小構成で作ってみましょう。
ディレクトリ構成:
my-dnmp/
├── docker-compose.yml
├── www/
│ └── index.php
├── nginx/
│ └── default.conf
└── mysql/
└── data/1. docker-compose.yml
version: '3.8'
services:
# Nginxサービス
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./www:/var/www/html # コードディレクトリ
- ./nginx:/etc/nginx/conf.d # 設定ファイル
depends_on:
- php
networks:
- dnmp-net
# PHPサービス
php:
image: php:8.1-fpm
volumes:
- ./www:/var/www/html # Nginxと同じ場所をマウント
networks:
- dnmp-net
# MySQLサービス
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql # データ永続化
networks:
- dnmp-net
networks:
dnmp-net:
driver: bridge2. Nginx設定 (nginx/default.conf)
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass php:9000; # 重要:"php"はdocker-composeのサービス名
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}3. テストファイル (www/index.php)
<?php phpinfo(); ?>これで docker-compose up -d すれば、自作のPHP環境が立ち上がります。
よくあるトラブルと解決策(FAQ)
Q1: “Address already in use” エラーが出る
原因:ポート80や3306を他のアプリ(Apache, ローカルのMySQLなど)が使っています。
対策:競合しているアプリを止めるか、docker-compose.yml でポートを変えます(例:"8080:80")。
Q2: データベースに接続できない
原因:PHPコード内でホスト名を localhost や 127.0.0.1 にしていませんか?
対策:Docker内ではサービス名を使う必要があります。ホスト名は mysql と書いてください。
$pdo = new PDO('mysql:host=mysql;dbname=test_db', 'root', 'root');Q3: PHPの拡張機能(Redisやmysqli)が足りない
原因:公式の php:fpm イメージは最小限です。
対策:Dockerfileを作って拡張機能をインストールする必要があります。
FROM php:8.1-fpm
RUN docker-php-ext-install pdo pdo_mysql mysqlidocker-compose.yml の image: ... を build: . に書き換えてビルドしてください。
Q4: Nginxで “File not found” になる
原因:NginxコンテナとPHPコンテナで、コードのマウントパス(/var/www/html)が一致していない。
対策:両方の volumes 設定が同じパスを指しているか確認してください。
チーム開発でのベストプラクティス
.envはコミットしない
パスワードが含まれる.envは.gitignoreに入れ、代わりに.env.exampleを共有しましょう。データディレクトリも除外
mysql/dataなどのデータフォルダもGit管理外にしましょう。複数バージョンの共存
古いプロジェクトがある場合、docker-compose.ymlにphp74とphp81両方のサービスを定義し、Nginxの設定(confファイル)で使い分けるのが賢い方法です。
まとめ
Docker Composeを使えば、複雑なPHP開発環境も「コード」として管理できます。
- 統一:チーム全員が100%同じ環境。
- 簡単:
docker-compose upするだけ。 - 安全:いつでも壊して作り直せる。
もしあなたがまだXAMPPやMAMP、あるいは手動構築で消耗しているなら、今すぐこのモダンな開発スタイルに移行してください。最初の設定さえ終えれば、そこには快適な開発ライフが待っています。
DNMP環境構築(Docker Compose)
Docker Composeを使ってNginx, MySQL, PHP環境を一括構築する手順
⏱️ Estimated time: 10 min
- 1
Step1: ステップ1:プロジェクト準備
オープンソースのDNMPテンプレートをクローンするか、自分でディレクトリを作成します。おすすめは既存のテンプレート利用です。
例:git clone https://github.com/imeepo/dnmp.git - 2
Step2: ステップ2:環境変数の設定
cp .env.example .env を実行し、.envファイルを編集してMySQLのパスワードや使用するポート番号を設定します。 - 3
Step3: ステップ3:コンテナ起動
docker-compose up -d コマンドを実行します。初回はイメージのダウンロードとビルドが行われます。 - 4
Step4: ステップ4:動作確認と開発
ブラウザでlocalhostにアクセスし、PHPが動作しているか確認します。
コードは ./www ディレクトリに置けば、リアルタイムで反映されます。
FAQ
PHPコードからMySQLに接続できません。なぜですか?
PHPの拡張モジュール(GD, Redisなど)を追加するには?
ポート80が既に使用されているエラーが出ます。
4 min read · 公開日: 2025年12月18日 · 更新日: 2026年1月22日
関連記事
Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践

Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践
Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド

Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド
Next.js ユニットテスト実践:Jest + React Testing Library 完全設定ガイド


コメント
GitHubアカウントでログインしてコメントできます