🐳

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(インストール済み)
  • テキストエディタ(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-apachephp: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.ymlportsを変更:

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.ymlmysqlサービスに以下が含まれているか確認:

mysql:
  command: --default-authentication-plugin=mysql_native_password

これが含まれていれば、問題ありません。

7.3.4 エラー4:データが消える

症状

コンテナを再起動すると、データベースのデータが消える。

原因

volumesでデータを永続化していない。

対処法

docker-compose.ymlmysqlサービスに以下が含まれているか確認:

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.phpphpinfo()が表示される

9.3 次のステップ

次回は、PHPの基礎文法とDB接続を学びます。生成AIとセキュリティの基礎知識で学んだ匿名化テクニックを実践しながら、安全にPHPの基本を習得していきましょう。

9.4 困った時は

  • エラーが出たら、まずdocker-compose logs -fでログを確認
  • 詰まったら、生成AIに質問してみましょう(ただし、セキュリティは守って)
  • 生成AIとセキュリティの基礎知識で学んだ匿名化チェックリストを確認

10. 参考資料

10.1 公式ドキュメント

10.2 信頼できる解説記事

10.3 Dockerの基礎を学ぶ

この記事でDockerについてわからない部分があれば、以下のZennの記事がとてもわかりやすく解説されています。

✅ 初心者向け

  • 初心者が絵で理解する Docker
    • Dockerの基本概念を絵で理解できる入門書
    • イメージとコンテナの違い、Docker Composeの使い方などが丁寧に解説されています

もっと詳しく学びたい方

10.4 OS別インストール手順(2024年11月〜2025年3月時点の最新情報)

Docker Desktopのインストールで困った場合は、以下の記事が最新の情報で詳しく解説されています。

Windows向け

Mac向け

Linux向け(Ubuntu)


11. 📚 シリーズ記事一覧

この記事: DockerでPHP+MySQL開発環境を作る

前の記事: 生成AIとセキュリティの基礎知識
→ 生成AIを使う際のセキュリティの基本を学びます。

次の記事: PHP基礎文法とDB接続の安全な書き方
→ PHPの基本文法を他言語と比較しながら理解し、安全なDB接続方法を習得します。

シリーズ全体

  1. 生成AIとセキュリティの基礎知識
  2. DockerでPHP+MySQL開発環境を作る ← 今ここ
  3. PHP基礎文法とDB接続の安全な書き方
  4. PHPでTODOリスト作成(CRUDとセキュリティ対策)
  5. 手続き型PHPをクラスベースにリファクタリング
  6. PHP実務で使うデバッグとセキュリティチェックリスト
  7. 攻撃者の視点で学ぶPHPセキュリティ

Discussion