第7章 UBI コンテナーへのソフトウェアの追加
Red Hat リポジトリーから追加のソフトウェアをインストールすることで、Universal Base Images (UBI) の機能を強化します。実行中のコンテナーにパッケージを追加するには、イメージタイプに応じて、dnf または microdnf を使用します。
Red Hat は、RHEL コンテンツの一部から UBI をビルドします。UBI は、UBI でインストールするために自由に利用可能な RHEL パッケージのサブセットも提供します。RPM パッケージと更新を含む DNF リポジトリーを使用すると、実行中のコンテナーにソフトウェアを追加または更新できます。UBI は、たとえば Python、Perl、Node.js、Ruby などの、事前にビルドされた言語ランタイムコンテナーイメージを提供します。
UBI コンテナーを実行するパッケージを UBI リポジトリーから追加するには、以下を行います。
-
UBI init および UBI 標準イメージでは、
dnfコマンドを使用します。 -
UBI minimal イメージでは、
microdnfコマンドを使用します。
7.1. UBI init イメージの使用 リンクのコピーリンクがクリップボードにコピーされました!
UBI init イメージを使用して、システムサービスを実行するコンテナーをビルドします。これにより、Web サーバーなどのアプリケーションを、コンテナー内で systemd を介して自動的に起動するように設定できます。
コンテナーがホストシステム上で実行されるときに、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" ]Containerfileは、httpdパッケージをインストールし、ブート時にhttpdサービスが開始できるようにし、テストファイル (index.html) を作成し、Web サーバーをホスト (ポート 80) に公開し、コンテナーの起動時、systemdinit サービス (/sbin/init) を開始します。コンテナーをビルドします。
# podman build --format=docker -t mysysd .オプション: お使いのシステムで
systemdを使用してコンテナーを実行し、SELinux を有効にする場合は、container_manage_cgroupブール値変数を設定する必要があります。# setsebool -P container_manage_cgroup 1mysysd_runという名前のコンテナーを実行します。# podman run -d --name=mysysd_run -p 80:80 mysysdmysysdイメージがmysysd_runコンテナーをデーモンプロセスとして実行し、コンテナーのポート 80 がホストシステムのポート 80 に公開されます。注記ルートレスモードでは、1024 以上のホストのポート番号を選択する必要があります。以下に例を示します。
$ podman run -d --name=mysysd -p 8081:80 mysysd1024 未満のポート番号を使用するには、
net.ipv4.ip_unprivileged_port_start変数を変更する必要があります。# sysctl net.ipv4.ip_unprivileged_port_start=80コンテナーが実行されていることを確認します。
# podman ps a282b0c2ad3d localhost/mysysd:latest /sbin/init 15 seconds ago Up 14 seconds ago 0.0.0.0:80->80/tcp mysysd_runWeb サーバーをテストします。
# curl localhost/index.html Successful Web Server Test