Docker ComposeでPHP開発環境を作ろう
更新日:2026-08-02
前の記事では、イメージ、コンテナ、ポート、ボリュームを学びました。今回は、PHP、MySQL、phpMyAdminをDocker Composeで起動します。
次の二通りを順番に確認します。
- Dockerfileを作らず、PHP公式イメージを直接使う構成
- Dockerfileからプロジェクト用のPHPイメージをビルドする構成
どちらの構成でも、Webサーバーを含むサービス名はphpです。ブラウザからPHPへはhttp://localhost:8000、phpMyAdminへはhttp://localhost:8080でアクセスします。
構成の違いを理解する
公式イメージを直接使う構成
docker-compose.ymlでimage: php:8.3-apacheを指定する- Docker Hubから既成のイメージを取得する
- イメージから
phpコンテナを起動する
ファイルが少なく、PHPを表示するだけならすぐに開始できます。一方、必要なPHP拡張やApache設定を追加しにくいため、本格的なプロジェクトでは不足します。
Dockerfileでビルドする構成
docker-compose.ymlでbuild: .を指定する- Dockerfileを読み取る
- プロジェクト用のPHPイメージを作る
- イメージから
phpコンテナを起動する
必要なPHP拡張、Linuxパッケージ、Apache設定をコードとして管理できます。本プロジェクトも、このDockerfileでビルドする構成です。
公式イメージを直接使う構成を作る
今回使用するファイル構成
php-compose-practice/
├── docker-compose.yml
└── src/
└── index.php
WSLのUbuntuでディレクトリを作ります。
mkdir -p ~/sandbox/php-compose-practice/src
cd ~/sandbox/php-compose-practice
code .
docker-compose.ymlを作る
services:
php:
image: php:8.3-apache
ports:
- "8000:80"
volumes:
- ./src:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: php_practice
MYSQL_USER: php_user
MYSQL_PASSWORD: php_pass
volumes:
- db_data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin:5.2-apache
ports:
- "8080:80"
environment:
PMA_HOST: db
PMA_USER: root
PMA_PASSWORD: rootpass
depends_on:
- db
volumes:
db_data:
php、db、phpmyadminという三つのサービスを定義しています。
phpサービスを読む
php:
image: php:8.3-apache
ports:
- "8000:80"
volumes:
- ./src:/var/www/html
image:PHP 8.3とApacheを含む公式イメージを使う8000:80:ホストの8000番をApacheの80番へ接続する./src:/var/www/html:作成したPHPファイルをApacheの公開ディレクトリへ接続する
サービス名がphpなので、コンテナ内でPHPコマンドを実行するときは次のように書きます。
docker compose exec php php -v
dbサービスを読む
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: php_practice
MYSQL_USER: php_user
MYSQL_PASSWORD: php_pass
初回起動時に、学習用データベースとユーザーが作成されます。
| 設定 | 値 |
|---|---|
| データベース名 | php_practice |
| 一般ユーザー | php_user |
| 一般ユーザーのパスワード | php_pass |
| rootパスワード | rootpass |
これらはローカル学習環境用の値です。公開環境で同じ単純なパスワードを使用してはいけません。
db_dataはMySQLのデータを保持する名前付きボリュームです。
phpmyadminサービスを読む
phpMyAdminは、ブラウザからMySQLのデータベース、テーブル、データを確認するための管理ツールです。
phpmyadmin:
image: phpmyadmin:5.2-apache
ports:
- "8080:80"
environment:
PMA_HOST: db
PMA_HOSTにはMySQLのサービス名dbを指定します。コンテナ間ではlocalhostではなくサービス名で接続します。
PHPファイルを作る
src/index.phpを作ります。
<?php
$message = 'Docker ComposeからPHPを実行しています';
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PHP開発環境</title>
</head>
<body>
<h1><?= htmlspecialchars($message, ENT_QUOTES, 'UTF-8') ?></h1>
</body>
</html>
設定を検査する
起動前にYAMLの構文と、Composeが解釈した設定を確認します。
docker compose config
エラーが表示された場合は、インデント、コロン、サービス名を確認します。YAMLではタブではなく半角スペースを使います。
コンテナを起動する
docker compose up -d
-dはバックグラウンドで起動するオプションです。状態を確認します。
docker compose ps
ブラウザで次を開きます。
http://localhost:8000http://localhost:8080
PHPのメッセージとphpMyAdminの画面が表示されれば、三つのサービスが起動しています。
ログを確認する
docker compose logs php
docker compose logs db
docker compose logs phpmyadmin
ログを継続して表示する場合は-fを付け、終了するときはCtrl+Cを押します。
docker compose logs -f php
コンテナを停止・削除する
docker compose down
MySQLのdb_dataは残ります。データを含めて削除するdocker compose down -vは、不要だと確認できた場合だけ使用します。
公式イメージ直接利用の制限を確認する
この構成のphp:8.3-apacheには、MySQLへPDOで接続するpdo_mysql拡張が標準では入っていません。
docker compose up -d
docker compose exec php php -m
必要な拡張機能や設定を追加するため、次はDockerfileを使います。
Dockerfileでビルドする構成へ変更する
ファイル構成を変更する
php-compose-practice/
├── docker-compose.yml
├── Dockerfile
└── src/
└── index.php
Dockerfileを作る
プロジェクトルートへ拡張子なしのDockerfileを作ります。
FROM php:8.3-apache
RUN docker-php-ext-install pdo_mysql
RUN a2enmod rewrite
WORKDIR /var/www/html
pdo_mysqlを追加すると、PHPのPDOからMySQLへ接続できます。a2enmod rewriteは、後でLaravelのURLをApacheで処理するときに必要になる機能を有効にします。
phpサービスをbuildへ変更する
docker-compose.ymlのphpサービスを変更します。db、phpmyadmin、volumesは先ほどと同じです。
services:
php:
build:
context: .
dockerfile: Dockerfile
ports:
- "8000:80"
volumes:
- ./src:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: php_practice
MYSQL_USER: php_user
MYSQL_PASSWORD: php_pass
volumes:
- db_data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin:5.2-apache
ports:
- "8080:80"
environment:
PMA_HOST: db
PMA_USER: root
PMA_PASSWORD: rootpass
depends_on:
- db
volumes:
db_data:
imageの代わりにbuildを指定しています。
context: .:現在のプロジェクトをビルド対象にするdockerfile: Dockerfile:使用するDockerfileを指定する
PHPイメージをビルドする
docker compose build php
Dockerfileを読み取り、プロジェクト用のイメージを作ります。続けて起動します。
docker compose up -d
ビルドと起動をまとめて行う場合は、次のようにします。
docker compose up -d --build
pdo_mysqlを確認する
docker compose exec php php -m
一覧にpdo_mysqlがあれば、Dockerfileで追加した拡張が反映されています。
docker compose exec php php --ri pdo_mysql
拡張機能の詳しい情報も確認できます。
二つの構成を使い分ける
| 構成 | 向いている用途 |
|---|---|
imageを直接指定 |
公式イメージの機能だけで試す、小さな動作確認 |
Dockerfileをbuild |
PHP拡張や設定を追加する、チームで構成を共有する |
今後のPHP、データベース、Laravel学習では、Dockerfileでビルドする構成を使用します。
うまく動かないときの確認点
8000番または8080番が使用中と表示される
別のアプリやコンテナが同じポートを使っています。
docker compose ps
docker ps
不要な環境を停止します。教材ではURLを統一するため、Compose側のポートは8000と8080のまま進めます。
phpMyAdminからMySQLへ接続できない
PMA_HOSTがdbになっているか、dbコンテナが起動しているかを確認します。
docker compose logs db
docker compose logs phpmyadmin
Dockerfileの変更が反映されない
Dockerfileはイメージ作成時に使われます。再ビルドしてください。
docker compose build --no-cache php
docker compose up -d
--no-cacheは通常の再ビルドで解決しない場合に使用します。
まとめ
- 公式イメージを直接使う構成は、少ないファイルですぐに開始できる
- Dockerfile構成では、PHP拡張やApache設定をプロジェクト用に追加できる
- Webサーバーを含むサービス名は
phpとする - PHPは
localhost:8000、phpMyAdminはlocalhost:8080で確認する - コンテナ内からMySQLへ接続するときはサービス名
dbを使う - Compose変更は
docker compose config、動作はpsとlogsで確認する
次の記事では、この環境でPHPを実行し、ブラウザへHTMLを返します。