言語を切り替える
テーマを切り替える

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。そりゃ動きません。

10分
構築時間
一発コマンドで完了
100%
環境一致率
チーム全員が同一環境
設定難易度
docker-composeで管理

正直、こんな経験ありませんか? チームメンバーごとに環境がバラバラ、「私の環境では動く」問題、新人の環境構築に半日潰れる……。

この地獄から脱出する唯一の方法、それが Docker ComposeによるDNMP環境(Docker + Nginx + MySQL + PHP)の一発構築 です。これなら10分で全環境が揃い、設定ファイル一つでチーム全員の環境を統一できます。もう「環境差異」で時間を無駄にするのはやめましょう。

なぜDocker Composeなのか?

従来の「手動インストール」の3大苦痛

  1. 設定が散らばって管理不能
    /etc/nginx/, /etc/php/, /etc/mysql/… 設定ファイルがあちこちに散在し、一つ間違えると全滅。依存関係の解決(libzipがない等)で半日溶かすこともザラです。

  2. バージョンの呪い
    「このプロジェクトはPHP 5.6で、あっちは8.1」。ローカルマシンに複数のPHPバージョンを入れて切り替えるのは至難の業です。MySQL 5.7と8.0の共存?考えたくもありません。

  3. チーム共有ができない
    「環境構築手順書.docx」を作っても、3ヶ月後には古くて使えなくなります。新人が来るたびに先輩がつきっきりで教える羽目に。

Docker Composeの3大メリット

  1. 「設定即コード(IaC)」
    docker-compose.yml という1つのファイルに全構成を書きます。これをGitで共有すれば、誰でも100%同じ環境が手に入ります。

  2. コマンド一発で起動・破棄
    docker-compose up -d で環境完成、docker-compose down で綺麗サッパリ消せます。失敗してもやり直しが簡単です。

  3. 複数バージョンの共存が楽勝
    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つのルートを用意しました。

  1. 爆速ルート:完成済みのオープンソースプロジェクトを使う(推奨)。
  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: bridge

2. 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コード内でホスト名を localhost127.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 mysqli

docker-compose.ymlimage: ...build: . に書き換えてビルドしてください。

Q4: Nginxで “File not found” になる
原因:NginxコンテナとPHPコンテナで、コードのマウントパス(/var/www/html)が一致していない。
対策:両方の volumes 設定が同じパスを指しているか確認してください。

チーム開発でのベストプラクティス

  1. .env はコミットしない
    パスワードが含まれる .env.gitignore に入れ、代わりに .env.example を共有しましょう。

  2. データディレクトリも除外
    mysql/data などのデータフォルダもGit管理外にしましょう。

  3. 複数バージョンの共存
    古いプロジェクトがある場合、docker-compose.ymlphp74php81 両方のサービスを定義し、Nginxの設定(confファイル)で使い分けるのが賢い方法です。

まとめ

Docker Composeを使えば、複雑なPHP開発環境も「コード」として管理できます。

  • 統一:チーム全員が100%同じ環境。
  • 簡単docker-compose up するだけ。
  • 安全:いつでも壊して作り直せる。

もしあなたがまだXAMPPやMAMP、あるいは手動構築で消耗しているなら、今すぐこのモダンな開発スタイルに移行してください。最初の設定さえ終えれば、そこには快適な開発ライフが待っています。

DNMP環境構築(Docker Compose)

Docker Composeを使ってNginx, MySQL, PHP環境を一括構築する手順

⏱️ Estimated time: 10 min

  1. 1

    Step1: ステップ1:プロジェクト準備

    オープンソースのDNMPテンプレートをクローンするか、自分でディレクトリを作成します。おすすめは既存のテンプレート利用です。
    例:git clone https://github.com/imeepo/dnmp.git
  2. 2

    Step2: ステップ2:環境変数の設定

    cp .env.example .env を実行し、.envファイルを編集してMySQLのパスワードや使用するポート番号を設定します。
  3. 3

    Step3: ステップ3:コンテナ起動

    docker-compose up -d コマンドを実行します。初回はイメージのダウンロードとビルドが行われます。
  4. 4

    Step4: ステップ4:動作確認と開発

    ブラウザでlocalhostにアクセスし、PHPが動作しているか確認します。
    コードは ./www ディレクトリに置けば、リアルタイムで反映されます。

FAQ

PHPコードからMySQLに接続できません。なぜですか?
Dockerコンテナ内から接続する場合、ホスト名は 'localhost' ではなく、docker-compose.ymlで定義したサービス名(例:'mysql')を使用する必要があります。
PHPの拡張モジュール(GD, Redisなど)を追加するには?
デフォルトのPHPイメージには最低限のものしか入っていません。専用のDockerfileを作成し、`docker-php-ext-install` コマンドを使って必要な拡張をインストールし、docker-compose.ymlでそのDockerfileをビルドするよう設定してください。
ポート80が既に使用されているエラーが出ます。
ローカルマシンのApacheやIIS、Skypeなどがポート80を使っている可能性があります。それらを停止するか、docker-compose.ymlまたは.envファイルでNginxのポートを8080などに変更してください。

4 min read · 公開日: 2025年12月18日 · 更新日: 2026年1月22日

コメント

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

関連記事