このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Docker超入門:開発環境コンテナ:PHP+Apache+MySQL①

🐳 開発環境コンテナ:PHP+Apache+MySQL①

Docker Composeを使って、PHP+Apache+MySQL の開発環境を構築していきます。
この環境は、ウェブアプリケーションの開発や検証に非常に便利で、
ブラウザで動的なページを確認しながらデータベース操作まで行える万能な開発セットです。

このシリーズは2部構成で進めます。

内容
開発環境コンテナ:PHP+Apache+MySQL①Dockerfileとcompose.yamlを作成して環境を構築する。
開発環境コンテナ:PHP+Apache+MySQL②PHPプログラムを作成してMySQLと接続する。

ここでは①として、Dockerfilecompose.yaml を作成し、
実際に「PHP+Apache+MySQL」コンテナを起動するところまでを詳しく解説します。

💡 開発環境の概要

使用するイメージは PHP イメージと MySQL イメージの2つです。
Apacheイメージを使う必要はありません。
なぜなら、php:8.0-apache イメージにはすでにApacheが組み込まれているからです。

この1つのイメージでPHPとApacheを同時に利用できるため、構成がとてもシンプルになります。

🧱 PHP開発環境とは

PHP開発環境とは、PHP言語とその周辺ツールを組み合わせた、
Webアプリケーション開発専用の環境 のことです。

構成要素役割
PHP動的なWebページを生成するスクリプト言語
ApachePHPスクリプトを実行してWebページとして配信するWebサーバー
MySQLWebアプリケーションで利用するデータを保存・管理するデータベース
Docker Composeこれらを複数コンテナとしてまとめて起動・停止・管理するツール

 この3つをDocker上で動かすことで、どんなマシンでも同じ動作環境を再現できるのが大きな利点です。

🐘 PHPとは

 PHPは、HTML内にスクリプトを埋め込み、Webサーバー上で動的なページを生成できるプログラミング言語です。
フォーム入力の処理、データベースへのアクセス、セッション管理などに幅広く使われています。

特徴内容
学習が容易文法がシンプルで初心者にも扱いやすい。
データベース連携MySQLやMariaDBなどと簡単に接続できる。
豊富なライブラリ多数の拡張モジュールとオープンソース資産が存在
高い汎用性WordPressやLaravelなどの主要フレームワークが採用

公式サイト:https://www.php.net/

🌍 Apacheとは

Apacheは、世界で最も利用されているWebサーバーソフトウェアです。
1995年に登場して以来、信頼性・拡張性の高さから多くのサイトで利用されています。

特徴内容
高い安定性長期間稼働するサーバーに最適
柔軟な設定各種モジュールで機能を拡張可能
オープンソース無料で利用可能、世界中で開発が活発

PHPとApacheを組み合わせることで、
「PHPで生成した動的ページを即時にWeb公開できる」環境が整います。

🗄️ MySQLとは

 MySQLは、世界中で広く使われているオープンソースのデータベース管理システム(RDBMS)です。
データの保存・検索・更新を高速に処理でき、Web開発には欠かせない存在です。

特徴内容
高速・軽量Webアプリケーションに最適化された設計
信頼性が高い商用でも多く採用される実績
互換性PHPのPDOやmysqliなど標準機能で簡単に接続可能
デフォルト認証MySQL 8.0では「caching_sha2_password」→Dockerでは互換性のため設定変更が必要

⚙️ コンテナ構成の全体像

今回のCompose構成は以下の通りです。

コンテナ名役割イメージ永続化設定
mysql_containerデータベースmysql:8.0db-data:/var/lib/mysql
php-apache_containerWebサーバー+PHP実行環境php:8.0-apache./src:/var/www/html

データベース(MySQL)の情報はボリュームdb-dataに永続化され、
PHPプログラムはホスト側のsrcディレクトリに保存されます。

🧹 作業前のクリーンアップ

Docker環境をリセットして、古いコンテナや不要なイメージを削除しておきましょう。

docker system prune -a --volumes
オプション説明
-a未使用のすべてのイメージを削除
--volumes未使用のボリュームも同時に削除

このコマンドを実行すると、停止中のコンテナや不要なキャッシュもまとめて削除され、
クリーンな状態から構築を始めることができます。

実行結果

PS C:\Users\joeac> docker system prune -a --volumes
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all anonymous volumes not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y

※GUI操作が好きな方は、Docker Desktop の「Containers」「Volumes」タブから削除してもOKです。

📁 作業ディレクトリの作成

作業用ディレクトリに移動します。
新しいプロジェクトフォルダを作成して移動します。

cd desktop/docker
mkdir phpdev2
cd phpdev2

実行結果

PS C:\Users\joeac> cd desktop/docker
PS C:\Users\joeac\Desktop\docker> mkdir phpdev2

    Directory: C:\Users\joeac\Desktop\docker

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2025/10/24     0:10                phpdev2

PS C:\Users\joeac\Desktop\docker> cd phpdev2

このフォルダに Dockerfilecompose.yaml を作成します。

🧩 Dockerfileの作成

VSCodeを起動してDockerfileを作成します。

code Dockerfile

内容を以下のように記述して保存します。

FROM php:8.0-apache 

# MySQLクライアントライブラリのインストール
RUN apt-get update && \
    apt-get install -y libonig-dev && \
    apt-get install -y default-libmysqlclient-dev && \
    docker-php-ext-install pdo_mysql

# MySQL 8.0のデフォルト認証方式を設定
RUN { \
    echo '[mysqld]'; \
    echo 'default_authentication_plugin=mysql_native_password'; \
    } > /etc/mysql/conf.d/mysql_default_auth.cnf

💬 各コマンドの解説

コマンド内容
FROM php:8.0-apachePHPとApacheが統合された公式ベースイメージを使用
RUN apt-get updateパッケージリストを最新化
apt-get install -y libonig-devPHPで正規表現を扱うためのライブラリを導入
apt-get install -y default-libmysqlclient-devMySQLクライアントライブラリをインストール(MySQL 8.0対応)
docker-php-ext-install pdo_mysqlPHPのPDO MySQL拡張を追加(DB接続用)
echo '[mysqld]' ~MySQLの設定ファイルを作成し、認証方式を旧互換に設定

MySQL 8.0ではデフォルト認証が caching_sha2_password に変わったため、
従来通りPHPから接続できるように mysql_native_password を明示設定しています。

🧾 compose.yamlの作成

次に、Docker Compose設定ファイルを作成します。

code compose.yaml

内容は以下の通りです。

services:
  db:
    image: mysql:8.0
    container_name: mysql_container
    environment:
      MYSQL_ROOT_PASSWORD: root-pass
      MYSQL_DATABASE: test-db
      MYSQL_USER: test-user
      MYSQL_PASSWORD: test-pass
    volumes:
      - db-data:/var/lib/mysql

  php:
    build: .
    container_name: php-apache_container
    depends_on:
      - db
    ports:
      - "80:80"
    volumes:
      - ./src:/var/www/html

volumes:
  db-data:

💬 定義内容の説明

サービス名内容
dbMySQL 8.0を利用するデータベースコンテナ
phpPHPとApacheを含むWebアプリケーションコンテナ
volumesMySQLデータを永続化するためのボリューム設定

各項目の解説

項目意味
image使用するイメージ(例:mysql:8.0)
container_nameコンテナ名(例:mysql_container)
environment環境変数を指定(DB名やユーザー設定など)
volumesホスト側とコンテナ側のディレクトリを同期
portsホストの80番ポートをコンテナの80番にマッピング
depends_onphpコンテナがdbコンテナに依存して起動する設定

🚀 コンテナのビルドと起動

設定が完了したら、以下のコマンドで一括起動します。

docker compose up -d
オプション説明
upComposeファイルをもとにコンテナを起動
-dバックグラウンドで実行(デタッチモード)

実行結果

PS C:\Users\joeac\Desktop\docker\phpdev2> docker compose up -d
[+] Running 12/12
(省略)
[+] Running 5/5
 ✔ phpdev2-php                     Built                                    0.0s
 ✔ Network phpdev2_default         Created                                  0.0s
 ✔ Volume phpdev2_db-data          Created                                  0.0s
 ✔ Container mysql_container       Started                                  0.6s
 ✔ Container php-apache_container  Star...                                  0.7s
PS C:\Users\joeac\Desktop\docker\phpdev2>

2つのコンテナが Started と表示されれば成功です。

✅ まとめ

ステップ内容
Dockerfileを作成してPHPとMySQL連携を設定
compose.yamlで2つのコンテナ構成を定義
docker compose up -dで起動
mysql_container と php-apache_container が同時に稼働

この状態で、PHP+Apache環境が立ち上がり、MySQLとも通信できる基礎が整いました。
 次回の「開発環境コンテナ:PHP+Apache+MySQL②」では、実際にPHPからデータベースへ接続してみましょう。