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

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

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

 前回の「」では、Dockerfilecompose.yaml を作成し、PHP+Apache+MySQL の開発環境を構築しました。
 ここからは、実際に PHPプログラムを作成してMySQLデータベースに接続 し、動作確認を行っていきます。

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

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

💡 コンテナ構成の復習

前回作成したDocker Composeの構成は以下の通りです。
 この構成により、Webサーバー(PHP+Apache)とデータベース(MySQL)が連携して動作します。

コンテナ名イメージ主な役割永続化設定
php-apache_containerphp:8.0-apachePHPプログラムを実行し、Apache経由でWeb公開./src:/var/www/html
mysql_containermysql:8.0データの保存と管理を担当db-data:/var/lib/mysql

 MySQLのデータはDockerボリュームdb-dataに保存され、PHP+ApacheのソースコードはホストPCの./srcディレクトリと同期しています。
そのため、ホスト側でPHPファイルを修正すると、コンテナ内のWebサイトにも即時反映されます。

📝 PHPプログラムの作成

次に、データベース接続を確認するためのPHPプログラムを作成します。

code ./src/index.php
コマンド説明
codeVisual Studio Codeを起動するコマンド
./src/index.php作成・編集するファイルのパス。srcフォルダ内にindex.phpを作成

このコマンドを実行するとVS Codeが起動し、index.phpの編集画面が開きます。

📄 index.phpの内容

<?php
// データベース接続情報
$host = 'db'; // Docker ComposeでのMySQLサービス名
$dbname = 'test-db';
$user = 'test-user';
$pass = 'test-pass';

// 待機時間を設定してMySQLサービスが起動するのを待つ
$max_attempts = 10;
$attempt = 0;
while ($attempt < $max_attempts) {
    try {
        // データベースに接続
        $pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
        break;
    } catch (PDOException $e) {
        // エラーが発生した場合は数秒待機して再試行する
        sleep(1);
        $attempt++;
    }
}

if ($attempt === $max_attempts) {
    echo "データベース接続エラー: MySQLサービスが起動しませんでした\n";
    exit(1);
}

try {
    // テーブル作成クエリ
    $sql = "CREATE TABLE IF NOT EXISTS test_table (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255) NOT NULL
    )";
    
    // テーブルを作成
    $pdo->exec($sql);
    
    echo "データベース接続成功、テーブル作成成功\n";
} catch (PDOException $e) {
    // エラーが発生した場合はエラーメッセージを表示
    echo "テーブル作成エラー: " . $e->getMessage() . "\n";
}
?>

以下のコードを入力して保存します。

🧩 コードの解説

 このプログラムは、PHPのPDO(PHP Data Objects)を使ってMySQLへ接続するシンプルなサンプルです。

処理説明
$host = 'db'MySQLのホスト名。Composeで定義したサービス名dbを指定
$pdo = new PDO(...)MySQLへ接続を試みる。接続失敗時は例外(PDOException)をスロー
sleep(1)接続失敗時に1秒待って再試行
$max_attempts = 10最大10回まで再試行を行う設定
$sql = "CREATE TABLE IF NOT EXISTS..."テーブルが存在しない場合のみ新規作成するSQL文
$pdo->exec($sql)SQLを実行するメソッド。結果は返さない(非SELECT系)

 このように、MySQLコンテナの起動タイミングによってPHPが先に動いても、接続をリトライすることで安定した起動を保証しています。

🌐 コンテナへの接続確認

コンテナはすでにdocker compose up -dで起動済みなので、ブラウザからアクセスします。

操作手順

1.Webブラウザを起動します。

2.アドレスバーに次のURLを入力します。

http://localhost

3.画面に以下のメッセージが表示されれば成功です。

データベース接続成功、テーブル作成成功

⚠️ トラブルシューティング

もし以下のようなメッセージが表示された場合は、設定を確認しましょう。

表示されるメッセージ考えられる原因対応方法
データベース接続エラー: MySQLサービスが起動しませんでしたMySQLがまだ起動していないコンテナ再起動(docker compose restart db
テーブル作成エラー: Access denied for userユーザー名・パスワードの設定誤りindex.php$user$pass を確認
ページが真っ白PHPファイルが正しく保存されていないindex.php の構文を再確認

🧠 コマンドとオプションまとめ

コマンド説明
code ./src/index.phpVisual Studio CodeでPHPファイルを作成する。
docker compose up -dコンテナをバックグラウンドで起動する。
docker compose restart dbMySQLコンテナを再起動する。
sleep(1)PHPスクリプトで1秒待機(関数)
オプション/引数意味
-dデタッチモード(バックグラウンド実行)
./src/index.phpPHPファイルのパス
restart db指定したサービス(db)のみ再起動

✅ まとめ

ステップ内容
srcディレクトリ内にindex.phpを作成
PDOでMySQLへ接続し、テーブル作成を実行
ブラウザからlocalhostにアクセスして結果を確認
接続成功メッセージが表示されればOK!

これでPHPプログラムとMySQLコンテナの接続が確認できました。
Docker Composeを使えば、Webサーバーとデータベースを簡単に連携させることができ、
本格的なアプリケーション開発の土台を作ることができます。