はじめに
Web制作をしていると、こんな場面がありませんか?
これらの問題を解決してくれるのが Docker です。
今回の記事では、
・Nginx(Webサーバー)
・PHP-FPM(PHP実行環境)
・MySQL(データベース)
・phpMyAdmin(DB管理画面)
を組み合わせた、実務でもよく使われる構成を紹介します。
以前ご紹介した「Apacheを使った簡易的なPHP環境」(下記記事)とは異なり、
今回はデータベースを使用するサイトを想定した、より本格的な開発環境です。

※ データベースを使う場合に必ずNginxを選ぶわけではありません。(後述します)
今回は、実際の案件でもよく見かける「Nginx + PHP-FPM」の構成を例として解説しています。
Dockerとは?
Dockerは 「自分のパソコンの中に、小さなサーバーを作る道具」 です。
通常、PHPやデータベースを使うWebサイトを動かすには レンタルサーバー が必要です。
でも開発中に毎回リモートにFTPなどを使用してアップロード→確認するのは大変です。
Dockerを使うと、自分のパソコンの中に レンタルサーバーとほぼ同じ環境 を作って、ローカルで動作確認ができるようになります。
データベースを使うときはNginxじゃないとダメ?
※ それぞれの詳しい説明は別の記事で紹介しているので省きます。
「データベースを使うならNginx」
「データベースを使わないならApache」・・・
という決まりはありません。
ApacheでもMySQLを使ったサイトは作れますし、Nginxでもデータベースを使わないPHPサイトは作れます。
今回は、Nginxを採用している案件を想定しているため、Nginx版のDocker環境を紹介しています。
どっちを使うといいのか
新規制作の場合は、自分でApacheやNginxを選択できます。
一方で、既存サイトの修正や引き継ぎ案件では、すでに採用されている環境に合わせるのが一般的です。
例えば、
というように、既存の設定ファイルを見ることで、どちらの環境なのか判断できます。
Dockerを使うまでの流れ
簡単な流れとしては、
データベースを使用するためのファイルを作成
(参考記事):https://note.com/maple_project/n/na03dcf62750b)
↓
Docker Desktop環境ファイルを作成
(参考記事):https://note.com/maple_project/n/n92605930a4a1)
↓
リモートphpMyAdminからデータベースをエクスポート
ローカルでインポート
(上書き保存方法について参考記事:https://mapletc.net/archives/1827)
こんな感じです。
ファイル構成
今回作成するファイルの全体像です。
プロジェクト/
├── docker-compose.yml ← ①「監督」全体をまとめる指示書
├── docker/
│ ├── Dockerfile ← ②(1) Nginx(Webサーバー)の設計図
│ ├── nginx.conf ← ③ Nginxの設定ファイル
│ └── php/
│ └── Dockerfile ← ②(2) PHP の設計図
└── sample/
└── public/ ← 実際のWebサイトのファイル
なぜファイルの場所がバラバラなの?
docker-compose.ymlがルート(一番上)にある理由:
全体の「監督」なので、プロジェクトの一番上に置くのがルールです。
Dockerfileがdocker/フォルダの中にある理由:
Dockerfileは各サーバーの「設計図」です。
Docker関連のファイルとしてdocker/フォルダにまとめて、整理整頓しています。
NginxとPHPで設計図が異なるので、PHPの設計図はさらにdocker/php/フォルダの中に入れています。
各コードの詳細
各ファイルの中のコード解説は、別の記事で一つ一つ説明しているので気になる方はご参照ください。

基本的な使い方
起動する
docker compose up --build
--build をつけると、Dockerfileの変更が反映されます。
初回や設定を変更した後は必ずつけましょう。
ブラウザで確認
| URL | 何が見えるか |
|---|---|
http://localhost | Webサイト |
http://localhost:8080 | phpMyAdmin(DB管理画面) |
停止する
docker compose down
データベースの中身は db_data に保存されているので、停止しても消えません。
データも含めて全部消したい場合
docker compose down -v
-v をつけると保存領域(db_data)も削除されます。次回起動時にデータベースが空の状態に戻ります。
機密情報ファイルのホスト名について
PHPからデータベースに接続する際、本番環境とDocker環境では 接続先のホスト名が異なります。
パスワードを書いているファイルを変更する必要があります。
// 本番(リモートサーバー)の場合
$db_host = 'localhost';
// Docker(ローカル開発)の場合
$db_host = 'db';
Docker環境では、データベースの接続先は localhost ではなく db です。
これはdocker-compose.ymlで定義したサービス名がそのままホスト名になるためです。
環境を切り替える時は、db_file_key.php の $db_host を変更する必要があります。
データベースに使うファイルについて
機密情報ファイルという名前がいきなり出てきましたが、データベースを使用する際には専用のファイルが必要になります。
別の記事でデータベースを使ったPHPサイトに必要なファイルについて詳しく説明しているので、ぜひご覧ください。

データベースのインポートエクスポートについて
Dockerを使ってローカルでサイト表示を確認する際に、リモート側のデータベースを何もしないで同期させることはできません。
phpMyAdminでデータベースを簡単にコピーすることができます。
下記記事で紹介しているのでご参照ください!

まとめ
流れとしては、
「Webサイトを見る」
↓
Nginxが受け取る
↓
PHPならPHP-FPMへ渡す
↓
DBが必要ならMySQLへ問い合わせる
↓
結果をブラウザへ返す
このような感じになります。
またそれぞれのファイルを簡単にまとめると、
| ファイル | 役割 | 一言で言うと |
|---|---|---|
docker-compose.yml | 全体の指示書 | 「この4つのサーバーを立ててね」 |
docker/Dockerfile | Nginxの設計図 | 「Webサーバーはこう作ってね」 |
docker/php/Dockerfile | PHPの設計図 | 「PHPにDB接続機能を追加してね」 |
docker/nginx.conf | Nginxの設定 | 「PHPファイルはPHPサーバーに転送してね」 |
こんな感じです。
Dockerを使えば、本番環境とほぼ同じ環境を手元で再現でき、コードの修正 → 即確認という快適な開発サイクルが実現できます。


