DockerでPHP+MySQL開発環境を作る|初めてでも30分で完成
DockerでPHP+MySQL開発環境を作る|初めてでも30分で完成
1. はじめに
前回の記事(生成AIでプログラミング学習、その前に|社内SEが知っておくべきセキュリティの基本)では、生成AIを使う際のセキュリティの基本を学びました。
記事生成AIとセキュリティの基礎知識で学んだ重要な原則
- 実際の業務コードは絶対に使わない
- すべてダミーデータで学習する
- 生成AIに質問する際は必ず匿名化
この記事では、本番環境とは完全に切り離されたローカル環境 を構築します。Dockerを使えば、「壊しても大丈夫」な学習環境が作れます。失敗しても、コンテナを作り直せばOK。記事生成AIとセキュリティの基礎知識で学んだセキュリティ原則を守りながら、安心してPHPを学べる環境を整えましょう。
1.1 この記事の目的
- Dockerを使ってPHP+MySQLの開発環境を実際に構築できる
- ローカル環境で安全に学習する重要性を理解
- 生成AIに質問しながら環境構築する方法を習得
- よくあるエラーと対処法を知る
1.2 このシリーズ全体の流れ
| 記事 | タイトル |
|---|---|
| ✅ | 生成AIとセキュリティの基礎知識 |
| ✅ 今ここ | DockerでPHP+MySQL開発環境を作る |
| → | PHP基礎文法とDB接続の安全な書き方 |
| → | PHPでTODOリスト作成(CRUDとセキュリティ対策) |
| → | 手続き型PHPをクラスベースにリファクタリング |
| → | PHP実務で使うデバッグとセキュリティチェックリスト |
| → | 攻撃者の視点で学ぶPHPセキュリティ |
2. なぜDockerを使うのか
2.1 本番環境を触らずに安全に学習できる
会社の本番環境でPHPを試すのは、絶対に避けなければいけません 。本番環境を壊してしまうリスクがあるからです。
Dockerを使えば、自分のPC上に完全に独立した環境 を作れます。本番環境とは完全に切り離されているので、どんなに失敗しても本番に影響はありません。
2.2 環境構築が簡単(1コマンドで起動)
従来の環境構築では、PHP、Apache、MySQLを個別にインストールして設定する必要がありました。Docker Composeを使えば、1つのコマンドで全て起動 できます。
docker-compose up -d
これだけで、PHP、MySQL、phpMyAdminが起動します。初めてでも30分あれば環境構築が完了します。
2.3 失敗してもすぐやり直せる
Dockerのコンテナは、削除して作り直す ことが簡単です。設定を間違えても、コンテナを削除して最初からやり直せばOKです。
# コンテナを停止・削除
docker-compose down
# 再度起動
docker-compose up -d
これで、いつでもクリーンな状態から始められます。
2.4 セキュリティ的にも安全(ローカル完結)
Docker環境は、あなたのPC上で完結 します。インターネットに接続する必要はありません(コンテナイメージのダウンロード時を除く)。本番環境のデータを一切持ち込まないので、情報漏洩のリスクもありません。
2.5 学習用の「閉じた環境」を作る重要性
生成AIとセキュリティの基礎知識で学んだように、実際の業務コードは絶対に使わない ことが重要です。Dockerで作る環境は、完全にダミーデータで学習するための「閉じた環境」です。
- 本番環境のデータは一切持ち込まない
- すべてダミーデータで学習する
- 失敗しても安心してやり直せる
3. 必要なもの
環境構築を始める前に、以下のものを準備してください。
3.1 チェックリスト
-
Docker Desktop(インストール済み)
- Mac: Docker Desktop for Mac
- Windows: Docker Desktop for Windows
- バージョン: 最新版(2024年11月時点)
- テキストエディタ(VS Code、Sublime Textなど)
- ターミナル(Macのターミナル、Windowsのコマンドプロンプトなど)
3.2 所要時間
- Docker Desktopのインストール: 約10分(初回のみ)
- 環境構築: 約20分
- 合計: 約30分
3.3 Docker Desktopのインストール確認
Docker Desktopがインストールされているか確認しましょう。
docker --version
バージョンが表示されればOKです。
表示されない場合は、Docker Desktopの公式サイトからインストール、またはOS別インストール手順(10.4節)を参照してください。Windows、Mac、Linux(Ubuntu)それぞれの詳しいインストール手順が解説されています。
よりDockerについて知りたい人は、Dockerの基礎を学ぶ(10.3節)を参照してください。初心者向けから実践まで、Dockerの理解を深められる記事が紹介されています。
4. ディレクトリ構成を作る
まず、プロジェクト用のディレクトリを作成します。
4.1 全体のディレクトリ構成
php-todo-project/
├── docker-compose.yml # Docker Composeの設定ファイル
├── Dockerfile # PHPコンテナのカスタマイズ設定
└── www/ # PHPファイルを置くフォルダ
└── index.php # 動作確認用のPHPファイル
4.2 各ファイルの役割
docker-compose.yml
- PHP、MySQL、phpMyAdminの3つのサービスを定義
- ポート番号や環境変数を設定
- コンテナ間のネットワークを設定
Dockerfile
- PHPコンテナに必要な拡張機能(PDO、mysqli)をインストール
- Apacheの設定をカスタマイズ
www/フォルダ
- PHPファイルを配置する場所
- このフォルダ内のファイルが、ブラウザで表示される
4.3 実際に作ってみる
ターミナルで以下のコマンドを実行してください。
# プロジェクト用のディレクトリを作成
mkdir php-todo-project
cd php-todo-project
# wwwフォルダを作成
mkdir www
これで、基本的なディレクトリ構成ができました。
5. docker-compose.ymlを作成
Docker Composeの設定ファイルを作成します。このファイルで、PHP、MySQL、phpMyAdminの3つのサービスを定義します。
5.1 docker-compose.ymlの全体像
プロジェクトのルートディレクトリ(php-todo-project/)に、docker-compose.ymlを作成してください。
version: '3.8'
services:
web:
build: .
container_name: php-apache
ports:
- "8080:80"
volumes:
- ./www:/var/www/html
networks:
- app-network
depends_on:
- mysql
mysql:
image: mysql:8.0
container_name: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: mydb
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbpass
volumes:
- ./mysql-data:/var/lib/mysql
networks:
- app-network
command: --default-authentication-plugin=mysql_native_password
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
ports:
- "8081:80"
environment:
PMA_HOST: mysql
PMA_PORT: 3306
MYSQL_ROOT_PASSWORD: root_password
depends_on:
- mysql
networks:
- app-network
networks:
app-network:
driver: bridge
5.2 PHPコンテナの設定(webサービス)
web:
build: . # Dockerfileを使ってビルド
container_name: php-apache # コンテナ名
ports:
- "8080:80" # ホストの8080番ポート → コンテナの80番ポート
volumes:
- ./www:/var/www/html # ホストのwwwフォルダ → コンテナの/var/www/html
networks:
- app-network # ネットワークに参加
depends_on:
- mysql # MySQLが起動してから起動
ポイント
-
ports: "8080:80"→ ブラウザでhttp://localhost:8080にアクセスすると、コンテナ内の80番ポートに接続されます -
volumes: ./www:/var/www/html→ ホスト側のwwwフォルダが、コンテナ内の/var/www/htmlにマウントされます
5.3 MySQLコンテナの設定
mysql:
image: mysql:8.0 # MySQL 8.0のイメージを使用
container_name: mysql # コンテナ名
ports:
- "3306:3306" # MySQLの標準ポート
environment:
MYSQL_ROOT_PASSWORD: root_password # rootユーザーのパスワード
MYSQL_DATABASE: mydb # 自動作成するデータベース名
MYSQL_USER: dbuser # 一般ユーザー名
MYSQL_PASSWORD: dbpass # 一般ユーザーのパスワード
volumes:
- ./mysql-data:/var/lib/mysql # データを永続化
command: --default-authentication-plugin=mysql_native_password
重要なポイント
-
command: --default-authentication-plugin=mysql_native_password→ MySQL 8.0の認証方式を指定(phpMyAdminとの互換性のため) -
volumes: ./mysql-data:/var/lib/mysql→ データベースのデータをホスト側に保存(コンテナを削除してもデータが残る)
5.4 phpMyAdminの設定
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
ports:
- "8081:80" # ブラウザでhttp://localhost:8081にアクセス
environment:
PMA_HOST: mysql # MySQLコンテナのサービス名
PMA_PORT: 3306 # MySQLのポート番号
MYSQL_ROOT_PASSWORD: root_password
depends_on:
- mysql # MySQLが起動してから起動
ポイント
-
PMA_HOST: mysql→ Docker Composeでは、サービス名(mysql)でコンテナに接続できます -
depends_on: - mysql→ MySQLが起動してからphpMyAdminを起動します
5.5 ボリューム設定の意味
volumesは、ホスト側のフォルダとコンテナ内のフォルダを同期 する設定です。
volumes:
- ./www:/var/www/html
意味
- ホスト側の
./wwwフォルダ - ↕️(同期)
- コンテナ内の
/var/www/htmlフォルダ
結果
- ホスト側で
www/index.phpを作成 → コンテナ内の/var/www/html/index.phpに反映 - ブラウザで
http://localhost:8080/index.phpにアクセス → ファイルが表示される
6. Dockerfileを作成
PHPコンテナに必要な拡張機能(PDO、mysqli)をインストールするためのDockerfileを作成します。
6.1 Dockerfileの役割
PHPの公式イメージ(php:8-apache)には、PDOやmysqliなどの拡張機能が含まれていません。Dockerfileで追加する必要があります。
6.2 Dockerfileの内容
プロジェクトのルートディレクトリに、Dockerfileを作成してください。
FROM php:8.2-apache
# PDO MySQL・mysqli拡張機能をインストール
RUN docker-php-ext-install pdo pdo_mysql mysqli
# Apacheのmod_rewriteを有効化(.htaccess使用時)
RUN a2enmod rewrite
PHPバージョンについて
- この記事では
php:8.2-apacheを使用(2024年11月時点で安定版) - PHP 8.1以上を推奨(PHP 7.4は2022年11月にサポート終了)
- 必要に応じて
php:8.3-apacheやphp:8.1-apacheも使用可能
6.3 各コマンドの意味
FROM php:8.2-apache
- PHP 8.2系のApacheビルトインイメージをベースにする
RUN docker-php-ext-install pdo pdo_mysql mysqli
- PDO、PDO MySQL、mysqliの拡張機能をインストール
- データベース接続に必要
RUN a2enmod rewrite
- Apacheの
mod_rewriteモジュールを有効化 -
.htaccessファイルを使う場合に必要
6.4 拡張機能は後から追加できる
もし後で他の拡張機能が必要になったら、Dockerfileに追加して再ビルドすればOKです。
# 例:GDライブラリを追加する場合
RUN apt-get update && apt-get install -y \
libpng-dev \
libjpeg-dev \
&& docker-php-ext-install gd
7. 環境を起動して確認
それでは、実際に環境を起動して動作確認をしましょう。
7.1 起動コマンド
プロジェクトのルートディレクトリで、以下のコマンドを実行してください。
# コンテナをビルドして起動
docker-compose up -d
-dオプションの意味
- バックグラウンドで実行(デタッチモード)
- ターミナルがブロックされない
7.2 動作確認の方法
7.2.1 PHPの動作確認
ブラウザでhttp://localhost:8080にアクセスしてください。
まず、動作確認用のPHPファイルを作成します。
www/index.phpを作成
<?php
phpinfo();
?>
ブラウザでhttp://localhost:8080/index.phpにアクセスすると、PHPの設定情報が表示されます。
7.2.2 phpMyAdminの動作確認
ブラウザでhttp://localhost:8081にアクセスしてください。
ログイン情報
- サーバー: mysql(自動入力されているはず)
- ユーザー名: root
- パスワード: root_password(docker-compose.ymlで設定した値)
ログインできれば、MySQLに正常に接続できています。
7.3 よくあるエラーと対処法
7.3.1 エラー1:ポート番号の競合
症状
Bind for 0.0.0.0:8080 failed: port is already allocated
原因
すでに別のプロセスが8080番ポートを使用しています。
対処法
方法1:ポート番号を変更する
docker-compose.ymlのportsを変更:
web:
ports:
- "8081:80" # 8080 → 8081に変更
方法2:使用中のプロセスを確認する
# Macの場合
lsof -i :8080
# Linuxの場合
netstat -tuln | grep 8080
使用中のプロセスを停止するか、ポート番号を変更してください。
7.3.2 エラー2:MySQL接続エラー
症状
mysqli::real_connect(): Access denied for user 'root'@'172.19.0.3'
原因
Dockerでは、MySQLにlocalhostで接続できません。サービス名(mysql)で接続 する必要があります。
❌ NG例
$host = 'localhost'; // ❌ Dockerではダメ
OK例
$host = 'mysql'; // ✅ サービス名で接続
理由
- Dockerは自動でIPアドレスを割り振ります(例: 172.19.0.3)
-
localhostは「自分自身のコンテナ」を指します - MySQLコンテナは別のコンテナなので、サービス名(
mysql)で接続します
7.3.3 エラー3:phpMyAdminでMySQL接続エラー
症状
mysqli_real_connect(): The server requested authentication method unknown to the client
原因
MySQL 8.0のデフォルト認証方式がcaching_sha2_passwordで、phpMyAdminと互換性がない場合があります。
対処法
docker-compose.ymlのmysqlサービスに以下が含まれているか確認:
mysql:
command: --default-authentication-plugin=mysql_native_password
これが含まれていれば、問題ありません。
7.3.4 エラー4:データが消える
症状
コンテナを再起動すると、データベースのデータが消える。
原因
volumesでデータを永続化していない。
対処法
docker-compose.ymlのmysqlサービスに以下が含まれているか確認:
mysql:
volumes:
- ./mysql-data:/var/lib/mysql # ホストにデータ保存
これが含まれていれば、データは永続化されます。
7.3.5 エラー5:403 Forbidden
症状
You don't have permission to access / on this server.
原因
ファイル権限の問題。
対処法
# ファイル権限を確認・変更
chmod -R 755 ./www
7.4 デバッグの基本手順
エラーが出た時は、以下の手順で確認しましょう。
7.4.1 ログを確認する
# コンテナのログをリアルタイム表示
docker-compose logs -f
# 特定のサービスのみ
docker-compose logs -f web
docker-compose logs -f mysql
7.4.2 コンテナに入って確認
# PHPコンテナに入る
docker exec -it php-apache bash
# コンテナ内でファイル確認
ls /var/www/html
# MySQLコンテナに入る
docker exec -it mysql bash
# MySQLに接続
mysql -u root -p
# パスワード: root_password
7.4.3 コンテナの状態を確認
# コンテナの状態を確認
docker-compose ps
# 全てのコンテナを停止・削除
docker-compose down
# 再度起動
docker-compose up -d
8. 【セキュリティコラム】学習環境と本番環境の分離
生成AIとセキュリティの基礎知識で学んだように、実際の業務コードは絶対に使わない ことが重要です。Dockerで作る環境は、完全にダミーデータで学習するための「閉じた環境」です。
8.1 なぜローカルで学ぶのか
本番環境を触らない安心感
- 本番環境でPHPを試すと、システムを壊してしまうリスクがあります
- Docker環境なら、どんなに失敗しても本番に影響はありません
失敗しても、コンテナを作り直せばOK
- 設定を間違えても、コンテナを削除して最初からやり直せばOKです
- いつでもクリーンな状態から始められます
8.2 本番環境のデータは絶対に持ち出さない
重要な原則
- 本番環境のデータは一切持ち込まない
- すべてダミーデータで学習する
- 実際の業務コードは使わない
この原則を守ることで、セキュリティを守りながら安心して学習できます。
8.3 Dockerの隔離性
Dockerコンテナは、ホストマシンから完全に隔離 されています。
- コンテナ内のデータは、ホストマシンに影響を与えません
- ホストマシンのデータは、コンテナから直接アクセスできません(volumesでマウントしたフォルダを除く)
この隔離性により、安全に実験できる環境 が作れます。
8.4 学習用環境と本番環境の明確な分離
学習用環境(Docker)
- 完全にダミーデータ
- 失敗しても安心
- いつでも作り直せる
本番環境
- 実際の業務データ
- 絶対に触らない
- セキュリティが最優先
この2つを明確に分離することで、セキュリティを守りながら効率的に学習 できます。
9. まとめ|次のステップ
おめでとうございます!DockerでPHP+MySQLの開発環境が構築できました。
9.1 この記事で学んだこと
- Docker ComposeでPHP+MySQL+phpMyAdminの環境を構築
- 本番環境とは完全に分離された学習環境を作成
- よくあるエラーと対処法
- セキュリティを守りながら学習する重要性
9.2 環境構築の確認
-
http://localhost:8080でPHPが動作している -
http://localhost:8081でphpMyAdminにログインできる -
www/index.phpでphpinfo()が表示される
9.3 次のステップ
次回は、PHPの基礎文法とDB接続を学びます。生成AIとセキュリティの基礎知識で学んだ匿名化テクニックを実践しながら、安全にPHPの基本を習得していきましょう。
9.4 困った時は
- エラーが出たら、まず
docker-compose logs -fでログを確認 - 詰まったら、生成AIに質問してみましょう(ただし、セキュリティは守って)
- 生成AIとセキュリティの基礎知識で学んだ匿名化チェックリストを確認
10. 参考資料
10.1 公式ドキュメント
- Docker Compose公式ドキュメント
- PHP - Official Image | Docker Hub
- MySQL - Official Image | Docker Hub
- phpMyAdmin - Official Image | Docker Hub
10.2 信頼できる解説記事
- Docker Compose for PHP Application Environment | Medium
- MySQL + phpMyAdmin Docker Compose | DEV Community
10.3 Dockerの基礎を学ぶ
この記事でDockerについてわからない部分があれば、以下のZennの記事がとてもわかりやすく解説されています。
✅ 初心者向け
-
初心者が絵で理解する Docker
- Dockerの基本概念を絵で理解できる入門書
- イメージとコンテナの違い、Docker Composeの使い方などが丁寧に解説されています
もっと詳しく学びたい方
-
実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本
- Dockerの基礎から実践まで、包括的に学べる本
- コンテナの操作、Dockerfile、ボリューム、ネットワークなど、実務で必要な知識が身につきます
10.4 OS別インストール手順(2024年11月〜2025年3月時点の最新情報)
Docker Desktopのインストールで困った場合は、以下の記事が最新の情報で詳しく解説されています。
Windows向け
-
【入門】Docker Desktopとは何ができるの?インストールと使い方 - カゴヤのサーバー研究室
- Windows/Mac向けにDocker Desktopのインストール手順が画像付きで解説
- 有料化の話やライセンスの確認画面についても触れられています
- コマンドがそのままコピペでき、つまずきやすいポイントもフォローされています
-
Docker Desktopのインストール方法(Windows版) - テツサンブログ
- WSL2のインストールから順を追って解説
- Docker Desktop起動後の設定画面まで画像付きで説明されています
Mac向け
-
【入門】Docker Desktopとは何ができるの?インストールと使い方 - カゴヤのサーバー研究室
- Mac向けのDocker Desktopインストール手順が画像付きで詳しく解説されています
Linux向け(Ubuntu)
-
【入門】Dockerとは?概要やメリット、インストール方法をわかりやすく解説 - カゴヤのサーバー研究室
- Ubuntu 24.04へのインストール手順が詳しく記載
- コマンドも全部書いてあり、sudoなしで実行する設定などつまずきやすいポイントもフォローされています
11. 📚 シリーズ記事一覧
この記事: DockerでPHP+MySQL開発環境を作る
前の記事: 生成AIとセキュリティの基礎知識
→ 生成AIを使う際のセキュリティの基本を学びます。
次の記事: PHP基礎文法とDB接続の安全な書き方
→ PHPの基本文法を他言語と比較しながら理解し、安全なDB接続方法を習得します。
Discussion