はじめに (対象読者・この記事でわかること)

この記事は、PHPプログラミングを始めたばかりの方、あるいはDockerを使って開発環境を構築したいと考えている方を主な対象としています。特に、Webアプリケーション開発だけでなく、PHPスクリプトをコマンドラインで実行し、その結果をコンソールに出力する方法に興味がある方にとって役立つ内容となっています。

この記事を読むことで、DockerとDocker Composeを用いたPHPの実行環境構築方法がわかります。さらに、構築した環境内でPHPスクリプトをCLI(Command Line Interface)として実行し、標準出力に結果を表示する具体的な手順を習得できます。これにより、PHPの学習効率を高めたり、バッチ処理や簡単なスクリプトテストのための環境をスムーズに準備できるようになります。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 * Dockerの基本的な概念(イメージ、コンテナ、Dockerfile、Docker Compose) * 基本的なLinuxコマンド操作(cd, mkdir, ls など) * PHPの基本的な文法(変数、echo 文など)

DockerでPHP環境を作るメリットとCLI実行の可能性

現代のソフトウェア開発において、Dockerは開発環境の構築と管理に不可欠なツールとなっています。特にPHP開発においても、Dockerを利用することで多くのメリットを享受できます。

Dockerを使うメリット

  1. 環境の一貫性: 開発者間で同じ環境を共有できるため、「私の環境では動くのに…」といった問題を解消できます。
  2. ポータビリティ: コンテナ化された環境は、どのOS(Windows, macOS, Linux)上でも同じように動作します。
  3. 依存関係の管理: PHPのバージョン、必要な拡張機能、ミドルウェアなどをコンテナに閉じ込めることで、ホストOSを汚染せずに管理できます。
  4. 素早い環境構築: 一度Docker Composeファイルを作成すれば、数行のコマンドで開発環境をセットアップできます。

PHPのCLI(Command Line Interface)とは?

PHPは主にWebサーバー(Apache, Nginxなど)と連携して動くイメージが強いですが、CLIとしても非常に強力です。CLIモードのPHPは、Webサーバーを介さずに直接PHPスクリプトを実行し、その結果を標準出力(コンソール)に表示することができます。

PHP CLIの主な用途: * バッチ処理: 定期的に実行されるデータ処理やファイル操作スクリプト。 * 開発時のテスト: ユニットテストや簡単なスクリプトの動作確認。 * Composerなどのツール実行: PHPのパッケージ管理ツールComposerもCLIで動作します。 * スクリプト実行: 特定のタスクを自動化するためのスクリプト。

Dockerコンテナ内でPHP CLIを実行する基本的な考え方

Dockerコンテナは、分離された環境でアプリケーションを実行するためのものです。PHPのCLI環境をDockerコンテナとして構築することで、ホストOSにPHPをインストールすることなく、必要なPHPバージョンや拡張機能が揃った環境でPHPスクリプトを実行できます。

具体的には、PHPのCLIが搭載された公式のDockerイメージ (php:*-cli など) をベースにコンテナを構築し、そのコンテナ内でphpコマンドを実行する形になります。これにより、PHPスクリプトの実行結果をホストOSのコンソールに直接出力することが可能となります。次のセクションでは、この具体的な手順をDocker Composeを用いて解説します。

Docker Composeを使ったPHP CLI環境構築と実行手順

ここからは、実際にDocker Composeを使ってPHPのCLI実行環境を構築し、簡単なPHPスクリプトをコンソールに出力するまでの具体的な手順を解説します。

ステップ1: プロジェクトディレクトリの準備

まず、プロジェクトのルートディレクトリを作成し、その中にPHPスクリプトを配置するディレクトリと、環境設定ファイルを作成します。

Bash
# プロジェクトルートディレクトリを作成 mkdir my-php-cli-app cd my-php-cli-app # PHPスクリプトを格納するディレクトリを作成 mkdir src # 簡単なPHPスクリプトを作成 echo "<?php echo 'Hello from Dockerized PHP CLI!'; ?>" > src/index.php echo "<?php echo 'Current time: ' . date('Y-m-d H:i:s') . PHP_EOL; ?>" > src/time.php

src/index.php の内容:

Php
<?php echo 'Hello from Dockerized PHP CLI!'; ?>

src/time.php の内容:

Php
<?php echo 'Current time: ' . date('Y-m-d H:i:s') . PHP_EOL; ?>

PHP_EOL は改行コードを表すPHPの定数です。

ステップ2: Dockerfileの作成

次に、PHPコンテナのベースとなる Dockerfile を作成します。このファイルは、どのようなイメージを基に、どのような設定でコンテナを構築するかを定義します。

my-php-cli-app ディレクトリ直下に Dockerfile という名前で以下の内容を保存してください。

Dockerfile
# 使用するPHPのバージョンと種類を指定 (CLI版) # php:8.3-cli-alpine は軽量なAlpine LinuxベースのPHP 8.3 CLI環境 FROM php:8.3-cli-alpine # コンテナ内の作業ディレクトリを設定 WORKDIR /app # ホストPCのsrcディレクトリの中身をコンテナ内の/appにコピー # ただし、docker-compose.ymlでvolumes設定を使うので、ここではコードのコピーは不要 # COPY ./src /app

Dockerfileのポイント: * FROM php:8.3-cli-alpine: PHP 8.3のCLIバージョンをAlpine Linuxという軽量OS上で動かすイメージを選択しています。これにより、コンテナイメージのサイズを最小限に抑えられます。 * WORKDIR /app: コンテナ内でコマンドを実行する際のデフォルトのディレクトリを /app に設定します。

ステップ3: Docker Composeファイルの作成

複数のサービス(ここではPHPのみですが、将来的にはデータベースなども追加できます)をまとめて管理するために docker-compose.yml を作成します。

my-php-cli-app ディレクトリ直下に docker-compose.yml という名前で以下の内容を保存してください。

Yaml
version: '3.8' services: php: build: . volumes: - ./src:/app tty: true # command: /bin/sh # 対話型シェルを直接起動する場合、この行をコメント解除

docker-compose.ymlのポイント: * version: '3.8': Docker Composeファイルのフォーマットバージョンを指定します。 * services: 定義するサービス群です。 * php: サービスの名前です。任意の名前をつけられます。 * build: .: 現在のディレクトリにある Dockerfile を使ってイメージをビルドすることを指定します。 * volumes: - ./src:/app: ホストOSの ./src ディレクトリ(PHPスクリプトがある場所)を、コンテナ内の /app ディレクトリにマウントします。これにより、ホスト側でPHPスクリプトを編集すると、コンテナ内にも即座に反映されます。 * tty: true: コンテナがバックグラウンドで起動しても、対話型シェルに接続できるようにします。これはdocker-compose execを使う際に便利です。

ステップ4: Docker環境のビルドとコンテナの起動

これで準備が整いました。以下のコマンドを実行して、Dockerイメージをビルドし、PHPコンテナを起動します。

my-php-cli-app ディレクトリで実行してください。

Bash
# Dockerイメージをビルド docker-compose build # コンテナをバックグラウンドで起動 docker-compose up -d

docker-compose buildDockerfile に基づいてイメージを作成します。初回は時間がかかります。 docker-compose up -d は、作成したイメージからコンテナを起動し、バックグラウンドで実行します。

コンテナが正常に起動しているか確認します。

Bash
docker-compose ps

以下のような出力があれば成功です。

  Name                 Command               State    Ports
------------------------------------------------------------
my-php-cli-app-php-1   /usr/local/bin/php -a   Up

ステップ5: PHPスクリプトのCLI実行とコンソール出力

コンテナが起動したら、docker-compose exec コマンドを使ってコンテナ内でPHPスクリプトを実行し、結果をホストOSのコンソールに出力します。

Bash
# index.php を実行 docker-compose exec php php /app/index.php

出力例:

Hello from Dockerized PHP CLI!

別のスクリプト (time.php) も実行してみましょう。

Bash
# time.php を実行 docker-compose exec php php /app/time.php

出力例:

Current time: 2024-07-26 10:30:00

このように、Dockerコンテナ内でPHPスクリプトをCLIとして実行し、その結果をホストOSのコンソールに直接出力することができました。

ステップ6: 対話型シェルの利用 (おまけ)

PHPスクリプトの実行だけでなく、コンテナ内部に直接入って操作することも可能です。

Bash
# PHPコンテナのシェルに接続 docker-compose exec php sh

これでコンテナ内のシェルに接続できます。コンテナ内で ls コマンドなどを実行して /app ディレクトリの内容を確認してみましょう。

Bash
/app # ls -l total 8 -rw-r--r-- 1 root root 41 Jul 26 01:30 index.php -rw-r--r-- 1 root root 65 Jul 26 01:30 time.php /app # php index.php Hello from Dockerized PHP CLI! /app # exit

exit コマンドでコンテナシェルから抜けることができます。

最後に、不要になったコンテナは停止・削除しておきましょう。

Bash
docker-compose down

ハマった点やエラー解決

1. docker-compose コマンドが見つからない/動かない

  • 問題: command not found: docker-compose や、docker-compose がうまく機能しない。
  • 原因: Docker Desktopが起動していない、あるいはDocker Composeのインストールが正しくない可能性があります。
  • 解決策:
    • Docker Desktopがインストールされ、起動しているか確認してください。
    • docker-compose はDocker Desktopに含まれていますが、古いバージョンでは個別にインストールが必要な場合がありました。最新版のDocker Desktopを使用しているか確認しましょう。

2. php コマンドが見つからない (コンテナ内で)

  • 問題: docker-compose exec php php /app/index.php を実行した際に sh: php: not found といったエラーが出る。
  • 原因: 指定したDockerイメージにPHPのCLIが含まれていないか、PATH が通っていない。
  • 解決策: DockerfileFROM で指定するイメージタグを php:*-cli (例: php:8.3-cli-alpine) のように cli が含まれるものにしてください。fpm 系のイメージはCLIツールがインストールされていない場合があります。

3. ファイルが見つからない (No such file or directory)

  • 問題: php /app/index.php を実行した際に Could not open input file: /app/index.php とエラーが出る。
  • 原因:
    1. docker-compose.ymlvolumes 設定が間違っている。
    2. DockerfileWORKDIR が意図しないパスになっている。
    3. ホスト側の src ディレクトリにPHPファイルが存在しない。
  • 解決策:
    1. volumes: - ./src:/app のパスが正しいか(ホスト側とコンテナ側両方)再確認してください。ホスト側の ./srcdocker-compose.yml がある場所からの相対パスです。
    2. WORKDIR /app が正しいか確認し、PHPスクリプトが /app の直下にあることを想定しているか確認してください。
    3. src/index.php など、必要なファイルがホスト側の src ディレクトリに正しく作成されているか確認してください。

4. パーミッションエラー

  • 問題: PHPスクリプトが特定のファイルに書き込みをしようとした際に Permission denied エラーが発生する。
  • 原因: コンテナ内で実行しているユーザー(通常は root またはイメージで定義されたユーザー)に、マウントされたホスト側のファイルやディレクトリへの書き込み権限がない。
  • 解決策:
    • 開発環境であれば、ホスト側のディレクトリのパーミッションを一時的に緩める (chmod -R 777 src) ことで解決できる場合がありますが、本番環境では推奨されません。
    • Dockerfiledocker-compose.yml でコンテナ内のユーザーを変更したり、適切なパーミッションでファイルを作成するように調整する方法もあります。

解決策

上記ハマりポイントに対する具体的な解決策は以下の通りです。

  • Docker Desktopの確認: タスクバー/メニューバーのDockerアイコンを確認し、"Docker Desktop is running" の状態であることを確認します。
  • PHP CLIイメージの使用: DockerfileFROM 行を php:8.x-cli または php:8.x-cli-alpine のような cli タグ付きのものに確実に設定します。
  • パスの再確認:
    • docker-compose.ymlvolumes: 設定で、ホスト側のパス (./src) が docker-compose.yml から見て正しいか。
    • コンテナ側のパス (/app) が DockerfileWORKDIRCOPY コマンドと一貫しているか。
    • docker-compose exec php php /app/index.php/app/index.php が、コンテナ内のPHPスクリプトの正確なパスであるか。
  • パーミッションの調整: 必要であれば、ホスト側の src ディレクトリに対して chmod 777 src を実行し、コンテナからの書き込みを許可します(ただし、本番環境では注意が必要です)。

これらの確認と調整を行うことで、多くの問題は解決できるはずです。

まとめ

本記事では、DockerとDocker Composeを用いてPHPのCLI環境を構築し、PHPスクリプトの実行結果をコンソールに出力する方法 を詳細に解説しました。

  • Dockerの利点: 環境の一貫性、ポータビリティ、依存関係の簡単な管理といったDockerのメリットを活かし、安定したPHP開発環境を構築できます。
  • PHP CLIの活用: Webサーバーを介さずにPHPスクリプトを直接実行するCLIの概念と、その多様な用途(バッチ処理、開発テストなど)を理解しました。
  • 具体的な手順: Dockerfiledocker-compose.yml を作成し、docker-compose builddocker-compose up -d、そして docker-compose exec コマンドを使ってPHPスクリプトを実行し、コンソールに出力する具体的なステップを実践しました。

この記事を通して、Dockerを使ったPHP CLI環境の構築が非常に容易であり、開発効率を大きく向上させられることを実感いただけたかと思います。これにより、PHPの学習や日々の開発におけるスクリプトテストがよりスムーズになるでしょう。

今後は、Composerを使ったPHPパッケージの管理、データベース(MySQL/PostgreSQLなど)との連携、あるいはPHPUnitなどのテストフレームワークと組み合わせた自動テスト環境の構築についても記事にする予定です。

参考資料

参考にした記事、ドキュメント、書籍などがあれば、必ず記載しましょう。