Podman Lab

演習の概要

このモジュールでは、Podmanを利用して簡単なWebサーバをデプロイします。


コンテナイメージの検索とダウンロード

RHELのWebコンソールであるCockpitにWebブラウザを使ってアクセスします。 CockpitのURLとアカウント情報はインストラクターから案内されます。

本演習を自習する場合、 RHEL Cockpitの製品ドキュメントを 参照して環境をご用意ください。
cockpit login

左サイドメニューの「Podman コンテナー」を選択して、Podmanコンテナの情報を表示します。 デフォルトでは、コンテナイメージとコンテナイメージに基づくコンテナは何もありません。

cockpit podman

「イメージ」の右横にある縦3点リーダーから、「新規イメージのダウンロード」を選択します。

image download

イメージの検索画面のテキストフィールドに「ubi10」などを入力して、以下のコンテナイメージ選択します。 その後「ダウンロード」ボタンをクリックして、「ubi10」イメージをダウンロードします。

  • docker.io/redhat/ubi10

image search
Red Hat Universal Base Image (UBI)は、RHELから派生したコンテナイメージです。 Red Hat製品ユーザーでなくても、UBIのコンテナイメージおよびUBIでリリースされた全てのコンテンツをご利用いただけます。 RHELまたはOpenShift上でUBIのコンテナを実行する場合、Red Hatによる技術サポートが提供されます。

ダウンロードが完了すると、「ubi10」コンテナイメージの情報が表示されます。

ubi10 download

ダウンロードしたコンテナイメージの情報をコマンドラインで確認したい場合、左サイドメニューの「端末」をクリックして、 次のコマンドを実行します。

podman images

ubi10のコンテナイメージの情報が表示されます。

[testuser99@localhost ~]$ podman images
REPOSITORY              TAG         IMAGE ID      CREATED     SIZE
docker.io/redhat/ubi10  latest      df13daf31556  5 days ago  219 MB
[testuser99@localhost ~]$
podman images cli

コンテナイメージを利用したコンテナの実行

先ほどダウンロードした「ubi10」コンテナイメージを利用して、「ubi10」のコンテナを実行します。 「コンテナー」の右横にある「コンテナーの作成」ボタンをクリックします。 「イメージ」は docker.io/redhat/ubi10:latest を選択して、先ほどダウンロードした「ubi10」を指定します。

container create01

続いて、「インテグレーション」タブで以下の画像のように入力して、コンテナ実行時に紐づけるホストのポートを指定します。 これによって、外部からホストのIPアドレスとホストポートを指定することで、コンテナのポートにアクセスできるようになります。 そして、「作成して実行する」ボタンをクリックして、コンテナを実行します。

  • コンテナポート: 80

  • コンテナポートに割り当てるホストポート: 8080

  • プロトコル: TCP (デフォルト)

複数人で1つのRHEL環境を共有している場合、ユーザー間でホストポートが重複しないように、 8080 ではなく、 8081 から 8200 の間の任意のホストポートを指定するように変更してください。 コンテナが利用するポートは、コンテナ間で重複しても問題ありません。
container create02
実行されるコンテナの名前は、毎回ランダムに指定されます。 コンテナ実行時に特定の名前を指定することもできますが、本演習ではランダムに指定された名前を利用します。

この操作によって、「happy_lamport」という名前のコンテナが「ubi10」コンテナイメージを基にして実行されます。 作成されたコンテナの各タブで、以下のような情報を確認できます。

  • 「詳細」タブ: コンテナ実行時にコンテナ内部で実行されるコマンド(「ubi10」のデフォルトでは /bin/bash )などの情報

  • 「インテグレーション」タブ: コンテナ実行時に紐づけられたホストポート( 0.0.0.0:8080 → 80/tcp : コンテナのTCP 80 をホストのTCP 8080 で公開)などの情報

  • 「ログ」タブ: 実行されるコンテナのログ

container information

「コンソール」タブでは、コンテナ内のbashシェルを利用できます。 idls などの適当なLinuxコマンドを実行して、コンテナ内の情報を確認してみてください。

container console
UBIイメージでは、デフォルトでUBIのパッケージをインストールまたは更新するためのリポジトリが設定されています。 そのため yum または dnf コマンドでパッケージのインストールまたは更新ができます。

コンテナへのアプリケーションインストールと起動

先ほど開いたコンテナの「コンソール」タブを利用して、コンテナに dnf コマンドでWebサーバ(httpdパッケージ)とPHPをインストールします。 この時、次のコマンドを実行します。

dnf -y install httpd php php-fpm
dnf package

アプリケーションのインストールが完了したら、コンテナのコンソールで次のコマンドを実行します。 この時、index.htmlファイルとテスト用のPHPファイルを作成して、httpdコマンドでWebサービスを実行しています。

echo "Apache is running." > /var/www/html/index.html
mkdir -p /run/php-fpm
cat <<EOF > /var/www/html/test.php
<html>
<body>
<?php
echo "Hello Podman 2025-12-25";
echo "<br>";
echo "<br>";
echo "Host Name: ";
echo gethostname();
echo "<br>";
echo "Host IP: ";
echo \$_SERVER["SERVER_ADDR"];
?>
</body>
</html>
EOF

/usr/sbin/php-fpm
/usr/sbin/httpd -DFOREGROUND
httpd exec

Webサービス実行が完了したら、Webコンソールの左サイドメニューの「端末」から curl コマンドでWebサーバにアクセステストします。 これによって index.html ファイルの中身と test.php によるWebサーバのIPアドレス表示を確認できます。 コンテナ内で実行したWebサービスのIPアドレスは、コンテナを実行しているホストのIPアドレスが表示されます。

curl http://localhost:8080

curl http://localhost:8080/test.php
curl test

コンテナの変更保存

ここでコンテナを終了(停止)して、これまで加えてきた変更をコミットして、新しいコンテナイメージとして保存します。 「happy_lamport」表示の右横にある縦3点リーダーをクリックして、「停止」を選択してコンテナを終了状態にします。

container stop

コンテナが終了状態になっているのを確認したら、再び縦3点リーダーをクリックして「コミット」を選択します。

container commit01

新しいコンテナイメージのコミット画面が表示されるので、以下を指定して「コミット」ボタンをクリックします。 「コマンド」でコンテナ実行時のコマンドを指定することで、自動的にWebサービスが実行されるようになります。

  • 新しいイメージ名: httpd-manual

  • コマンド: /bin/sh -c "/usr/sbin/php-fpm & /usr/sbin/httpd -D FOREGROUND"

container commit02

「httpd-manual」コンテナイメージを保存したら、「コンテナーの作成」ボタンから「httpd-manual」コンテナイメージを基にしたコンテナを実行します。 ここでは「端末の使用」チェックボックスのチェックを外して、「作成して実行する」ボタンをクリックします。

「インテグレーション」タブから、ホストポート(例: 8080 )とコンテナポート( 80 )のマッピング指定を忘れないようにしてください。
container create03

これによって、先ほどの「happy_lamport」コンテナの時と同様にWebコンソールの「端末」メニューから curl コマンドで、 Webサービスへのアクセス確認ができるようになります。 アクセス確認が完了したら、ここで実行したコンテナ(上の画像の例だと「strange_saha」コンテナ)を停止しておきます。

ContainerfileまたはDockerfileによるカスタムコンテナイメージの作成

こうしたコンテナの変更及びWebサービスなどの自動起動を有効化したコンテナイメージの作成手順を、Containerfileというテキストファイルに記載できます。 次のコマンドをWebコンソールの「端末」メニューから実行して、ContainerfileとContainerfileで扱うホスト上のファイルを作成します。

mkdir -p builddir

cat <<EOF > builddir/test.php
<html>
<body>
<?php
echo "Hello Podman 2025-12-25";
echo "<br>";
echo "<br>";
echo "Host Name: ";
echo gethostname();
echo "<br>";
echo "Host IP: ";
echo \$_SERVER["SERVER_ADDR"];
?>
</body>
</html>
EOF

cat <<EOF > builddir/Containerfile
FROM docker.io/redhat/ubi10
MAINTAINER Hirofumi Kojima

RUN dnf -y install httpd php php-fpm; dnf clean all; \\
    echo "Apache is running." > /var/www/html/index.html; \\
    sed -i 's/Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf; \\
    mkdir -p /run/php-fpm; \\
    chgrp -R 0 /var/log/httpd /var/run/httpd /run/php-fpm; \\
    chmod -R g=u /var/log/httpd /var/run/httpd /run/php-fpm

ADD test.php /var/www/html/

EXPOSE 8080
USER 10001

CMD /usr/sbin/php-fpm & /usr/sbin/httpd -D FOREGROUND
EOF

作成したファイルは、左サイドメニューの「ファイルブラウザー」からも確認や編集ができます。

file browser01
file browser02

作成したContainerfileでは、以下を指定しています。 セキュリティを考慮して、コンテナ実行時に非rootユーザーでhttpdプロセスを実行するようにしているため、 httpdプロセスの設定ファイルで、TCP 8080 を利用するように変更しています。

  • FROM : カスタムコンテナイメージを作成するためのベースイメージ。ここでは「ubi10」を指定。

  • RUN : カスタムコンテナイメージ作成時に実行するコマンドを指定。

  • ADD : ホスト上のファイルをコンテナイメージにコピー。ここでは、Containerfileがあるディレクトリの test.php をコンテナイメージ内の /var/www/html ディレクトリにコピー。

  • EXPOSE : コンテナの公開ポート。ここではTCP 8080 を指定。

  • USER : コンテナ実行時に実行されるコマンドが、どのユーザーで実行されるかを指定。ここではユーザーID 10001 のローカルユーザーを指定。

  • CMD : コンテナ実行時に実行されるコマンドを指定。

このContainerfileを利用して、「端末」メニューから以下のコマンドを実行します。 podman build コマンドでは、Containerfileがあるディレクトリ(ここでは builddir ディレクトリ)を指定して、 カスタムコンテナイメージを作成できます。 -t オプションで、カスタムイメージの名前を指定できます。

podman build -t httpd-auto builddir/
podman build

podman build コマンドでカスタムイメージ「httpd-auto」を作成したら、 このイメージを基に、コンテナを実行します。この時に、以下を忘れないようにしてください。

  • 「端末の使用」のチェックを外す。

  • 「インテグレーション」タブから、ホストポート(例: 8080 )とコンテナポート( 8080 )のマッピング設定を行う。

container create04

コンテナが実行されると、コンテナの「コンソール」タブから、ユーザーID 10001 が指定されていることが分かります。 また、コンテナのコンソールまたはCockpitコンソールの「端末」メニューから、Webサービスへのアクセス確認ができます。

container id