第6章 UBI コンテナーへのソフトウェアの追加
UBI (Red Hat Universal Base Images) は、RHEL コンテンツのサブセットから構築されます。UBI は、UBI でインストールするために自由に利用可能な RHEL パッケージのサブセットも提供します。実行中のコンテナーにソフトウェアを追加または更新するには、RPM パッケージと更新を含む DNF リポジトリーを使用できます。UBI は、Python、Perl、Node.js、Ruby などの事前にビルドされた言語ランタイムコンテナーイメージを提供します。
UBI コンテナーを実行するパッケージを UBI リポジトリーから追加するには、以下を行います。
-
UBI init および UBI 標準イメージでは、
dnf
コマンドを使用します。 -
UBI minimal イメージでは、
microdnf
コマンドを使用します。
実行中のコンテナーでソフトウェアパッケージを直接インストールして作業すると、パッケージを一時的に追加します。この変更はコンテナーイメージに保存されません。パッケージの変更を永続化するには、Buildah を使用した Containerfile からのイメージのビルド セクションを参照してください。
6.1. UBI init イメージの使用
コンテナーがホストシステム上で実行されるときに、systemd
サービス (/sbin/init
) によって自動的に起動するように Web サーバー (httpd
) をインストールおよび設定する Containerfile
を使用してコンテナーを構築できます。podman build
コマンドは、1 つ以上の Containerfiles
と指定されたビルドコンテキストディレクトリー内の指示を使用してイメージをビルドします。コンテキストディレクトリーは、アーカイブ、Git リポジトリー、または Containerfile
の URL として指定できます。コンテキストディレクトリーが指定されていない場合、現在の作業ディレクトリーはビルドコンテキストと見なされ、Containerfile
が含まれている必要があります。--file
オプションで Containerfile
を指定することもできます。
前提条件
-
container-tools
メタパッケージがインストールされている。
手順
新しいディレクトリーに以下の内容を含む
Containerfile
を作成します。FROM registry.access.redhat.com/ubi10/ubi-init RUN dnf -y install httpd; dnf clean all; systemctl enable httpd; RUN echo "Successful Web Server Test" > /var/www/html/index.html RUN mkdir /etc/systemd/system/httpd.service.d/; echo -e '[Service]\nRestart=always' > /etc/systemd/system/httpd.service.d/httpd.conf EXPOSE 80 CMD [ "/sbin/init" ]
FROM registry.access.redhat.com/ubi10/ubi-init RUN dnf -y install httpd; dnf clean all; systemctl enable httpd; RUN echo "Successful Web Server Test" > /var/www/html/index.html RUN mkdir /etc/systemd/system/httpd.service.d/; echo -e '[Service]\nRestart=always' > /etc/systemd/system/httpd.service.d/httpd.conf EXPOSE 80 CMD [ "/sbin/init" ]
Copy to Clipboard Copied! Containerfile
は、httpd
パッケージをインストールし、ブート時にhttpd
サービスが開始できるようにし、テストファイル (index.html
) を作成し、Web サーバーをホスト (ポート 80) に公開し、コンテナーの起動時、systemd
init サービス (/sbin/init
) を開始します。コンテナーをビルドします。
podman build --format=docker -t mysysd .
# podman build --format=docker -t mysysd .
Copy to Clipboard Copied! オプション: お使いのシステムで
systemd
を使用してコンテナーを実行し、SELinux を有効にする場合は、container_manage_cgroup
ブール値変数を設定する必要があります。setsebool -P container_manage_cgroup 1
# setsebool -P container_manage_cgroup 1
Copy to Clipboard Copied! mysysd_run
という名前のコンテナーを実行します。podman run -d --name=mysysd_run -p 80:80 mysysd
# podman run -d --name=mysysd_run -p 80:80 mysysd
Copy to Clipboard Copied! mysysd
イメージがmysysd_run
コンテナーをデーモンプロセスとして実行し、コンテナーのポート 80 がホストシステムのポート 80 に公開されます。注記ルートレスモードでは、1024 以上のホストのポート番号を選択する必要があります。以下に例を示します。
podman run -d --name=mysysd -p 8081:80 mysysd
$ podman run -d --name=mysysd -p 8081:80 mysysd
Copy to Clipboard Copied! 1024 未満のポート番号を使用するには、
net.ipv4.ip_unprivileged_port_start
変数を変更する必要があります。sysctl net.ipv4.ip_unprivileged_port_start=80
# sysctl net.ipv4.ip_unprivileged_port_start=80
Copy to Clipboard Copied! コンテナーが実行されていることを確認します。
podman ps
# podman ps a282b0c2ad3d localhost/mysysd:latest /sbin/init 15 seconds ago Up 14 seconds ago 0.0.0.0:80->80/tcp mysysd_run
Copy to Clipboard Copied! Web サーバーをテストします。
curl localhost/index.html
# curl localhost/index.html Successful Web Server Test
Copy to Clipboard Copied!