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

Docker ComposeでPHP開発環境を作ろう

更新日:2026-08-02

前の記事では、イメージ、コンテナ、ポート、ボリュームを学びました。今回は、PHP、MySQL、phpMyAdminをDocker Composeで起動します。

次の二通りを順番に確認します。

  1. Dockerfileを作らず、PHP公式イメージを直接使う構成
  2. Dockerfileからプロジェクト用のPHPイメージをビルドする構成

どちらの構成でも、Webサーバーを含むサービス名はphpです。ブラウザからPHPへはhttp://localhost:8000、phpMyAdminへはhttp://localhost:8080でアクセスします。

構成の違いを理解する

公式イメージを直接使う構成

  1. docker-compose.ymlimage: php:8.3-apacheを指定する
  2. Docker Hubから既成のイメージを取得する
  3. イメージからphpコンテナを起動する

ファイルが少なく、PHPを表示するだけならすぐに開始できます。一方、必要なPHP拡張やApache設定を追加しにくいため、本格的なプロジェクトでは不足します。

Dockerfileでビルドする構成

  1. docker-compose.ymlbuild: .を指定する
  2. Dockerfileを読み取る
  3. プロジェクト用のPHPイメージを作る
  4. イメージから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:

phpdbphpmyadminという三つのサービスを定義しています。

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:8000
  • http://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.ymlphpサービスを変更します。dbphpmyadminvolumesは先ほどと同じです。

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_HOSTdbになっているか、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、動作はpslogsで確認する

次の記事では、この環境でPHPを実行し、ブラウザへHTMLを返します。