Docker ComposeでPHP環境を一発構築:DNMP完全ガイド(Nginx+MySQL+PHP)
ターミナルに流れるエラーメッセージ——「NginxがPHP-FPMのsocketファイルを見つけられない」。今夜8回目のエラーです。手動でLNMP環境を構築し、nginx.conf、php-fpm.conf、my.cnfの3つの設定ファイルを書き換え、サービスを十数回再起動しても、環境はまだ起動しません。
隣の席の同僚が言います。「うちのPCでは普通に動いてるよ。PHPのバージョン違くない?」
彼はPHP 7.4、私は8.1を入れています。MySQLは彼が5.7、私はうっかり8.0を入れてしまいました。コードが動かないのも当然です。
チームメンバーごとに開発環境がバラバラで、新人が入るたびに環境構築だけで半日かかり、先輩がマンツーマンで指導します。PC Aでは動くコードがPC Bでは動きません。サーバーへのデプロイも当たり外れです。
Docker ComposeでDNMP環境を一発構築してみたら、これらの問題は一気に解消しました。10分でNginx、MySQL、PHPのフルスタックが整い、チーム全員が同じ設定ファイルを使えるようになり、「うちのPCでは動く」という言い訳はなくなりました。
なぜDocker ComposeでPHP環境を構築するのか
従来のLNMP構築の3大痛点
痛点1:手動インストールと設定が煩雑で、一歩間違えれば全部やり直し
初めてLNMPを入れたときを覚えていますか? まず apt-get install nginx、次に php-fpm、それからMySQL。インストール後も設定ファイルの修正が必要で、nginx.confにlocationルール、php.iniで拡張を有効化、my.cnfでパラメータ調整。
3つの設定ファイルは /etc/nginx/、/etc/php/、/etc/mysql/ に散在しています。一つ書き間違えるとサービスが起動しません。問題を追うにはNginxログ、PHP-FPMログ、MySQLログと、ログを見続けて頭がクラクラします。
php-fpm.confの listen = 127.0.0.1:9000 を listen = /run/php/php7.4-fpm.sock と書いてしまい、NginxがPHPを見つけられず3時間デバッグした人もいます。
痛点2:バージョン互換性の問題が頭を悩ませる
チームには必ず「バージョンにこだわる人」がいます。古いプロジェクトはPHP 5.6、新プロジェクトはPHP 8.1。MySQL 5.7の GROUP BY 構文はMySQL 8.0でエラーになります。8.0ではデフォルトで ONLY_FULL_GROUP_BY モードが有効だからです。
さらに恐ろしいのは、メンバーごとにPC上のバージョンがバラバラなことです。
- AさんのMac:PHP 7.4 + MySQL 5.7
- BさんのUbuntu:PHP 8.0 + MySQL 8.0
- 新入りのWindows:PHP 8.1 + MariaDB 10.6
AさんのPCでは動くコードをGitにpushしても、Bさんがpullするとエラー。テスト環境はまた別バージョン、本番もさらに違う。これでは開発が進みません。
痛点3:チーム協業の効率が極端に低い
新人入社初日、先輩が半日かけて環境構築を手取り足取り教えます。
- Nginxをインストール(20分)
- PHPと拡張をインストール(30分、コンパイルも必要)
- MySQLをインストール(15分)
- 3サービスの連携設定(1時間、トラブル多数)
- テストデータをインポート(10分)
運が良ければ午後からコードを書けます。運が悪ければ、明日に持ち越しです。
以前、スタートアップで環境不一致のせいで、ユーザー登録機能が開発環境では通ったのに本番で「データベース接続失敗」になりました。開発環境のMySQL rootにパスワードがなく、本番にはパスワードがあったのに、設定ファイルの更新を忘れていたのが原因。深夜に緊急ロールバック、上司も激怒していました。
Docker Composeの3大メリット
メリット1:設定即コード、1ファイルでチーム全員が共有
Docker Composeはすべての設定を1つの docker-compose.yml に書きます。
- どのバージョンのNginxを使うか?(nginx:1.25-alpine)
- PHPにどの拡張を入れるか?(mysqli、pdo_mysql、redis)
- MySQLの設定パラメータは?(my.cnfで一元管理)
- サービス間の通信は?(自動DNS解決)
このファイルをGitにpushすれば、チーム全員が同じ環境を手に入れられます。新人入社? プロジェクトをcloneして docker-compose up -d を1行実行、コーヒーを淹れて戻れば環境が動いています。
「MySQLのパスワードは?」「php.iniはどこ?」「Nginxの設定を見せて」といった質問は不要。1ファイルですべて解決します。
メリット2:ワンコマンドで起動・破棄、スッキリ片付く
すべてのサービスを起動:
docker-compose up -d
すべてのコンテナを停止して削除:
docker-compose down
PHPバージョンを切り替えたい? 設定の1行 image: php:7.4-fpm を image: php:8.1-fpm に変えて、再度upするだけです。
従来の方法のように、古いPHPをアンインストールして残留ファイルを片付け、誤削除でシステムが壊れないか心配する必要はありません。Dockerコンテナは完全に分離されており、削除すればきれいに消えます。
メリット3:環境分離と複数バージョンの共存
PHP 7.4とPHP 8.1を同時に動かしたい? 従来の方法ではPHPを2セット入れ、別ポートを設定し、Nginxのfastcgi_passを書き換える必要があります。面倒です。
Docker Composeなら、設定ファイルに2つのPHPサービスを定義するだけ:
php74:
image: php:7.4-fpm
php81:
image: php:8.1-fpm
Nginxの設定で使いたいバージョンのサービス名を指定します。古いプロジェクトはphp74、新プロジェクトはphp81。互いに干渉しません。
GitHubで最もスター数の多いDNMPプロジェクト(imeepo/dnmp)は5000+ star。多くのチームで検証済みの、成熟したソリューションです。
DNMPアーキテクチャ設計の詳細
DNMPとは
DNMPはLNMPのDocker版です。4文字それぞれが1コンポーネントを表します。
- D = Docker:コンテナ化プラットフォーム。各サービスを独立した「コンテナ」に入れる
- N = Nginx:Webサーバー。HTTPリクエストを受け取り、PHPに転送
- M = MySQL:リレーショナルDB(MariaDBやPostgreSQLに置き換え可能)
- P = PHP:PHP-FPM実行環境。PHPコードを実行
この4つに加え、一般的には以下も含めます。
- Redis:キャッシュサービス。データ読み取りを高速化
- PHPMyAdmin:DB管理ツール。MySQLをGUIで操作
従来のLNMPではこれらがOS上に直接インストールされ、混在していました。DNMPではそれぞれをDockerコンテナに分離します。異なるソフトを別の仮想マシンに入れるイメージですが、仮想マシンよりはるかに軽量です。
サービスオーケストレーションアーキテクチャ
オーディオシステムを組み立てるイメージです。アンプ、スピーカー、プレーヤー。各機器は独立して動きますが、ケーブルで接続して初めて協調して音を出します。
DNMPも同じ原理です。Nginx、PHP、MySQLは独立したコンテナですが、Dockerネットワークで接続します。
リクエスト処理フロー:
- ブラウザが
localhost:80にHTTPリクエストを送信 - Nginxコンテナがリクエストを受信し、PHPファイルと判断
- Nginxが9000ポート経由でPHPコンテナに転送(サービス名
php経由) - PHPコンテナがコードを実行。DBが必要ならMySQLコンテナに接続(サービス名
mysql経由) - PHPが結果をNginxに返す
- NginxがHTMLをブラウザに返す
通信メカニズム:
Docker Composeはブリッジネットワーク(bridge network)を自動作成し、すべてのサービスを接続します。各サービスにはサービス名があり、Dockerが自動でDNS解決します。
PHPからMySQLに接続するとき、127.0.0.1:3306 ではなく mysql:3306 と書くだけです。Dockerが mysql をMySQLコンテナのIPに解決してくれます。非常に便利です。
ポートマッピング:
- Nginxコンテナ:80ポート → ホスト80ポート(localhostでサイトにアクセス)
- MySQLコンテナ:3306ポート → ホスト3306ポート(Navicatなどで接続)
- PHPMyAdminコンテナ:80ポート → ホスト8080ポート(localhost:8080でDB管理)
- Redisコンテナ:6379ポート → ホスト6379ポート
ボリュームマウント(Volume):
コンテナを削除するとデータも消える? いいえ。ボリュームマウントでコンテナ内の重要ディレクトリをホストにマッピングします。
./www→ NginxとPHPコンテナの/var/www/html(コードディレクトリ)./mysql/data→ MySQLコンテナの/var/lib/mysql(DBファイル)./nginx/logs→ Nginxコンテナの/var/log/nginx(アクセスログ)
コンテナを削除して再作成しても、データはホストに残ります。
ディレクトリ構造設計
標準的なDNMPプロジェクトのディレクトリ構成:
dnmp/
├── docker-compose.yml # コアオーケストレーションファイル。全サービスを定義
├── .env # 環境変数(パスワード、ポートなど)
├── .gitignore # Git除外(.envはアップロードしない)
├── nginx/
│ ├── conf.d/
│ │ └── default.conf # サイト設定(ルート、PHP転送ルール)
│ └── logs/ # アクセスログとエラーログ
│ ├── access.log
│ └── error.log
├── php/
│ ├── Dockerfile # PHPイメージのカスタマイズ(拡張インストール)
│ ├── php.ini # PHP設定(メモリ上限、アップロードサイズ)
│ └── php-fpm.conf # PHP-FPM設定(プロセス数)
├── mysql/
│ ├── data/ # DBファイル永続化ディレクトリ
│ └── my.cnf # MySQL設定(文字セット、最大接続数)
└── www/ # プロジェクトコードディレクトリ
└── index.php # テストファイル
主要ファイルの説明:
docker-compose.yml:最も重要。使用イメージ、マウントディレクトリ、ポートマッピングを定義.env:環境変数。例:MYSQL_ROOT_PASSWORD=123456。機密情報を分離管理nginx/conf.d/default.conf:Nginxサイト設定。Webルート、PHP転送ルールphp/Dockerfile:公式PHPイメージをベースにmysqli、redisなどの拡張を追加mysql/data/:DBファイルの保存先。コンテナ削除後もデータが残る
ファイル数は多く見えますが、各ファイルの役割は明確です。従来のLNMPのように設定があちこちに散在して探すのが大変、ということはありません。
10分実践:ゼロからDNMP環境を構築
事前準備
1. Dockerのインストール
- Mac/Windows:Docker Desktop をダウンロードしてインストール。docker-compose同梱
- Linux(Ubuntu例):
sudo apt update sudo apt install docker.io docker-compose -y sudo systemctl start docker sudo systemctl enable docker
2. インストール確認
docker --version
# 出力:Docker version 24.0.6, build xxx
docker-compose --version
# 出力:Docker Compose version v2.21.0
バージョン番号が表示されればOKです。
3. 推奨スペック
- メモリ:4GB以上(Docker Desktopの設定で調整可能)
- ディスク:20GB以上の空き(イメージが容量を使います)
- ネットワーク:Docker Hubにアクセス可能(遅い場合は国内ミラーを設定)
クイックデプロイ案1:成熟したOSSプロジェクトを使う(推奨)
面倒を避けたいなら、OSSプロジェクトをそのまま使えば10分で完了します。
1. プロジェクトをクローン
imeepo/dnmp を推奨。Arm CPU(Apple Mシリーズ)にも対応:
git clone https://github.com/imeepo/dnmp.git
cd dnmp
2. 環境変数の設定
サンプル設定をコピー:
cp .env.example .env
.env を開き、主要項目を変更:
# MySQL rootパスワード(123456は弱すぎる)
MYSQL_ROOT_PASSWORD=your_strong_password
# タイムゾーン
TZ=Asia/Shanghai
# ポートマッピング(80が使用中なら8080に変更)
NGINX_HTTP_PORT=80
MYSQL_PORT=3306
3. ワンコマンド起動
docker-compose up -d
-d はバックグラウンド実行。初回はイメージ取得に数分かかることがあります。以下のような出力が出れば成功:
Creating network "dnmp_default" with the default driver
Creating dnmp_mysql_1 ... done
Creating dnmp_php_1 ... done
Creating dnmp_nginx_1 ... done
Creating dnmp_redis_1 ... done
4. インストール確認
ブラウザで http://localhost を開くと、phpinfoページが表示され、PHPバージョンやインストール済み拡張が確認できます。
このページが見えれば、NginxとPHPは正常に動作しています。
http://localhost:8080 でPHPMyAdminのログイン画面が表示されます。
- サーバー:
mysql(localhostではない) - ユーザー名:
root - パスワード:
.envで設定した値
ログインできればMySQLも正常です。
5. コンテナ状態の確認
docker-compose ps
出力例:
Name Command State Ports
--------------------------------------------------------------------
dnmp_nginx_1 nginx -g daemon off; Up 0.0.0.0:80->80/tcp
dnmp_php_1 php-fpm Up 9000/tcp
dnmp_mysql_1 docker-entrypoint... Up 0.0.0.0:3306->3306/tcp
dnmp_redis_1 redis-server Up 6379/tcp
State が Up ならコンテナは稼働中です。
カスタム案2:docker-compose.ymlを手書き(上級)
仕組みを深く理解したいなら、自分で設定ファイルを書きます。
1. プロジェクトディレクトリを作成
mkdir my-dnmp && cd my-dnmp
mkdir -p nginx/conf.d php mysql/data www
2. docker-compose.ymlを作成
docker-compose.yml の内容:
version: '3.8'
services:
# Nginxサービス
nginx:
image: nginx:1.25-alpine # alpine版でイメージを小型化
container_name: dnmp-nginx
ports:
- "80:80" # ホスト80ポートにマッピング
volumes:
- ./www:/var/www/html # コードディレクトリ
- ./nginx/conf.d:/etc/nginx/conf.d # サイト設定
- ./nginx/logs:/var/log/nginx # ログディレクトリ
depends_on:
- php # PHPに依存。PHPを先に起動
networks:
- dnmp-network
# PHPサービス
php:
build: ./php # Dockerfileでイメージをビルド
container_name: dnmp-php
volumes:
- ./www:/var/www/html # Nginxと同じコードディレクトリ
networks:
- dnmp-network
# MySQLサービス
mysql:
image: mysql:8.0
container_name: dnmp-mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root123456 # rootパスワード
MYSQL_DATABASE: test_db # デフォルト作成DB
TZ: Asia/Shanghai # タイムゾーン
volumes:
- ./mysql/data:/var/lib/mysql # データ永続化
networks:
- dnmp-network
# Redisサービス(オプション)
redis:
image: redis:7-alpine
container_name: dnmp-redis
ports:
- "6379:6379"
networks:
- dnmp-network
networks:
dnmp-network:
driver: bridge # ブリッジネットワーク。コンテナ間通信可能
3. PHP Dockerfileを作成
php/Dockerfile で常用拡張をインストール:
FROM php:8.1-fpm
# システム依存パッケージ
RUN apt-get update && apt-get install -y \
libzip-dev \
zip \
unzip
# PHP拡張をインストール
RUN docker-php-ext-install \
mysqli \
pdo_mysql \
zip \
opcache
# Redis拡張をインストール
RUN pecl install redis && docker-php-ext-enable redis
# 作業ディレクトリ
WORKDIR /var/www/html
4. Nginxサイト設定を作成
nginx/conf.d/default.conf:
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
# アクセスログ
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# PHPファイルをPHP-FPMに転送
location ~ \.php$ {
fastcgi_pass php:9000; # phpはサービス名。DockerがIPを解決
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 静的ファイルは直接返す
location ~ \.(js|css|png|jpg|gif|ico)$ {
expires 7d;
}
}
5. テストファイルを作成
www/index.php:
<?php
phpinfo();
www/db_test.php でDB接続をテスト:
<?php
$host = 'mysql'; // サービス名。localhostではない
$user = 'root';
$pass = 'root123456';
$db = 'test_db';
try {
$pdo = new PDO("mysql:host=$host;dbname=$db", $user, $pass);
echo "DB接続成功!<br />";
echo "MySQLバージョン: " . $pdo->getAttribute(PDO::ATTR_SERVER_VERSION);
} catch(PDOException $e) {
echo "接続失敗: " . $e->getMessage();
}
6. サービスを起動
docker-compose up --build -d
--build はPHPイメージを再ビルド。初回はベースイメージのダウンロードと拡張インストールで時間がかかります。
検証とテスト
1. PHPのテスト
http://localhost にアクセスし、phpinfoページで以下を確認:
- PHPバージョンが8.1
- mysqli、pdo_mysql、redis拡張がenabled
2. データベース接続のテスト
http://localhost/db_test.php で「DB接続成功」とMySQLバージョンが表示されればOK。
接続失敗の場合は以下を確認:
- MySQLコンテナが起動しているか:
docker-compose ps - hostが
localhostになっていないか(mysqlが正しい) - パスワードが正しいか
3. コンテナ状態の確認
docker-compose ps
すべてのコンテナのStateが Up であること。
4. ログでトラブルシュート
コンテナ起動失敗時はログを確認:
docker-compose logs php # PHPコンテナのログ
docker-compose logs -f nginx # Nginxログをリアルタイム表示(-f)
ログに設定ファイルの構文エラーやポート競合など、具体的な原因が表示されます。
チーム協業のベストプラクティス
バージョン管理戦略
基本原則:設定はコミット、機密情報はコミットしない
.gitignore を作成:
# 機密情報はアップロードしない
.env
# DBファイルはアップロードしない(容量が大きい)
mysql/data/
# ログファイルはアップロードしない
nginx/logs/*.log
php/logs/*.log
# コードは業務プロジェクトで管理。DNMPには含めない
www/*
!www/.gitkeep # ディレクトリ構造を保持
Gitにコミットするファイル:
git add docker-compose.yml
git add .env.example # サンプル設定。本番パスワードなし
git add nginx/conf.d/
git add php/Dockerfile
git add php/php.ini
git add mysql/my.cnf
git commit -m "feat: add DNMP environment config"
git push
新メンバー入社フロー(3分):
- プロジェクトをclone:
git clone xxx - 設定をコピー:
cp .env.example .env - パスワード変更:
.envのMYSQL_ROOT_PASSWORDを編集 - 環境起動:
docker-compose up -d - データインポート:
docker exec -i dnmp-mysql mysql -uroot -p < backup.sql
以上です。「Nginxの設定はどこ?」「PHPに何を入れた?」と先輩に聞く必要はありません。すべて設定ファイルに書いてあります。
複数PHPバージョン共存の方案
シナリオ:古いプロジェクトはPHP 7.4、新プロジェクトはPHP 8.1。どうする?
方案1:docker-compose.ymlに複数PHPサービスを定義
services:
php74:
image: php:7.4-fpm
container_name: dnmp-php74
volumes:
- ./www:/var/www/html
networks:
- dnmp-network
php81:
image: php:8.1-fpm
container_name: dnmp-php81
volumes:
- ./www:/var/www/html
networks:
- dnmp-network
NginxでプロジェクトごとにPHPバージョンを振り分け:
nginx/conf.d/old-project.conf(旧プロジェクト):
server {
listen 80;
server_name old.local;
root /var/www/html/old-project;
location ~ \.php$ {
fastcgi_pass php74:9000; # PHP 7.4を指定
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
nginx/conf.d/new-project.conf(新プロジェクト):
server {
listen 80;
server_name new.local;
root /var/www/html/new-project;
location ~ \.php$ {
fastcgi_pass php81:9000; # PHP 8.1を指定
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
hostsファイルを設定:
127.0.0.1 old.local
127.0.0.1 new.local
http://old.local はPHP 7.4、http://new.local はPHP 8.1。互いに干渉しません。
データ永続化とバックアップ
データ永続化はボリュームマウントで実現済みです。./mysql/data をコンテナの /var/lib/mysql にマッピングしているため、コンテナを削除してもデータは残ります。
DBバックアップスクリプト:
scripts/backup.sh を作成:
#!/bin/bash
BACKUP_DIR="./backups"
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_CONTAINER="dnmp-mysql"
MYSQL_USER="root"
MYSQL_PASSWORD="root123456"
DATABASE="test_db"
mkdir -p $BACKUP_DIR
echo "DB $DATABASE のバックアップを開始..."
docker exec $MYSQL_CONTAINER mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD $DATABASE > $BACKUP_DIR/${DATABASE}_${DATE}.sql
echo "バックアップ完了: $BACKUP_DIR/${DATABASE}_${DATE}.sql"
定期バックアップ(cron使用):
# crontabを編集
crontab -e
# 毎日午前2時にバックアップ
0 2 * * * /path/to/scripts/backup.sh
DBリストア:
docker exec -i dnmp-mysql mysql -uroot -proot123456 test_db < ./backups/test_db_20251218.sql
よくある問題とトラブルシューティング
問題1:ポートが使用中でコンテナ起動失敗
現象:
Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use
調査:
# Mac/Linux
lsof -i :80
# Windows
netstat -ano | findstr :80
解決策:
- 方案1:80ポートを使っているプログラム(Apache、IISなど)を停止
- 方案2:ポートマッピングを変更。
.envでNGINX_HTTP_PORT=8080にし、localhost:8080でアクセス
問題2:ファイル権限の問題(Linux/Mac)
現象:
- Nginxが
403 Forbiddenを返す - PHPがファイル書き込みできず
Permission denied
原因:
コンテナ内のwww-dataユーザー(UID 33)とホストユーザー(UID 1000)が一致せず、マウントファイルにアクセスできない。
一時対処(開発環境):
chmod -R 777 ./www
正しい対処(コンテナユーザーのUIDを変更):
php/Dockerfile でコンテナユーザーのUIDをホストに合わせる:
FROM php:8.1-fpm
# www-dataのUIDをホストユーザーに合わせる(例:1000)
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
# その他の設定...
イメージを再ビルド:
docker-compose build php
docker-compose up -d
問題3:PHP拡張モジュール不足
現象:
Fatal error: Call to undefined function mysqli_connect()
調査:
docker exec dnmp-php php -m # インストール済み拡張を確認
mysqliがなければ、拡張が未インストールです。
解決策:
php/Dockerfile に拡張を追加:
RUN docker-php-ext-install mysqli pdo_mysql
再ビルド:
docker-compose build php
docker-compose restart php
問題4:データベース接続失敗
現象:
SQLSTATE[HY000] [2002] Connection refused
よくあるミス:
- ミス1:hostを
localhostや127.0.0.1にしている - ミス2:MySQLコンテナの起動完了前に接続している
- ミス3:パスワードが間違っている
正しい書き方:
$host = 'mysql'; // サービス名を使う。localhostではない
$user = 'root';
$pass = 'root123456'; // .envと一致しているか確認
try {
$pdo = new PDO("mysql:host=$host;dbname=test_db", $user, $pass);
echo "接続成功";
} catch(PDOException $e) {
echo "失敗: " . $e->getMessage();
}
それでも接続できない場合、MySQLの起動完了を確認:
docker-compose logs mysql
mysqld: ready for connections が表示されれば起動完了です。
問題5:コンテナ起動直後に終了
現象:
docker-compose ps
# あるコンテナのStatusがExit 1またはExit 127
調査コマンド:
docker-compose logs サービス名
よくある原因:
-
設定ファイルの構文エラー:
- Nginx設定のセミコロン
;漏れ - docker-compose.ymlのインデント誤り(Tabではなくスペース必須)
- Nginx設定のセミコロン
-
環境変数不足:
- MySQLに
MYSQL_ROOT_PASSWORDが未設定で起動失敗
- MySQLに
-
依存サービス未起動:
- NginxがPHPに依存しているが、PHPコンテナが起動しない
解決方法:
ログの指示に従って設定を修正し、再起動:
docker-compose down # 全コンテナを削除
docker-compose up -d # 再作成して起動
まとめ
Docker ComposeでDNMP環境を構築する核心価値は、大きく3点に集約されます。
- 時間節約:10分で完了。節約した時間でコーヒーを2杯余裕で飲めます
- トラブル減:チーム環境が統一され、「うちのPCでは動く」バグの深夜デバッグから解放
- 保守容易:設定ファイル自体がドキュメント。新人も見れば理解でき、先輩の手取り足取りが不要
以前は手動でLNMPを構築し、深夜2時まで環境が動かないこともありました。Docker Composeを使い始めてからは、本当に「upしてコーヒーを淹れて戻れば環境完成」です。
迷わず、退勤前の10分で試してみてください。まずOSSプロジェクト(imeepo/dnmp)をcloneして起動し、ワンコマンド起動の快適さを体感してください。慣れたら自分で設定ファイルを書いて深く学びましょう。
問題が起きても慌てないで:
- まず
docker-compose logsでログを確認 - GitHub Issuesを検索。大抵は誰かが同じ問題に遭遇済み
- それでもダメならプロジェクトリポジトリにIssueを立てる。コミュニティは活発です
最後に、Docker ComposeはPHP環境だけでなく、Node.js、Python、Goにも使えます。この考え方を身につければ、技術スタックが変わっても環境構築に悩まなくなります。
次のステップ:
- 今すぐ:
git clone https://github.com/imeepo/dnmp.gitで最初のDNMP環境を起動 - 深く学ぶ:Docker Compose公式ドキュメントで高度な使い方(docker-compose.override.ymlなど)を学ぶ
- 共有する:この記事が役に立ったら、手動構築に苦しむ同僚に共有して、彼らも解放してあげてください
Docker ComposeでPHP環境を構築する完全フロー
DNMP完全ガイド(Nginx+MySQL+PHP)。10分で完了し、チームの環境不一致を解消。
⏱️ 目安時間: 10 分
- 1
ステップ1: 問題背景と解決策を理解する
問題背景:
• チームメンバーごとに開発環境が異なる
• 新人入社時、環境構築だけで半日。先輩がマンツーマンで指導
• PC Aでは動くコードがPC Bでは動かない
• サーバーへのデプロイも当たり外れ
• PHPバージョン不一致(7.4 vs 8.1)
• MySQLバージョン不一致(5.7 vs 8.0)
解決策:
• Docker ComposeでDNMP(Docker+Nginx+MySQL+PHP)開発環境を一発構築
• 10分で完了し、チームの環境不一致を根本から解消
• 全メンバーが同じ環境設定を使用 - 2
ステップ2: docker-compose.ymlを設定してサービスを起動
完全な設定:
• docker-compose.ymlでNginx、MySQL、PHPの3サービスを定義
• ネットワーク接続を設定
• データ永続化を設定
• 環境変数を設定
• ヘルスチェックを設定し、正常起動を確認
10分デプロイフロー:
1) docker-compose.ymlファイルを作成
2) Nginx、MySQL、PHPサービスを設定
3) サービス起動:docker-compose up -d
4) 稼働状態を確認:docker-compose ps
5) PHPアプリをテスト:http://localhost にアクセス - 3
ステップ3: よくある問題とベストプラクティス
よくある問題:
• NginxがPHP-FPMのsocketファイルを見つけられない
• MySQL接続失敗
• PHP拡張モジュール不足
• 設定ファイルが反映されない
解決方法:
• ログの指示に従って設定ファイルを修正
• 再起動:docker-compose down → docker-compose up -d
ベストプラクティス:
• バージョンタグでイメージバージョンを固定
• データ永続化を設定
• ヘルスチェックを設定
• 環境変数で設定を管理
• イメージを定期的に更新
• 設定内容をドキュメント化
次のステップ:
• 今すぐ:git clone https://github.com/imeepo/dnmp.git で最初のDNMP環境を起動
• 深く学ぶ:Docker Compose公式ドキュメントで高度な使い方を学ぶ
• 共有する:手動構築に苦しむ同僚に共有する
FAQ
なぜDocker ComposeでPHP環境を構築するのか?
• チームメンバーごとに開発環境が異なる
• 新人入社時、環境構築だけで半日。先輩がマンツーマンで指導
• PC Aでは動くコードがPC Bでは動かない
• サーバーへのデプロイも当たり外れ
• PHPバージョン不一致(7.4 vs 8.1)
• MySQLバージョン不一致(5.7 vs 8.0)
解決策:Docker ComposeでDNMP(Docker+Nginx+MySQL+PHP)開発環境を一発構築。10分で完了し、チームの環境不一致を根本から解消。全メンバーが同じ環境設定を使用できる。
Docker ComposeでDNMP環境をどうデプロイするか?
• docker-compose.ymlでNginx、MySQL、PHPの3サービスを定義
• ネットワーク接続を設定
• データ永続化を設定
• 環境変数を設定
• ヘルスチェックを設定し、正常起動を確認
10分デプロイフロー:
1) docker-compose.ymlファイルを作成
2) Nginx、MySQL、PHPサービスを設定
3) サービス起動:docker-compose up -d
4) 稼働状態を確認:docker-compose ps
5) PHPアプリをテスト:http://localhost にアクセス
DNMP環境デプロイでよくある問題は?
• NginxがPHP-FPMのsocketファイルを見つけられない
• MySQL接続失敗
• PHP拡張モジュール不足
• 設定ファイルが反映されない
解決方法:
• ログの指示に従って設定ファイルを修正
• 再起動:docker-compose down → docker-compose up -d
トラブルシュート手順:
• コンテナログを確認:docker-compose logs
• サービス状態を確認:docker-compose ps
• ネットワーク接続を確認:docker network inspect
• 設定ファイルが正しいか確認
Docker Compose PHP環境のベストプラクティスは?
• バージョンタグでイメージバージョンを固定
• データ永続化を設定
• ヘルスチェックを設定
• 環境変数で設定を管理
• イメージを定期的に更新
• 設定内容をドキュメント化
次のステップ:
• 今すぐ:git clone https://github.com/imeepo/dnmp.git で最初のDNMP環境を起動
• 深く学ぶ:Docker Compose公式ドキュメントで高度な使い方を学ぶ
• 共有する:手動構築に苦しむ同僚に共有して、彼らも解放される
6分で読めます · 公開日: 2025年12月18日 · 更新日: 2026年6月8日
Docker 実践ガイド
検索からこのページに来た場合は、前後の記事もあわせて読むと同じテーマの理解がかなり早く深まります。
前の記事
Docker Compose エラー排查マニュアル:5 大よくあるエラーの即効解決法
Docker Compose でエラーが出たときの対処法。ポート競合、ネットワーク、ビルド失敗、コンテナ終了、権限エラーの 5 大カテゴリを体系的に整理し、5 分で原因を特定できる排查フローを解説します。
第 24 / 37 記事
次の記事
Docker で Redis をデプロイする完全ガイド:永続化とパスワード認証でデータ消失を防ぐ
Docker で Redis をデプロイし、RDB/AOF 永続化とパスワード認証を設定してコンテナ再起動時のデータ消失を防ぐ手順。本番向けの redis.conf とコード例付き
第 26 / 37 記事
関連記事
Dockerfile入門:ゼロから最初の Docker イメージを作る(実例付き)
Dockerfile入門:ゼロから最初の Docker イメージを作る(実例付き)
Docker vs 仮想マシン:5分で理解する性能差とシーン別選び方ガイド
Docker vs 仮想マシン:5分で理解する性能差とシーン別選び方ガイド
Docker インストールの落とし穴ガイド 2025:permission denied から正常起動までの完全解決策
コメント
GitHubアカウントでログインしてコメントできます