🔰はじめての方へ

【データベース×Docker】PHPサイトをローカルで動かす環境を作る方法|Nginx

Docker
記事内に広告が含まれています。
スポンサーリンク

はじめに

Web制作をしていると、こんな場面がありませんか?

  • コードを書いたけど、レンタルサーバーにアップロードしないと動作確認できない
  • データベースを使うページを作ったけど、ローカルで確認する方法がわからない
  • PHPファイルをブラウザで開いても、コードがそのまま表示されてしまう

これらの問題を解決してくれるのが Docker です。

今回の記事では、

Nginx(Webサーバー)
PHP-FPM(PHP実行環境)
MySQL(データベース)
phpMyAdmin(DB管理画面)

を組み合わせた、実務でもよく使われる構成を紹介します。

以前ご紹介した「Apacheを使った簡易的なPHP環境」(下記記事)とは異なり、

今回はデータベースを使用するサイトを想定した、より本格的な開発環境です。

【初心者でもわかる】 Docker Desktopを導入してPHPサイトで使えるようにする方法
はじめにDockerを使うには、まず Docker Desktop というアプリをインストールする必要があります。この記事では、Docker Desktopのインストールから、実際にPHPサイトを表示するまでの手順をまとめています。Dock…

※ データベースを使う場合に必ずNginxを選ぶわけではありません。(後述します

今回は、実際の案件でもよく見かける「Nginx + PHP-FPM」の構成を例として解説しています。


Dockerとは?

Dockerは 「自分のパソコンの中に、小さなサーバーを作る道具」 です。

通常、PHPやデータベースを使うWebサイトを動かすには レンタルサーバー が必要です。

でも開発中に毎回リモートにFTPなどを使用してアップロード→確認するのは大変です。

Dockerを使うと、自分のパソコンの中に レンタルサーバーとほぼ同じ環境 を作って、ローカルで動作確認ができるようになります。

データベースを使うときはNginxじゃないとダメ?

※ それぞれの詳しい説明は別の記事で紹介しているので省きます。

「データベースを使うならNginx」
「データベースを使わないならApache」・・・

という決まりはありません。

ApacheでもMySQLを使ったサイトは作れますし、Nginxでもデータベースを使わないPHPサイトは作れます。

今回は、Nginxを採用している案件を想定しているため、Nginx版のDocker環境を紹介しています。

どっちを使うといいのか

新規制作の場合は、自分でApacheやNginxを選択できます。

一方で、既存サイトの修正や引き継ぎ案件では、すでに採用されている環境に合わせるのが一般的です。

例えば、

  • nginx.conf がある → Nginx
  • apache-config.conf がある → Apache
  • Dockerfile に FROM nginx と書かれている → Nginx
  • Dockerfile に FROM php:8.x-apache と書かれている → Apache

というように、既存の設定ファイルを見ることで、どちらの環境なのか判断できます。


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がルート(一番上)にある理由:
  全体の「監督」なので、プロジェクトの一番上に置くのがルールです。

Dockerfiledocker/フォルダの中にある理由:
  Dockerfileは各サーバーの「設計図」です。
  Docker関連のファイルとしてdocker/フォルダにまとめて、整理整頓しています。
  NginxとPHPで設計図が異なるので、PHPの設計図はさらにdocker/php/フォルダの中に入れています。


各コードの詳細

各ファイルの中のコード解説は、別の記事で一つ一つ説明しているので気になる方はご参照ください。

【データベース×Docker】PHPサイトをローカルで動かす環境を作る方法|Nginx| 各コード説明【初心者向け完全版】|momiji
はじめに Web制作をしていると、こんな場面がありませんか? コードを書いたけど、サーバーにアップロードしないと動作確認できない データベースを使うページを作ったけど、ローカルで確認する方法がわからない PHPファイルをブラウザで開いても、…



基本的な使い方

起動する

docker compose up --build

--build をつけると、Dockerfileの変更が反映されます。

初回や設定を変更した後は必ずつけましょう。

ブラウザで確認

URL何が見えるか
http://localhostWebサイト
http://localhost:8080phpMyAdmin(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サイトに必要なファイルについて詳しく説明しているので、ぜひご覧ください。

初心者の私がデータベースを使用したコードを理解するまで【コード例あり】|momiji
Web制作の勉強をしていて、避けたかったものがあります・・・ それが、データベースです。 触ったら危ないことが起きるんじゃないかとか・・・ 実際にAIを使って学習していたのですが、 PDOって何? DSNって何? prepare? exec…

データベースのインポートエクスポートについて

Dockerを使ってローカルでサイト表示を確認する際に、リモート側のデータベースを何もしないで同期させることはできません。

phpMyAdminでデータベースを簡単にコピーすることができます。

下記記事で紹介しているのでご参照ください!

phpMyAdmin エクスポート&インポート方法(上書き保存対応)
はじめにリモートサーバーのデータベースをローカル環境にコピーしたいとき、phpMyAdminのエクスポート・インポート機能を使うと簡単にできます。ただし、ローカルに同じテーブルが既にある場合、そのままインポートすると「テーブルはすでに存在し…

まとめ

流れとしては、

「Webサイトを見る」

Nginxが受け取る

PHPならPHP-FPMへ渡す

DBが必要ならMySQLへ問い合わせる

結果をブラウザへ返す

このような感じになります。

またそれぞれのファイルを簡単にまとめると、

ファイル役割一言で言うと
docker-compose.yml全体の指示書「この4つのサーバーを立ててね」
docker/DockerfileNginxの設計図「Webサーバーはこう作ってね」
docker/php/DockerfilePHPの設計図「PHPにDB接続機能を追加してね」
docker/nginx.confNginxの設定「PHPファイルはPHPサーバーに転送してね」

こんな感じです。

Dockerを使えば、本番環境とほぼ同じ環境を手元で再現でき、コードの修正 → 即確認という快適な開発サイクルが実現できます。