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
php、db、phpmyadminが起動中であることを確認します。ここでいう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()を実行しているためです。
リクエストから表示までを追う
- ブラウザで
http://localhost:8000を開く - ホストの8000番ポートへGETリクエストを送る
phpサービスの80番ポートへ転送される- Apacheが
index.phpを見つける - Apacheと連携したPHPがコードを実行する
- PHPの処理結果を含むHTMLを返す
- ブラウザが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
うまく動かないときの確認順序
pwdでComposeファイルがある場所にいるか確認するdocker compose configで設定を検査するdocker compose psでサービスの状態を確認するdocker compose logs phpでApacheとPHPのエラーを確認するdocker compose logs dbでMySQLのエラーを確認する- 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の記述方法、変数、データ型から学びます。