本文へスキップ
サーバー・インフラ 入門 PHP Docker Apache

Docker環境でPHPを動かしてみよう

更新日:2026-08-02

前の記事では、Dockerfileからビルドしたphpサービスと、MySQL、phpMyAdminを起動しました。今回はPHPをコマンドラインとブラウザの二通りで実行します。

この回を終えると、次のPHPカテゴリから言語の文法学習へ進めます。

今回使用するファイル構成

php-compose-practice/
├── docker-compose.yml
├── Dockerfile
└── src/
    ├── index.php
    └── command.php

Composeは前の記事のDockerfileでビルドする構成を使用します。

コンテナの状態を確認する

プロジェクトルートで起動します。

docker compose up -d

三つのサービスを確認します。

docker compose ps

phpdbphpmyadminが起動中であることを確認します。ここでいうphpはサービス名です。実際のコンテナ名はComposeによってプロジェクト名を含む名前になります。

PHPのバージョンを確認する

docker compose exec php php -v

命令を分解すると次の意味になります。

  • docker compose exec:起動中のサービス内でコマンドを実行する
  • 最初のphp:実行対象のサービス名
  • php -v:コンテナ内で実行するコマンド

PHP 8.3のバージョン情報が表示されれば、PHPコンテナ内でコマンドを実行できています。

コマンドラインでPHPを実行する

command.phpを作る

src/command.phpを作成します。

<?php

$language = 'PHP';
$version = PHP_VERSION;

echo $language . 'を実行しています' . PHP_EOL;
echo 'バージョン:' . $version . PHP_EOL;

phpコマンドで実行する

docker compose exec php php command.php

DockerfileでWORKDIR /var/www/htmlを設定し、srcを同じ場所へマウントしているため、command.phpという相対パスで実行できます。

実行結果には「PHPを実行しています」と「バージョン:8.3.x」が表示されます。

表示される細かなバージョン番号は、使用しているイメージによって異なります。

ブラウザからPHPを実行する

index.phpを作る

src/index.phpを次の内容にします。

<?php
$pageTitle = 'PHPの最初のページ';
$currentTime = date('Y-m-d H:i:s');
?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title><?= htmlspecialchars($pageTitle, ENT_QUOTES, 'UTF-8') ?></title>
</head>
<body>
  <h1><?= htmlspecialchars($pageTitle, ENT_QUOTES, 'UTF-8') ?></h1>
  <p>サーバーで処理した時刻:<?= htmlspecialchars($currentTime, ENT_QUOTES, 'UTF-8') ?></p>
</body>
</html>

ブラウザでhttp://localhost:8000を開きます。

ページを再読み込みすると時刻が変わります。HTMLファイルへ固定で書いた時刻ではなく、リクエストを受けるたびにPHPがdate()を実行しているためです。

リクエストから表示までを追う

  1. ブラウザでhttp://localhost:8000を開く
  2. ホストの8000番ポートへGETリクエストを送る
  3. phpサービスの80番ポートへ転送される
  4. Apacheがindex.phpを見つける
  5. Apacheと連携したPHPがコードを実行する
  6. PHPの処理結果を含むHTMLを返す
  7. ブラウザがHTMLを表示する

PHPのソースコード自体がブラウザへ送られるわけではありません。

ブラウザが受け取ったHTMLを確認する

ブラウザで「ページのソースを表示」を開きます。次のように、PHPの処理結果だけがHTMLへ入っています。

<h1>PHPの最初のページ</h1>
<p>サーバーで処理した時刻:2026-08-02 10:00:00</p>

次のPHPコードは表示されません。

<?php
$currentTime = date('Y-m-d H:i:s');
?>

これは、JavaScriptとの重要な違いです。

技術 主な実行場所 ブラウザへ届くもの
JavaScript ブラウザ JavaScriptのソースコード
PHP サーバー PHPを実行した結果

Apacheのアクセスログを確認する

ログを表示します。

docker compose logs -f php

ブラウザでページを再読み込みすると、GET /を含むアクセスログが追加されます。

ログにはGET / HTTP/1.1" 200のような情報が表示されます。

  • GET:HTTPメソッド
  • /:要求したパス
  • 200:成功を表すHTTPステータス

終了するときはCtrl+Cを押します。ログ表示が終わるだけで、コンテナは動き続けます。

PHPのエラーを確認する

index.phpのセミコロンを一時的に削除すると、PHPの構文エラーが発生します。

$pageTitle = 'PHPの最初のページ'

ブラウザ表示とログを確認します。

docker compose logs php

エラーメッセージにはファイル名と行番号が含まれます。確認後はセミコロンを戻します。

本番環境では、利用者へ詳しいエラー内容を表示しません。開発者はサーバーのログから原因を調査します。

phpMyAdminを確認する

ブラウザでhttp://localhost:8080を開きます。

Composeで自動ログイン情報を設定している場合は、MySQLの画面が表示されます。左側にphp_practiceデータベースがあることを確認します。

現時点ではPHPからデータベースへ接続しません。PHPの文法とデータベースの基礎を学んでから、PDOで安全に接続します。

開発を終了する

作業を一時的に停止する場合は次を実行します。

docker compose stop

コンテナを停止して削除する場合は次を実行します。

docker compose down

再開時は起動します。

docker compose up -d

うまく動かないときの確認順序

  1. pwdでComposeファイルがある場所にいるか確認する
  2. docker compose configで設定を検査する
  3. docker compose psでサービスの状態を確認する
  4. docker compose logs phpでApacheとPHPのエラーを確認する
  5. docker compose logs dbでMySQLのエラーを確認する
  6. URLがPHPは8000、phpMyAdminは8080か確認する

推測で設定を変更する前に、状態とログを確認します。

まとめ

  • docker compose exec phpでphpサービス内のコマンドを実行できる
  • コマンドラインではphp ファイル名でPHPを実行する
  • ブラウザからのGETリクエストは、8000番からphpサービスのApacheへ届く
  • PHPはサーバーで実行され、処理後のHTMLだけがブラウザへ返る
  • ApacheのアクセスログからHTTPメソッド、パス、ステータスを確認できる
  • PHPはlocalhost:8000、phpMyAdminはlocalhost:8080で確認する

これでPHPを学ぶ開発環境が整いました。次はPHPカテゴリへ進み、PHPの記述方法、変数、データ型から学びます。