第09回: DockerでPHP環境をつくる — 再現性の高い環境をコードで定義する

章: 第5章: より本格的な環境

対象OS: Windows / Mac 共通(差異は各セクションに記載)

「私の環境では動くのに」—— この問題をなくすのがDocker

チーム開発で一番困るのが「自分のPCでは動くのに、他の人の環境では動かない」という状況です。PHPのバージョン違い、php.ini の設定差異、OSの違いなど、原因は多岐にわたります。

DockerはPHPのバージョン・設定・依存ツールをすべてコードで定義します。 docker compose up 1コマンドで、誰の環境でも同じ構成が立ち上がります。

Dockerのインストール

### Windowsの場合

1. [https://www.docker.com/products/docker-desktop/](https://www.docker.com/products/docker-desktop/) から「Docker Desktop for Windows」をダウンロード

2. インストーラーを実行(WSL2バックエンドを使用するオプションを選択)

3. インストール後、PCを再起動

4. Docker Desktopを起動して確認:


docker --version
docker compose version

注意: Windows版DockerはWSL2を必要とします。WSL2が未インストールの場合は先に第08回の手順で導入してください。

### Macの場合

1. [https://www.docker.com/products/docker-desktop/](https://www.docker.com/products/docker-desktop/) から「Docker Desktop for Mac」をダウンロード

Apple Silicon(M1/M2/M3)の場合は「Mac with Apple chip」を選択

Intel Macの場合は「Mac with Intel chip」を選択

2. .dmg ファイルを開き、Docker.appをApplicationsにドラッグ

3. Docker Desktopを起動して確認:


docker --version
docker compose version

PHP + Apacheのシンプルな構成

まずプロジェクトフォルダを作成します:


myproject/
├── docker-compose.yml
├── php.ini
└── public/
    └── index.php

### docker-compose.yml


services:
  web:
    image: php:8.2-apache
    ports:
      - "8080:80"
    volumes:
      - ./public:/var/www/html
      - ./php.ini:/usr/local/etc/php/conf.d/custom.ini

### php.ini


display_errors = On
error_reporting = E_ALL

### public/index.php


<?php
echo '<h1>Hello from Docker!</h1>';
phpinfo();

起動と確認


# プロジェクトフォルダに移動
cd myproject

# コンテナを起動
docker compose up -d

# ブラウザで確認
# https://phpl4b.com/

-d オプションをつけるとバックグラウンドで起動します。停止するときは:


docker compose down

MySQLを追加する構成

データベースが必要な場合は docker-compose.yml にMySQLサービスを追加します:


services:
  web:
    image: php:8.2-apache
    ports:
      - "8080:80"
    volumes:
      - ./public:/var/www/html
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_NAME: mydb
      DB_USER: user
      DB_PASSWORD: password

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydb
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

PHPからMySQLに接続する場合、php-mysqli または php-pdo_mysql 拡張が必要です。カスタムDockerfileで追加できます:


# Dockerfile
FROM php:8.2-apache
RUN docker-php-ext-install mysqli pdo pdo_mysql

docker-compose.yml でイメージの代わりにDockerfileを指定:


services:
  web:
    build: .
    ports:
      - "8080:80"
    volumes:
      - ./public:/var/www/html

WindowsとMacの差異まとめ

項目 Windows Mac
Docker Desktopの入手先 同じページ、「for Windows」を選択 同じページ、チップに合わせて選択
バックエンド WSL2(必須) HyperKit(Intel)/ Virtualization.framework(Apple Silicon)
パフォーマンス WSL2上のファイルなら良好 標準的に良好
ファイルマウント /mnt/c/ 経由は遅いのでWSL2内に置く ~/ 以下であれば問題なし
localhost でのアクセス そのまま https://phpl4b.com/ そのまま https://phpl4b.com/

Windowsでのパフォーマンス注意: プロジェクトファイルを C:\Users\ 以下ではなく、WSL2内の ~/ 以下に置くことでDockerのファイルマウントが高速になります。

コンテナログの確認

動作がおかしい場合はログで原因を確認します:


# 全サービスのログ
docker compose logs

# webサービスのみリアルタイムで表示
docker compose logs -f web

まとめ & 次のステップ

  • DockerはPHP環境をコードで定義し、どのPCでも同じ状態を再現できる
  • docker-compose.ymlservices にPHPとMySQLを定義して起動する
  • WindowsはWSL2が必要、MacはDocker Desktopをインストールするだけ
  • ファイルをWSL2/Mac側に置くとマウントのパフォーマンスが向上する

次回は「よくあるエラーとトラブルシューティング」を解説します。環境構築でつまずきやすいエラーとその解決策を、OS別にまとめます。

Related Articles