導入
このブログのキャッチコピーは「未来の自分のための技術メモ、時々あなたのためのヒント。」ですが、今回はWeb開発の未来を支える「Docker」という技術を使って、あなたの開発環境を劇的に改善するヒントです。
「開発環境と本番環境で、PHPのバージョンが違うせいでエラーが出た…」
「新しいプロジェクトを始めるたびに、環境構築が面倒で時間がかかる…」
「チームメンバーと開発環境を統一したいけど、どうすれば…?」
もしあなたがWeb開発者なら、こんな悩みを一度は経験したことがあるのではないでしょうか?
そんな悩みを解決するのが、今やWeb開発の必須ツールとなりつつある「Docker(ドッカー)」です。
この記事では、Dockerとは何かという基礎の基礎から、実際にDockerを使ってNginx(Webサーバー)とPHP-FPM(PHPの高速実行環境)を組み合わせたWebサーバー環境を、あなたのPCの中に構築する方法を、図解とコピペできるコードを交えて徹底的に解説します。
Docker初心者の方でも安心して取り組めるよう、一つ一つの手順と概念を丁寧に解説しますので、ぜひ一緒に「コンテナ開発」の世界へ飛び込んでみましょう!
Dockerとは? コンテナの魔法を解き明かす!
Dockerとは、一言で言うと「アプリケーションと、それが動くために必要なもの全てを、小さな箱(コンテナ)に詰めて持ち運べるようにする技術」です。
もう少し身近な例で考えてみましょう。
イメージ:「引っ越しコンテナ」と「荷物セット」
あなたは、ある国でレストランを開きたいと考えています。
通常のサーバー構築は、「その国の土地を借りて、建物を建て、厨房設備を導入し、食材を仕入れる」作業に似ています。非常に手間と時間がかかかりますよね。
Dockerを使うと、この作業が全く変わります。
- 「料理(アプリケーション)の作り方」が書かれた設計図(Dockerfile)
- 「厨房設備一式(Nginx, PHP-FPMなど)」が完璧に揃った箱(Dockerイメージ)
- その箱から作られた、実際に動くレストランの厨房(Dockerコンテナ)
Dockerイメージは「厨房設備が完璧にパッケージングされた段ボール箱」のようなものです。この箱を世界中のどこへでも持ち運び、どこでも同じように「レストランの厨房」を簡単に展開できるのです。
Docker(コンテナ)の5つのメリット
- 「どこでも同じように動く」環境の統一性開発中のあなたのPCでも、テスト用のサーバーでも、そして本番公開用のサーバーでも、全く同じ環境を「コンテナ」として再現できます。「僕の環境では動いたのに!」という悲劇とはお別れです。
- 「持ち運びが楽チン」な可搬性一度コンテナイメージを作成すれば、それをチームメンバーに渡したり、別のサーバーにデプロイしたりするのが非常に簡単です。まるで「魔法の箱」のように、どこへでも持っていけます。
- 「それぞれ独立」した分離性コンテナはそれぞれが独立した環境なので、あるプロジェクトのPHPバージョンが古くても、別のプロジェクトのPHPバージョンに影響を与えません。依存関係の競合によるトラブルを防げます。
- 「サクサク動く」効率性従来の仮想マシン(VirtualBoxなど)のようにOS全体を動かす必要がないため、非常に軽量で起動が高速です。PCのリソースも節約できます。
- 「壊れても安心」な使い捨てのしやすさコンテナは簡単に作ったり壊したりできます。設定を間違えても、すぐに作り直せるので、試行錯誤がしやすいのも大きなメリットです。
開発環境構築の全体像
今回構築するNginx + PHP-FPM環境は、Webサイトの表示に不可欠な2つの主要なコンポーネントで構成されます。
- Nginxコンテナ: Webサーバーとして、ブラウザからのHTTPリクエストを受け付け、静的ファイル(HTML, CSS, 画像など)を直接返したり、PHPの処理が必要なリクエストをPHP-FPMコンテナに転送したりします。
- PHP-FPMコンテナ: PHPのコードを実行する役割を担います。Nginxから送られてきたPHPの処理を行い、その結果をNginxに返します。
この2つのコンテナを連携させ、あなたのPC上でWebサイトが動くようにします。
Step 1: Docker Desktopのインストール(PCへの導入)
まず、あなたのPCでDockerを動かすためのソフトウェア「Docker Desktop」をインストールします。これは、Dockerのコンテナを管理・実行するためのツールです。
- Windows / macOSユーザーの方へ:
- Docker公式サイトにアクセスし、「Docker Desktop」をダウンロードします。https://www.docker.com/products/docker-desktop/
- ダウンロードしたインストーラーを起動し、画面の指示に従ってインストールを進めます。途中でWSL 2の有効化などが求められる場合があります(Windowsの場合)。
- Linuxユーザーの方へ:
- お使いのLinuxディストリビューション(Ubuntu, CentOSなど)の公式ドキュメントに従って、Docker Engineをインストールしてください。
- 例 (Ubuntu):
sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
インストール後の確認:
インストールが完了したら、PCのターミナル(コマンドプロンプトやPowerShell, WSL, ターミナルアプリなど)を開き、以下のコマンドを実行してDockerが正しく動作することを確認します。
docker --version
# 例: Docker version 24.0.5, build 24.0.5-0ubuntu1
docker compose version
# 例: Docker Compose version v2.20.2
# Docker Compose V2がインストールされていることを確認します。
docker composeコマンドが認識されればOKです。もしdocker-compose(ハイフンあり)の古いバージョンがインストールされている場合は、そちらを使っても構いませんが、新しいプロジェクトではdocker compose(ハイフンなし)が推奨されています。
Step 2: プロジェクトディレクトリの作成とファイル構成の理解
DockerでWebサーバー環境を構築するために、まずプロジェクトの作業ディレクトリを作成し、必要なファイルやフォルダを配置します。
my-docker-web-app/ # プロジェクトのルートディレクトリ
├── docker-compose.yml # (A) Docker Composeの全体設定ファイル
├── html/ # (B) Webサイトのファイル(HTML, CSS, PHPなど)
│ └── index.php # (B-1) テスト用のPHPファイル
├── nginx/ # (C) Nginxコンテナの設定ファイル用ディレクトリ
│ └── default.conf # (C-1) Nginxのサイト設定ファイル
└── php/ # (D) PHP-FPMコンテナの設定ファイル用ディレクトリ
├── Dockerfile # (D-1) PHPコンテナの「設計図」
└── php.ini # (D-2) PHPの設定ファイル
各ファイルの役割をざっと確認しましょう。
- (A)
docker-compose.yml: Docker Composeの「司令塔」となるファイルです。NginxとPHP-FPMの2つのコンテナをどうやって起動し、どう連携させるかを記述します。 - (B)
html/: ここにあなたのWordPressファイルや、今回作成するindex.phpなどのWebサイトのファイルを置きます。 - (C)
nginx/default.conf: Nginxの動作設定を記述するファイルです。どのポートで待ち受けるか、PHPファイルをどう処理するかなどを定義します。 - (D)
php/Dockerfile: PHP-FPMコンテナを「どのように組み立てるか」を記述する設計図です。PHPのバージョンや、WordPressに必要な拡張機能などをここで指定します。 - (D)
php/php.ini: PHPのメモリ制限やタイムゾーンなどの詳細な設定を記述するファイルです。
これらのファイルを手作業で作成していきます。
Step 3: docker-compose.ymlの作成(コンテナの司令塔)
プロジェクトのルートディレクトリに、docker-compose.ymlという名前で以下のファイルを作成してください。これが、NginxとPHP-FPMの2つのコンテナをまとめて起動・管理するための「設計図」になります。
version: '3.8' # Docker Composeのバージョンを指定。新しい機能が使えるよう3.8以降を推奨
services:
# === Nginxサービス定義 ===
nginx:
image: nginx:latest # Docker Hubから「最新版のNginxイメージ」をダウンロードして使用する
container_name: my-nginx-web # コンテナに分かりやすい名前を付ける(オプション)
ports:
- "80:80" # ホストPCの80番ポートを、コンテナ内のNginxの80番ポートに接続(マッピング)
# これにより、PCのWebブラウザからhttp://localhostでアクセスできるようになる
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro # ホストPCのNginx設定ファイルをコンテナ内にマウント
- ./html:/var/www/html # ホストPCのhtmlディレクトリをコンテナのWebルートにマウント
depends_on:
- php # このnginxサービスは、phpサービスが完全に起動してから起動する(依存関係)
networks:
- app-network # コンテナ間通信用のネットワーク「app-network」に参加させる
# === PHP-FPMサービス定義 ===
php:
build:
context: ./php # 「./php」ディレクトリ内のDockerfileを使って、このコンテナのイメージをビルドする
container_name: my-php-fpm # コンテナに分かりやすい名前を付ける(オプション)
volumes:
- ./html:/var/www/html # ホストPCのhtmlディレクトリをコンテナのWebルートにマウント(Nginxと同じ場所)
networks:
- app-network # コンテナ間通信用のネットワーク「app-network」に参加させる
# === ネットワーク定義 ===
networks:
app-network:
driver: bridge # コンテナ間通信用のプライベートネットワークを作成
version: '3.8': Docker Composeファイルの書き方(バージョン)を指定しています。通常は最新の安定版を指定します。services:: ここで起動したいコンテナ(サービス)を定義します。今回はnginxとphpの2つです。nginx:: Nginxコンテナの設定です。image: nginx:latest: Docker HubというDockerイメージの公開リポジトリから、最新のNginxイメージをダウンロードして使います。ports: - "80:80": あなたのPCの80番ポートへのアクセスを、このNginxコンテナの80番ポートへ転送(ポートフォワード)します。これにより、ブラウザでhttp://localhostと入力すると、コンテナ内のNginxにアクセスできます。volumes:: ここが重要です! ホストPC(あなたのPC)のファイルやディレクトリを、コンテナ内に「共有フォルダ」のようにマウントします。./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro: あなたが作ったNginxの設定ファイルdefault.confを、コンテナ内のNginxが設定を読み込む場所へマウントします。:roは読み取り専用(Read Only)を意味し、誤ってコンテナ内から設定ファイルを変更するのを防ぎます。./html:/var/www/html: あなたのWebサイトのファイル(index.phpなど)を置くhtmlディレクトリを、NginxがWebサイトの公開ディレクトリとして利用する/var/www/htmlにマウントします。これにより、ホストPCでhtmlディレクトリ内のファイルを編集すると、即座にコンテナ内のNginxにも反映されます。
depends_on: - php: NginxコンテナはPHPコンテナが起動してから起動するように設定しています。
php:: PHP-FPMコンテナの設定です。build: context: ./php: PHPコンテナは、./phpディレクトリ内にあるDockerfileという設計図を元に、独自のイメージをビルドして作成します。volumes: - ./html:/var/www/html: こちらもNginxと同じく、htmlディレクトリをPHPが利用するWebルートにマウントします。
networks:: コンテナ間で通信するためのプライベートネットワークを定義します。driver: bridgeは最も一般的な設定です。このネットワーク内では、コンテナ名(例:php)で互いにアクセスできるようになります。
Step 4: Nginx設定ファイル (nginx/default.conf) の作成
nginxディレクトリ内に、default.confという名前で以下のファイルを作成してください。NginxがWebサイトの表示やPHPファイルの処理をどう行うかを定義します。
server {
listen 80; # 80番ポートでHTTPリクエストを待ち受ける
server_name localhost; # アクセスするドメイン名(ローカル環境なのでlocalhost)
root /var/www/html; # Webサイトのファイルが置かれているディレクトリ
index index.php index.html; # ディレクトリにアクセスした際に、最初に表示するファイル
# 静的ファイル(HTML, CSS, JS, 画像など)の処理ルール
location / {
# アクセスされたファイルが存在すればそれを表示、なければ404エラー
try_files $uri $uri/ =404;
}
# PHPファイルの処理ルール
location ~ \.php$ {
# PHP-FPMコンテナにリクエストを転送する
# `php`はdocker-compose.ymlで定義したPHPサービスのコンテナ名、`9000`はPHP-FPMが待ち受けるポート
fastcgi_pass php:9000;
fastcgi_index index.php; # ディレクトリ内のPHPファイルにアクセスされた場合のデフォルトファイル
# FastCGIのパラメータ設定(PHPスクリプトのパスなど)
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; # Nginxに標準で含まれるFastCGIの共通パラメータを読み込む
}
# `.htaccess`ファイルなど、隠したいファイルへのアクセスを拒否
location ~ /\.ht {
deny all;
}
}
listen 80;: NginxがHTTPリクエストを80番ポートで待ち受けます。root /var/www/html;: Webサイトのファイル(index.phpなど)が置かれているディレクトリを指定しています。このパスはdocker-compose.ymlでマウントした./htmlがコンテナ内で見えるパスと一致させています。location ~ \.php$:.phpで終わるURLへのリクエストが来た場合の処理ルールです。fastcgi_pass php:9000;: ここがPHP-FPMとの連携部分です。リクエストをphpという名前のコンテナ(docker-compose.ymlで定義したPHPサービス)の9000番ポートへ転送します。PHP-FPMはデフォルトで9000番ポートで待ち受けています。
Step 5: PHP-FPM用 Dockerfileとphp.iniの作成(PHP環境のカスタマイズ)
phpディレクトリ内に、以下のDockerfileとphp.iniを作成してください。これらはPHPコンテナの構築方法とPHPの動作設定を定義します。
php/Dockerfile (PHPコンテナの「設計図」)
このファイルは、どのようなPHP環境を構築したいかをDockerに指示するものです。WordPressに必要なPHP拡張機能などをここで追加します。
# ベースイメージとして、PHP 8.2のFPM(FastCGI Process Manager)版を使用
# FPMはNginxなどのWebサーバーと連携してPHPを高速に実行するためのものです。
FROM php:8.2-fpm
# 必要なPHP拡張機能をインストールするためのコマンド
# `apt-get update`でパッケージリストを更新し、`apt-get install -y`で必要なライブラリをインストール
RUN apt-get update && apt-get install -y \
libpq-dev \ # PostgreSQL接続用のライブラリ(使わない場合は不要)
libzip-dev \ # Zipアーカイブ操作用のライブラリ(WordPressでよく使う)
libjpeg-dev \ # JPEG画像処理用のライブラリ
libpng-dev \ # PNG画像処理用のライブラリ
libfreetype6-dev \ # FreeTypeフォントライブラリ(画像処理関連で必要)
# これらのライブラリをインストールした後、Dockerが提供するツールでPHP拡張機能を有効化
&& docker-php-ext-install pdo_mysql zip gd # MySQL/MariaDB接続、zip圧縮/解凍、画像処理用gdを有効化
# カスタムphp.iniをコンテナ内の適切な場所(PHPの設定ディレクトリ)にコピー
COPY php.ini /usr/local/etc/php/conf.d/
FROM php:8.2-fpm: PHPのバージョンを指定しています。ここでは8.2のFPM版を使います。RUN apt-get update && apt-get install -y ...: PHPコンテナ内でapt-getコマンドを使って、追加のライブラリをインストールしています。libjpeg-devなどは、WordPressが画像を処理するために必要です。&& docker-php-ext-install pdo_mysql zip gd: インストールしたライブラリを使って、PHPの拡張機能(WordPressでデータベース接続に必要なpdo_mysql、画像処理に必要なgdなど)を有効化しています。COPY php.ini /usr/local/etc/php/conf.d/: 次に作成するphp.iniファイルを、コンテナ内のPHPが設定を読み込むディレクトリにコピーします。
php/php.ini (PHPの個別設定)
このファイルは、PHPのメモリ制限やファイルアップロードサイズなど、PHPの動作に関する詳細な設定を定義します。
# === 基本設定 ===
# メモリ制限(WordPressでは最低128M、推奨は256M以上)
memory_limit = 256M
# アップロード可能なファイルの最大サイズ
upload_max_filesize = 32M
# POSTメソッドで送信できるデータの最大サイズ(upload_max_filesizeより大きくする)
post_max_size = 32M
# スクリプトの最大実行時間(秒)。長い処理がある場合は長くする
max_execution_time = 300
# === タイムゾーン設定 ===
date.timezone = Asia/Tokyo # 日本時間にする
# === エラーログ設定(重要!) ===
# 本番環境ではエラーメッセージをブラウザに表示しない(セキュリティのため)
display_errors = Off
# エラーは必ずログファイルに出力する
log_errors = On
# エラーログの出力先を指定(コンテナ内のパス)
error_log = /var/log/php/error.log
memory_limit: PHPスクリプトが使用できるメモリの上限です。WordPressでは128M以上が推奨されます。date.timezone: タイムゾーンを日本時間に設定します。display_errors = Off: 開発環境でも、通常はOffを推奨します。 エラーメッセージにサーバーの内部情報が含まれる場合があり、セキュリティリスクになります。エラーはerror_logに出力しましょう。
Step 6: Webサイトファイル (html/index.php) の作成
htmlディレクトリ内に、index.phpという名前で以下のファイルを作成してください。これがブラウザでアクセスした時に表示されるテスト用のWebページになります。
<?php
// NginxとPHP-FPMがDocker環境で連携していることを示すメッセージ
echo "<h1>Hello from Nginx & PHP-FPM with Docker!</h1>";
echo "<p>PHP Version: " . phpversion() . "</p>";
// phpinfo()関数でPHPの詳しい情報を表示
// 設定が正しく反映されているか確認できます。
phpinfo();
?>
phpinfo()関数は、PHPのバージョン、設定、有効になっている拡張機能など、詳細な情報を表示してくれます。このファイルにアクセスすることで、PHP環境が正しく構築されているかを確認できます。
Step 7: Docker Composeで環境を起動する!
すべてのファイルが準備できたら、プロジェクトのルートディレクトリ(docker-compose.ymlがある場所)でターミナルを開き、以下のコマンドを実行してDocker環境を起動します。
docker compose up -d
docker compose up:docker-compose.ymlに定義されたすべてのサービス(NginxとPHP-FPMのコンテナ)を起動します。-d: 「デタッチモード」を意味します。コンテナをバックグラウンドで実行し、ターミナルを占有しないようにします。
起動成功の確認:
コマンド実行後、以下のようなメッセージが表示されれば、コンテナは正常に起動しています。
[+] Running 2/2
✔ Container my-php-fpm Started 0.0s
✔ Container my-nginx-web Started 0.0s
次に、Webブラウザを開き、http://localhostにアクセスしてください。
「Hello from Nginx & PHP-FPM with Docker!」のメッセージと、PHPの詳しい情報(phpinfoのページ)が表示されれば、Webサーバー環境の構築は成功です!
これで、あなたのPCの中に、NginxとPHP-FPMが連携する本格的なWebサーバー環境がDockerコンテナとして構築されました。
コンテナを停止・削除する場合:
作業が終わったら、以下のコマンドでコンテナを停止し、関連するリソースを削除できます。
docker compose down
down:upで起動したサービスを全て停止し、コンテナ、ネットワーク、ボリュームなどを削除します。
よくあるエラーとトラブルシューティング
Docker初心者にとって、環境構築はエラーの連続かもしれません。しかし、エラーメッセージをよく読み、一つずつ解決していくことで必ず理解が深まります。
- 「Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use」
- 原因: ホストPCの
80番ポートが、すでに別のアプリケーション(Webサーバー、Skypeなど)によって使用されている場合に発生します。 - 対処法:
- 競合しているアプリケーションを停止します。
docker-compose.ymlのports設定を"8080:80"のように変更し、http://localhost:8080でアクセスするようにします。
- 原因: ホストPCの
- Webブラウザで「502 Bad Gateway」が表示される
- 原因: Nginxは動いているが、PHP-FPMコンテナが正常に動作していないか、NginxからPHP-FPMへの接続がうまくいっていない場合に発生します。
- 対処法:
docker compose logs phpコマンドでPHPコンテナのログを確認します。PHPの起動エラーがないかチェック。php/Dockerfileやphp/php.iniに文法エラーがないか再確認します。docker-compose.ymlのphpサービス名と、nginx/default.conf内のfastcgi_pass php:9000;のphp部分が一致しているか確認します。
- Webブラウザで「403 Forbidden」または「404 Not Found」が表示される
- 原因: Nginxがファイルを見つけられない、またはアクセス権限がない。
- 対処法:
html/index.phpがhtmlディレクトリ内に正しく配置されているか確認します。docker-compose.ymlのvolumes設定で、./html:/var/www/htmlが正しくマウントされているか確認します。
docker-compose.ymlやdefault.confなどの設定ファイルに構文エラーがある- 原因: YAMLファイルやNginx設定ファイルの記述ミス。
- 対処法:
- コマンド実行時にエラーメッセージが表示されるはずです。そのメッセージに従って、該当行の記述を見直します。インデント(スペース)の数も厳密に守る必要があります。
次のステップ:応用編とWordPress導入に向けて
これでNginxとPHP-FPMの環境が手に入りました。次のステップとして、さらに本格的な開発環境を目指しましょう。
- データベース(MySQL/MariaDB)コンテナの追加:docker-compose.ymlにmysqlサービスを追加し、WordPressが利用するデータベースを構築します。
- 参考:
image: mysql:8.0,environment: MYSQL_ROOT_PASSWORD,MYSQL_DATABASEなどの設定。
- 参考:
- WordPress本体の導入:htmlディレクトリにWordPressのファイルをダウンロード・展開し、docker-compose.ymlでMySQLコンテナと連携させれば、Docker環境内でWordPressを動かせます。
Dockerは奥が深く、一度基礎を理解すれば、様々なアプリケーションの環境構築が驚くほど簡単になります。ぜひ、この経験を活かして、あなたのWeb開発をさらに加速させてください!
おわりに
今回は、Dockerを使ってNginxとPHP-FPMのWebサーバー環境を構築する基本手順を徹底的に解説しました。
最初は少し難しく感じるかもしれませんが、コンテナの概念とdocker-compose.ymlの書き方を理解すれば、非常に強力な開発ツールとなります。
このガイドが、あなたのDocker学習の第一歩、そして開発効率向上の一助となれば幸いです。



コメント