勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PodmanにComposerを導入し、パッケージをインストールする方法

  PHP サーバー

先日Podmanで導入したapache-phpに各種PHPモジュールを追加したが、さらにComposerも導入の上、何らかのパッケージをインストールしたい。調べたところComposer自体はビルド時に、何らかのパッケージはビルド後にインストールするのがよさそう。以下に対応方法をメモ。

 

環境について

VPS

今回はKAGOYA CLOUD VPSのCPU1コア / メモリ1GBプランで作業した。SSH接続は公式案内の通り以下でログインできる。

  • 接続ポート -> 22
  • ユーザ名 -> root
  • パスワード or 秘密鍵 -> インスタンス作成時に選択したもの

ホスト(VPS)側 AlmaLinux / Apache

詳細なバージョンは以下の通り。

# AlmaLinuxのバージョン確認
cat /etc/redhat-release

# 実行結果
AlmaLinux release 8.10 (Cerulean Leopard)

# Apacheのバージョン確認
httpd -v

# 実行結果
Server version: Apache/2.4.37 (AlmaLinux)

 

対応方法

Dockerfileの作成

以下内容の「Dockerfile」というファイル(拡張子なし)を作成し、ホスト側の適当なディレクトリにアップロードする。

# Docker公式PHP8.4&Apache同梱版イメージを指定
FROM docker.io/library/php:8.4-apache

# PHP拡張機能インストーラーをダウンロードして配置
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

# 実行権限を与え、必要なモジュールを一括インストール
RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions \
    apcu \
    bcmath \
    exif \
    gd \
    imagick \
    intl \
    memcache \
    memcached \
    mysqli \
    pdo_mysql \
    opcache \
    redis \
    zip \
    sockets \
    sysvsem

# composerのコピー
COPY --from=docker.io/library/composer:latest /usr/bin/composer /usr/bin/composer

# apache-php8.4はDebian系のためdnfではなくapt-getで必要なコマンドを導入
RUN apt-get update && apt-get install -y git zip unzip

# Apacheのrewriteモジュールを有効化
RUN a2enmod rewrite

イメージのビルド

サーバにSSH接続し以下コマンドでイメージをビルドする。

# Dockerfileを設置したディレクトリに移動
cd /path/to

# イメージをビルド
podman build -t apache-php8.4-plus-1.2 .

コンテナの再作成

正常にビルドできたらCockpitのPodmanコンテナページにビルドしたイメージが表示される筈なので過去記事を参考にコンテナを再作成する。

CLIでコンテナを作成する場合

Cockpitでのコンテナ作成ではなく、サーバにSSH接続しCLIで作成する場合は以下コマンドになる筈(コメントは説明用なので不要)。

#バックグラウンド(デタッチドモード)でPodmanを起動。ターミナルを閉じても動き続ける
podman run -d \
  #コンテナ名の指定
  --name apache-php8.4-plus \
  #ポートマッピング設定。IPアドレス、ホストポート、コンテナポートを指定
  -p 127.0.0.1:8080:80 \
  #ボリューム設定。ホストパスとコンテナパスを指定。ZオプションはSELinuxのセキュリティ権限を適切に自動調整するため
  -v /var/www/html/podman_test_1:/var/www/html:Z \
  #イメージの指定
  apache-php8.4-plus-1.2

Composer

Composerのvendorディレクトリやcomposer.jsonはコンテナ生成時のボリューム設定のホストパスに設置されている筈。

また、以下でComposerのバージョン確認が行える。

# コンテナ名「apache-php8.4-plus」のComposerのバージョン確認
podman exec apache-php8.4-plus composer --version

# 以下が出力された
Composer version 2.10.2 2026-07-01 11:24:45
PHP version 8.4.24 (/usr/local/bin/php)
Run the "diagnose" command to get more detailed diagnostics output.

テストで以前試したwhoopsを以下でインストールする(コメントは説明用なので不要)。

# コンテナ内でコマンドを実行
podman exec \
    # 作業ディレクトリの移動
    -w /var/www/html \
    # 対象のコンテナ名
    apache-php8.4-plus \
    # composerでパッケージをインストール
    composer require filp/whoops

以下テストファイルをアップロードし、ブラウザからアクセスすると動作確認できる筈。

<?php
require 'vendor/autoload.php';
$whoops = new \Whoops\Run;
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
$whoops->register();

echo $test; //定義されていないのでエラー発生

補足

イメージが3つ作成される

Dockerfileのビルド後、以下3つのイメージが作成されるがこれは正常な動作となる。

  • docker.io/library/composer:latest -> ビルドの土台
  • docker.io/library/php:8.4-apache -> 一時的な材料
  • localhost/apache-php8.4-plus-1.2:latest -> 今回作成したカスタムイメージ

再度Dockerfileを調整し、ビルドする際に「docker.io/library/composer:latest」「docker.io/library/php:8.4-apache」が残っていれば高速でビルドできるので基本的には削除せず残しておく。

「localhost/apache-php8.4-plus-1.2:latest」も以前の状態に戻せるように基本的には残しておき「1.3」「1.4」...「1.9」とバージョンが増えてきてサーバ容量が圧迫してきた際に削除を検討する。

Composerのパッケージもビルド時にインストール

Dockerfileに追記することでビルド時にパッケージをインストールできるっぽいが、コンテナ起動の際にマウントが上書きされるとかどうとかでスムーズにはいかなさそう。

回避するにはコンテナ作成時のボリューム設定を多少変更しないといけないっぽいがややこしそうなので今回は無とした。

 - PHP サーバー

  関連記事

CockpitとPodmanでWebサーバ用コンテナを作成しHello Worldページを表示する方法
CockpitとPodmanでWebサーバ用コンテナを作成しHello Worldページを表示する方法

Cockpitにはcockpit-podmanというPodman(Dockerの ...

Podmanで作成したApache用コンテナにLet's Encryptを導入しHTTPS接続できるようにする方法
Podmanで作成したApache用コンテナにLet's Encryptを導入しHTTPS接続できるようにする方法

先日Podmanで作成したApache用コンテナに対してドメインを割り当てたが、 ...

Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法
Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法

先日PodmanでWebサーバ用コンテナを作成したが、ブラウザからアクセスする際 ...

Podmanで導入したapache-phpに各種PHPモジュールを追加する方法
Podmanで導入したapache-phpに各種PHPモジュールを追加する方法

先日Podmanでapache-php8.4を導入したが、phpinfoで確認す ...