Podman Lab
演習の概要
このモジュールでは、Podmanを利用して簡単なWebサーバをデプロイします。
コンテナイメージの検索とダウンロード
RHELのWebコンソールであるCockpitにWebブラウザを使ってアクセスします。 CockpitのURLとアカウント情報はインストラクターから案内されます。
| 本演習を自習する場合、 RHEL Cockpitの製品ドキュメントを 参照して環境をご用意ください。 |
左サイドメニューの「Podman コンテナー」を選択して、Podmanコンテナの情報を表示します。 デフォルトでは、コンテナイメージとコンテナイメージに基づくコンテナは何もありません。
「イメージ」の右横にある縦3点リーダーから、「新規イメージのダウンロード」を選択します。
イメージの検索画面のテキストフィールドに「ubi10」などを入力して、以下のコンテナイメージ選択します。 その後「ダウンロード」ボタンをクリックして、「ubi10」イメージをダウンロードします。
-
docker.io/redhat/ubi10
| Red Hat Universal Base Image (UBI)は、RHELから派生したコンテナイメージです。 Red Hat製品ユーザーでなくても、UBIのコンテナイメージおよびUBIでリリースされた全てのコンテンツをご利用いただけます。 RHELまたはOpenShift上でUBIのコンテナを実行する場合、Red Hatによる技術サポートが提供されます。 |
ダウンロードが完了すると、「ubi10」コンテナイメージの情報が表示されます。
ダウンロードしたコンテナイメージの情報をコマンドラインで確認したい場合、左サイドメニューの「端末」をクリックして、 次のコマンドを実行します。
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 ~]$
コンテナイメージを利用したコンテナの実行
先ほどダウンロードした「ubi10」コンテナイメージを利用して、「ubi10」のコンテナを実行します。
「コンテナー」の右横にある「コンテナーの作成」ボタンをクリックします。
「イメージ」は docker.io/redhat/ubi10:latest を選択して、先ほどダウンロードした「ubi10」を指定します。
続いて、「インテグレーション」タブで以下の画像のように入力して、コンテナ実行時に紐づけるホストのポートを指定します。 これによって、外部からホストのIPアドレスとホストポートを指定することで、コンテナのポートにアクセスできるようになります。 そして、「作成して実行する」ボタンをクリックして、コンテナを実行します。
-
コンテナポート:
80 -
コンテナポートに割り当てるホストポート:
8080 -
プロトコル:
TCP(デフォルト)
複数人で1つのRHEL環境を共有している場合、ユーザー間でホストポートが重複しないように、
8080 ではなく、 8081 から 8200 の間の任意のホストポートを指定するように変更してください。
コンテナが利用するポートは、コンテナ間で重複しても問題ありません。
|
| 実行されるコンテナの名前は、毎回ランダムに指定されます。 コンテナ実行時に特定の名前を指定することもできますが、本演習ではランダムに指定された名前を利用します。 |
この操作によって、「happy_lamport」という名前のコンテナが「ubi10」コンテナイメージを基にして実行されます。 作成されたコンテナの各タブで、以下のような情報を確認できます。
-
「詳細」タブ: コンテナ実行時にコンテナ内部で実行されるコマンド(「ubi10」のデフォルトでは
/bin/bash)などの情報 -
「インテグレーション」タブ: コンテナ実行時に紐づけられたホストポート(
0.0.0.0:8080 → 80/tcp: コンテナのTCP80をホストのTCP8080で公開)などの情報 -
「ログ」タブ: 実行されるコンテナのログ
「コンソール」タブでは、コンテナ内のbashシェルを利用できます。 id や ls などの適当なLinuxコマンドを実行して、コンテナ内の情報を確認してみてください。
UBIイメージでは、デフォルトでUBIのパッケージをインストールまたは更新するためのリポジトリが設定されています。
そのため yum または dnf コマンドでパッケージのインストールまたは更新ができます。
|
コンテナへのアプリケーションインストールと起動
先ほど開いたコンテナの「コンソール」タブを利用して、コンテナに dnf コマンドでWebサーバ(httpdパッケージ)とPHPをインストールします。
この時、次のコマンドを実行します。
dnf -y install httpd php php-fpm
アプリケーションのインストールが完了したら、コンテナのコンソールで次のコマンドを実行します。 この時、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
Webサービス実行が完了したら、Webコンソールの左サイドメニューの「端末」から curl コマンドでWebサーバにアクセステストします。
これによって index.html ファイルの中身と test.php によるWebサーバのIPアドレス表示を確認できます。
コンテナ内で実行したWebサービスのIPアドレスは、コンテナを実行しているホストのIPアドレスが表示されます。
curl http://localhost:8080
curl http://localhost:8080/test.php
コンテナの変更保存
ここでコンテナを終了(停止)して、これまで加えてきた変更をコミットして、新しいコンテナイメージとして保存します。 「happy_lamport」表示の右横にある縦3点リーダーをクリックして、「停止」を選択してコンテナを終了状態にします。
コンテナが終了状態になっているのを確認したら、再び縦3点リーダーをクリックして「コミット」を選択します。
新しいコンテナイメージのコミット画面が表示されるので、以下を指定して「コミット」ボタンをクリックします。 「コマンド」でコンテナ実行時のコマンドを指定することで、自動的にWebサービスが実行されるようになります。
-
新しいイメージ名:
httpd-manual -
コマンド:
/bin/sh -c "/usr/sbin/php-fpm & /usr/sbin/httpd -D FOREGROUND"
「httpd-manual」コンテナイメージを保存したら、「コンテナーの作成」ボタンから「httpd-manual」コンテナイメージを基にしたコンテナを実行します。 ここでは「端末の使用」チェックボックスのチェックを外して、「作成して実行する」ボタンをクリックします。
「インテグレーション」タブから、ホストポート(例: 8080 )とコンテナポート( 80 )のマッピング指定を忘れないようにしてください。
|
これによって、先ほどの「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
作成したファイルは、左サイドメニューの「ファイルブラウザー」からも確認や編集ができます。
作成したContainerfileでは、以下を指定しています。
セキュリティを考慮して、コンテナ実行時に非rootユーザーでhttpdプロセスを実行するようにしているため、
httpdプロセスの設定ファイルで、TCP 8080 を利用するように変更しています。
-
FROM: カスタムコンテナイメージを作成するためのベースイメージ。ここでは「ubi10」を指定。 -
RUN: カスタムコンテナイメージ作成時に実行するコマンドを指定。 -
ADD: ホスト上のファイルをコンテナイメージにコピー。ここでは、Containerfileがあるディレクトリのtest.phpをコンテナイメージ内の/var/www/htmlディレクトリにコピー。 -
EXPOSE: コンテナの公開ポート。ここではTCP8080を指定。 -
USER: コンテナ実行時に実行されるコマンドが、どのユーザーで実行されるかを指定。ここではユーザーID10001のローカルユーザーを指定。 -
CMD: コンテナ実行時に実行されるコマンドを指定。
このContainerfileを利用して、「端末」メニューから以下のコマンドを実行します。
podman build コマンドでは、Containerfileがあるディレクトリ(ここでは builddir ディレクトリ)を指定して、
カスタムコンテナイメージを作成できます。 -t オプションで、カスタムイメージの名前を指定できます。
podman build -t httpd-auto builddir/
podman build コマンドでカスタムイメージ「httpd-auto」を作成したら、
このイメージを基に、コンテナを実行します。この時に、以下を忘れないようにしてください。
-
「端末の使用」のチェックを外す。
-
「インテグレーション」タブから、ホストポート(例:
8080)とコンテナポート(8080)のマッピング設定を行う。
コンテナが実行されると、コンテナの「コンソール」タブから、ユーザーID 10001 が指定されていることが分かります。
また、コンテナのコンソールまたはCockpitコンソールの「端末」メニューから、Webサービスへのアクセス確認ができます。