👻

Ubuntu × DockerでPHP-FPM環境を構築する最小構成メモ

に公開

Docker を使って PHP-FPM の環境を Ubuntu ベースで構築する際の基本的な Dockerfile について、各ステップの意味や注意点を詳しく解説しています。
この記事では「なぜその命令が必要なのか?」「どんなトラブルを避けているのか?」を意識し、見返したときに理解が深まるようにまとめました。

全体構成の目的

この Dockerfile は、Ubuntu 22.04 をベースに PHP-FPM をインストールして、FastCGI 用に TCP ポート 9000 で待ち受ける PHP 実行環境を構築するものです。

dockerfileのコード

FROM ubuntu:22.04

ENV DEBIAN_FRONTEND=noninteractive

# GPG問題を避けるための応急処置を追加
RUN rm -rf /var/lib/apt/lists/* \
  && apt-get clean \
  && apt-get update --allow-insecure-repositories \
  && apt-get install -y tzdata php-fpm

# TCP 9000で受けるように FastCGI 設定ファイルを上書き
COPY etc/www.conf /etc/php/8.1/fpm/pool.d/www.conf

WORKDIR /app

CMD ["/usr/sbin/php-fpm8.1", "-F"]

ステップの説明

1. FROM ubuntu:22.04

  • ベースとなる OS イメージを Ubuntu 22.04 に指定しています。
  • コンテナ内の環境はこの OS 上に構築されます。

※ Ubuntu 22.04 は「LTS(Long Term Support)」=長期サポート版です。セキュリティ更新が5年間提供されるので、安定した開発環境を作りたいときに選ばれることが多いです。

2. ENV DEBIAN_FRONTEND=noninteractive

  • apt コマンド実行時の対話的なプロンプト(例: タイムゾーン設定など)を無効化するための環境変数です。
  • 自動化された環境でエラーが出ないようにします。

3. RUN の各ステップの意味

(1) rm -rf /var/lib/apt/lists/*

  • 意味:APT が保持しているパッケージリストのキャッシュをすべて削除します
  • 目的:古いキャッシュによるエラー(404、GPG署名など)を防ぐ
  • 補足apt update で再取得されるので削除してもOK

(2) apt-get clean

  • 意味:インストール済みパッケージの .deb キャッシュを削除
  • 目的:イメージサイズ削減のため。次のインストール準備にもなる

(3) apt-get update --allow-insecure-repositories

  • 意味:APT リポジトリの最新情報を取得し、署名が無効でも許容する
  • なぜ使う?:一部環境では GPG 署名のないリポジトリしか使えないことがあり、それによる失敗を防ぐため(※開発用途限定)

(4) apt-get install -y tzdata php-fpm

  • 意味:必要なパッケージをプロンプトなしでインストール
  • tzdata:タイムゾーンデータを提供(例:Asia/Tokyo)
  • php-fpm:PHPのFastCGI実行エンジン。Webサーバと連携してPHPを処理

4. COPY etc/www.conf /etc/php/8.1/fpm/pool.d/www.conf

FastCGI の設定ファイル(www.conf)を上書きしています。
目的:PHP-FPM に TCP ポート 9000 で接続を受け付けさせるため。
デフォルトでは、PHP-FPM は Unix ドメインソケット /run/php/php8.1-fpm.sock で待ち受ける設定になっています。しかし、Nginx などと TCP 通信で接続したい場合は、www.confファイル内で以下のように指定する必要があります:
listen = 0.0.0.0:9000

5. WORKDIR /app

作業ディレクトリを /app に設定。
以後のコマンドやコンテナ内での作業はこのディレクトリ内で行われます。

6. CMD ["/usr/sbin/php-fpm8.1", "-F"]

コンテナ起動時に PHP-FPM をフォアグラウンドモードで起動します。
-F オプションにより、バックグラウンドでなく、そのプロセスがずっと動き続けるようにします(Docker コンテナはメインプロセスが終了すると停止してしまうため)。

まとめ

この Dockerfile は、以下のことを目的としています:

目的 説明
Ubuntu 上に PHP-FPM 環境を作る PHP スクリプト実行環境(Webサーバと連携用)を準備
ポート 9000 で FastCGI を受ける設定に変更 後で Nginx などと連携して使うための準備
対話なしでインストール処理を自動化 DEBIAN_FRONTENDtzdata の設定回避
CMD で PHP-FPM を常駐起動 コンテナのメインプロセスとして動かすため

Discussion