こんにちは。よっしーです(^^)
今日は、PHPにおけるComposerの実行環境をDockerで構築する方法についてご紹介します。
背景
PHPにおけるComposerの実行環境をDockerで構築する方法について調査する機会があったので、そのときの内容を備忘として残しました。
今回作成したファイルは下記のGitHUBにあります。
概要
Composer(コンポーザー)は、PHPの依存関係管理ツールであり、PHPプロジェクトで外部のライブラリやパッケージを簡単に統合できるようにするためのツールです。以下はComposerの主な特徴と概要です。
- 依存関係管理:
Composerは、プロジェクトが他のライブラリやパッケージに依存する場合、それらの依存関係を管理します。これにより、開発者は手動でライブラリをダウンロードして統合する手間を省くことができます。 - 自動オートローディング:
Composerは、自動的にオートローディングのクラスマップを生成します。これにより、手動でクラスを読み込む必要がなくなり、プロジェクト内でクラスを簡単に利用できます。 - パッケージ管理:
Composerは、Packagistと呼ばれるオンラインのパッケージリポジトリを使用して、PHPのライブラリやパッケージを検索・インストールできます。Packagistに登録された数多くのパッケージが利用可能で、これらを簡単にプロジェクトに統合できます。 - コマンドラインツール:
Composerはコマンドラインツールとして提供され、シェルやコマンドプロンプトを介して使用されます。これにより、依存関係のインストール、アップデート、オートローディングの生成などがコマンドで簡単に実行できます。 - composer.jsonファイル:
プロジェクトのルートディレクトリには、依存関係の情報や設定が記述されたcomposer.json
ファイルが存在します。このファイルには、必要なパッケージ、バージョン、スクリプトなどの情報が含まれています。 - グローバルインストールとローカルインストール:
Composerは、プロジェクトごとにローカルにインストールされたり、システム全体でグローバルにインストールされたりします。ローカルインストールでは、プロジェクトごとに異なる依存関係を管理できます。
ComposerはPHPコミュニティで幅広く利用され、PHPプロジェクトの開発やメンテナンスを効率的に行うための重要なツールとなっています。
構成ファイル一覧
下記のファイルを用意します。各ファイルの内容は各セクションに記載しています。
new file: Makefile
new file: compose.yml
new file: php/Dockerfile
php/Dockerfile
FROM php:8.2-cli
# composerのインストール
COPY --from=composer:2.6.6 /usr/bin/composer /usr/bin/composer
compose.yml
version: '3.8'
services:
php-cmd:
build: ./php
container_name: php-cmd
volumes:
- ./php/src:/work
working_dir: /work
Makefile
SHELL = /bin/bash
WOKR_DIR = ./
.DEFAULT_GOAL := help
# コンテナの状態
.PHONY: ps
ps:
cd $(WOKR_DIR) \
&& docker compose ps
# アプリのビルド
.PHONY: build
build:
cd $(WOKR_DIR) \
&& docker compose build
# アプリの起動
.PHONY: up
up:
cd $(WOKR_DIR) \
&& docker compose up -d
# アプリの停止
.PHONY: down
down:
cd $(WOKR_DIR) \
&& docker compose down
# コンテナの削除
.PHONY: clean
clean:
cd $(WOKR_DIR) \
&& docker compose down --rmi all --volumes --remove-orphans
# PHPコンテナへのログイン
.PHONY: login
login:
cd $(WOKR_DIR) \
&& docker compose run --rm -it php-cmd bash
# help
.PHONY: help
help:
@grep -B 2 -E '^[a-zA-Z_-]+:' Makefile \
| grep -v '.PHONY' \
| grep -v -E '^\s*$$' \
| tr '\n' ',' \
| sed 's/--,/\n/g' \
| awk -F, '{printf "%-20s %s\n", $$2, $$1}'
php/Dockerfile
FROM php:8.2-cli
# composerのインストール
COPY --from=composer:2.6.6 /usr/bin/composer /usr/bin/composer
動作確認
下記のコマンドを実行します。
make build
make login
PHPのコンテナにログインできたら下記のコマンドを実行します。
# PHPコンテナ内でPHPのバージョン確認
php --version
# PHPコンテナ内でComposerのバージョン確認
composer --version
下記のような実行結果になっていれば成功です。
解説
php/Dockerfile
このコードは、Dockerfileと呼ばれるもので、Dockerコンテナのビルドに使用されます。以下はこのDockerfileの解説です。
FROM php:8.2-cli
:
- この行は、ベースイメージとして公式のPHPイメージを使用することを示しています。
8.2-cli
はPHPのバージョン8.2をコマンドラインインターフェース(CLI)向けに使用することを指定しています。
COPY --from=composer:2.6.6 /usr/bin/composer /usr/bin/composer
:
- この行は、別のコンテナ(
composer:2.6.6
として指定されています)から/usr/bin/composer
をコピーしています。 --from=composer:2.6.6
は、composer:2.6.6
という名前の別のコンテナイメージからのコピーを示しています。/usr/bin/composer
はコピー元のコンテナ内のComposerバイナリの場所です。/usr/bin/composer
は、コピー先のコンテナ内でのComposerバイナリの配置先です。
このDockerfileは、PHP 8.2のCLI向けのベースイメージを作成し、その中にComposerのバイナリを含めるようになっています。Dockerを使用することで、環境の構築や依存関係の管理をコンテナ単位で行い、開発・デプロイの一貫性を確保することができます。
compose.yml
提供されたコードは、Docker Composeファイルで、複数のDockerコンテナを定義しています。以下は、このDocker Composeファイルの解説です。
version: '3.8'
:
- このファイルが使用するDocker Composeファイルフォーマットのバージョンを指定しています。ここでは3.8が指定されています。
services:
:
- ここからが各サービス(コンテナ)の定義です。
php-cmd:
:
- これはサービス(コンテナ)の名前で、ここでは”php-cmd”と呼ばれています。
build: ./php
:
./php
ディレクトリ内にあるDockerイメージをビルドすることを指定しています。php
ディレクトリには別途Dockerfile
が存在していると仮定されています。
container_name: php-cmd
:
- 生成されるコンテナの名前を”php-cmd”に指定しています。
volumes: - ./php/src:/work
:
- ローカルの
./php/src
ディレクトリをコンテナ内の/work
ディレクトリにマウントしています。これにより、ホストとコンテナ間でファイルの変更が即座に反映されます。
working_dir: /work
:
- コンテナ内の作業ディレクトリを
/work
に設定しています。これは、コンテナが実行されるときにデフォルトで移動するディレクトリを指定します。
このDocker Composeファイルは、”php-cmd”という名前のサービスを定義し、それが./php
ディレクトリ内のDockerイメージをビルドして生成されるコンテナです。また、ホストの./php/src
ディレクトリをコンテナ内の/work
ディレクトリにマウントし、作業ディレクトリを/work
に設定しています。これにより、ホストとコンテナ間でファイルの同期が行われ、効果的な開発環境を提供します。
Makefile
このMakefileは、Dockerコマンドを簡略化し、Docker Composeを使用したプロジェクトの管理を支援するためのタスクを提供します。以下は各タスクの機能と解説です。
- 変数定義:
SHELL = /bin/bash
WORK_DIR = ./
.DEFAULT_GOAL := help
SHELL
: Makefile内で使用するシェルを指定します。WORK_DIR
: Makefileが作業するディレクトリを指定します。.DEFAULT_GOAL
: メイクファイルが引数なしで呼び出された場合に実行されるターゲットを指定します。
- ターゲット
ps
:
.PHONY: ps
ps:
cd $(WORK_DIR) \
&& docker compose ps
make ps
を実行すると、Docker Composeで定義されたコンテナの状態を表示します。
- ターゲット
build
:
.PHONY: build
build:
cd $(WORK_DIR) \
&& docker compose build
make build
を実行すると、Docker Composeで定義されたコンテナをビルドします。
- ターゲット
up
:
.PHONY: up
up:
cd $(WORK_DIR) \
&& docker compose up -d
make up
を実行すると、Docker Composeで定義されたコンテナをデタッチドモードで起動します。
- ターゲット
down
:
.PHONY: down
down:
cd $(WORK_DIR) \
&& docker compose down
make down
を実行すると、Docker Composeで定義されたコンテナを停止します。
- ターゲット
clean
:
.PHONY: clean
clean:
cd $(WORK_DIR) \
&& docker compose down --rmi all --volumes --remove-orphans
make clean
を実行すると、Docker Composeで定義されたコンテナを停止し、関連するイメージとボリュームを削除します。
- ターゲット
login
:
.PHONY: login
login:
cd $(WORK_DIR) \
&& docker compose run --rm -it php-cmd bash
make login
を実行すると、Docker Composeで定義されたphp-cmd
サービスに対してbash
シェルでログインします。
- ターゲット
help
:
.PHONY: help
help:
@grep -B 2 -E '^[a-zA-Z_-]+:' Makefile \
| grep -v '.PHONY' \
| grep -v -E '^\s*$$' \
| tr '\n' ',' \
| sed 's/--,/\n/g' \
| awk -F, '{printf "%-20s %s\n", $$2, $$1}'
make help
を実行すると、Makefile内で定義された各ターゲットとその説明が表示されます。
おわりに
今日は、PHPにおけるComposerの実行環境をDockerで構築する方法についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント