このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Docker超入門:開発環境コンテナ:PHP+Apache+MySQL②

🐳 開発環境コンテナ:PHP+Apache+MySQL②
前回の「①」では、Dockerfile と compose.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_container | php:8.0-apache | PHPプログラムを実行し、Apache経由でWeb公開 | ./src:/var/www/html |
| mysql_container | mysql:8.0 | データの保存と管理を担当 | db-data:/var/lib/mysql |
MySQLのデータはDockerボリュームdb-dataに保存され、PHP+ApacheのソースコードはホストPCの./srcディレクトリと同期しています。
そのため、ホスト側でPHPファイルを修正すると、コンテナ内のWebサイトにも即時反映されます。
📝 PHPプログラムの作成
次に、データベース接続を確認するためのPHPプログラムを作成します。
code ./src/index.php| コマンド | 説明 |
|---|---|
| code | Visual 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://localhost3.画面に以下のメッセージが表示されれば成功です。
データベース接続成功、テーブル作成成功

⚠️ トラブルシューティング
もし以下のようなメッセージが表示された場合は、設定を確認しましょう。
| 表示されるメッセージ | 考えられる原因 | 対応方法 |
|---|---|---|
| データベース接続エラー: MySQLサービスが起動しませんでした | MySQLがまだ起動していない | コンテナ再起動(docker compose restart db) |
| テーブル作成エラー: Access denied for user | ユーザー名・パスワードの設定誤り | index.php の $user と $pass を確認 |
| ページが真っ白 | PHPファイルが正しく保存されていない | index.php の構文を再確認 |
🧠 コマンドとオプションまとめ
| コマンド | 説明 |
|---|---|
| code ./src/index.php | Visual Studio CodeでPHPファイルを作成する。 |
| docker compose up -d | コンテナをバックグラウンドで起動する。 |
| docker compose restart db | MySQLコンテナを再起動する。 |
| sleep(1) | PHPスクリプトで1秒待機(関数) |
| オプション/引数 | 意味 |
|---|---|
| -d | デタッチモード(バックグラウンド実行) |
| ./src/index.php | PHPファイルのパス |
| restart db | 指定したサービス(db)のみ再起動 |
✅ まとめ
| ステップ | 内容 |
|---|---|
| ① | srcディレクトリ内にindex.phpを作成 |
| ② | PDOでMySQLへ接続し、テーブル作成を実行 |
| ③ | ブラウザからlocalhostにアクセスして結果を確認 |
| ④ | 接続成功メッセージが表示されればOK! |
これでPHPプログラムとMySQLコンテナの接続が確認できました。
Docker Composeを使えば、Webサーバーとデータベースを簡単に連携させることができ、
本格的なアプリケーション開発の土台を作ることができます。
