Red Hat Enterprise Linux (RHEL) のイメージモードは、コンテナ化アプリケーションと同じツール、スキル、パターンを使用して、構築、出荷、実行が容易なオペレーティングシステムを提供します。この記事ではイメージモードの背景となる概念を説明し、Open Container Initiative (OCI) コンテナイメージでオペレーティングシステムをパッケージ化する際に必要となる基本的な概念を説明します。
以下の手順とプロセスでは、カスタムイメージをビルドしてデプロイすることで、実践的な観点から RHEL のイメージモードの背景にある概念をより深く理解できます。
要件:
- すべてのコマンドは、最低でも 10 GB 以上の空き容量のあるディスクを備えた、 サブスクライブした RHEL 9.x システム (ノート PC や仮想マシン (VM) など) で実行します。作成するイメージのサイズと数によっては必要なディスク容量が増える場合があります。
- プロダクションまたは開発者サブスクリプションのいずれかの Red Hat アカウント (無料の開発者サブスクリプションは こちらから利用可能)。
コンテナレジストリ:この例では、レジストリコンテンツのパブリッシュ先として quay.io を使用しますが、別のホスト型レジストリサービスを利用したり、レジストリをローカルで実行したりすることもできます。quay.io アカウントは、 こちらですばやく簡単に作成できます。
開始する
まず、システムがサブスクリプションの対象であり、RHEL コンテンツを取得できることを確認します。
$ sudo subscription-manager register次に、Podman をインストールします。利用可能な最新バージョンを使用することをお勧めしますが、v4.* 以降ならどれでも機能します。Docker やコンテナ・パイプライン・ツールなど、他のコンテナツールもプロダクション環境で動作できます。この例では Podman を使用して概念を説明しますが、環境によっては他のツールのほうが適している場合があります。
$ sudo dnf -y install podman今度は registry.redhat.io で認証します。まず、 https://access.redhat.com/terms-based-registry にアクセスし、[New service account] をクリックします。ここで新しいエントリーの名前をクリックし、「docker login」の手順をコピーしてターミナルに貼り付けます。その際、docker コマンドを podman に置き換えます。より詳細な情報が必要な場合は、すべての手順を こちらで確認できます。イメージビルダーを使用してコンテナイメージをディスクイメージに変換するには、昇格した権限で podman を実行する必要があります。sudo ありとなしとで、レジストリに認証します。
$ podman login registry.redhat.io
#repeat with sudo
$ sudo podman login registry.redhat.iobootc コンテナイメージは、技術的に次の 2 つの重要な点でアプリケーションコンテナと異なります。
- bootc イメージはコンテナ内で OSTree を使用する
- bootc イメージには、物理マシンまたは仮想マシンをブートするためのカーネルと十分な他のパッケージが含まれている
アプリケーション・コンテナ・ベースイメージには通常、ハードウェア管理とは関係のない最小限のパッケージセットが含まれています。また、Red Hat Universal Base Image (UBI) とは異なり、RHEL bootc イメージは RHEL と同じライセンス条件で配布されます。
rhel-bootc ベースイメージをプルしましょう。
$ podman pull registry.redhat.io/rhel9/rhel-bootc:9.4Containerfile を作成する
では、Containerfile の例を見てみましょう。これらは、Dockerfile と呼ばれることがあります。シンプルに、まず lamp スタックをインストールします。以下のテキストを Containerfile
という名前の新しいファイルに保存します。
FROM registry.redhat.io/rhel9/rhel-bootc:9.4
#install the lamp components
RUN dnf module enable -y php:8.2 nginx:1.22 && dnf install -y httpd mariadb mariadb-server php-fpm php-mysqlnd && dnf clean all
#start the services automatically on boot
RUN systemctl enable httpd mariadb php-fpm
#create an awe inspiring home page!
RUN echo '<h1 style="text-align:center;">Welcome to image mode for RHEL</h1> <?php phpinfo(); ?>' >> /var/www/html/index.phpこれで、ポート 80 で Web サーバーを実行し、データベースと php も利用できる単純なオペレーティングシステムを記述しました。コンテナイメージをビルドしましょう。
イメージをビルドする
$ podman build -f Containerfile -t quay.io/[my_account]/lamp-bootc:latest注:
-t はイメージにタグ付けします。この例では、レジストリとして quay.io が使用されていることを想定しています。使用しているレジストリに応じて調整してください。
-f は、Podman に Containerfile を使用するように指示します。
イメージをテストする
イメージが出来上がったので、簡単にテストしましょう。このイメージはコンテナなので高速で実行されます。入力ミスがあった場合、エラーが出力されるのでわかります。わかりやすくするために、短い名前 (lamp) を付けます。
$ podman run -d --rm --name lamp -p 8080:80 quay.io/[my_account]/lamp-bootc:latest /sbin/initコンテナが起動します。今はログインについて心配する必要はありません。ブラウザーを開き、 http://[your_ip_address]:8080 で提供されている Web ページを表示できることを確認します。ページが読み込まれない場合は、ファイアウォールルールを再確認してください。ローカルシステムを使用している場合、ループバックアドレスが正常に機能します。この例では、systemd を起動しています。ただし多くのテストシナリオでは、単にアプリケーションを起動するほうが効率的です。コンテナを使用したオペレーティングシステム・イメージの定義で最も重要なことの 1 つは、テストと検証の迅速な実行です。
上記で設定した名前を podman exec で使用して、実行中のコンテナインスタンスにシェルでアクセスできます。
$ podman exec -it lamp /bin/bash同じ名前を使用してインスタンスを停止します。
$ podman stop lampレジストリへプッシュする
次に、quay.io にログインして認証し、イメージをレジストリにプッシュして、 パブリックにアクセスできるようリポジトリを設定します。
$ podman login quay.io
$ podman push quay.io/[my_account]/lamp-bootc:latestこれで、デプロイできる階層化イメージが作成されました。これをホストにインストールする方法はいくつかあります。RHEL のインストーラーを使用してベアメタルシステムをキックスタート (USB や PXE などを介してデプロイ) するか、イメージビルダーを使用してコンテナイメージをブート可能なイメージに変換することができます。このコンテナを「インストール」すると、以後はアップデートが公開されるとコンテナレジストリから直接適用されます。そのため、インストールプロセスを行うのは 1 回だけです。
Qcow2 ディスクイメージを使用して KVM/QEMU を介してデプロイする
この例では、イメージビルダーを使用して、コンテナイメージを qcow2 形式のディスクに変換します。この例では、イメージがパブリックにアクセス可能なリポジトリにあることを前提とします。プライベートリポジトリにあるイメージの利用方法については、 イメージビルダーのドキュメントを参照してください。qcow2 以外のイメージ形式も利用できます。
最初に config.json ファイルを作成します。このファイルにより、作成されるディスクを設定できます。この例では、作成するユーザーを config.json に含めます。自分の SSH キーとパスワードをこの例に貼り付けてください。
{
"blueprint": {
"customizations": {
"user": [
{
"name": "cloud-user",
"password": "changeme",
"key": "ssh-rsa AAAAB3Nz..........",
"groups": [
"wheel"
]
}
]
}
}
}次に、 config.json を lamp コンテナとともにイメージビルダーに渡します。
$ sudo podman run --rm -it --privileged \
-v .:/output \
-v $(pwd)/config.json:/config.json \
--pull newer \
registry.redhat.io/rhel9/bootc-image-builder:9.4 \
--type qcow2 \
--config /config.json \
quay.io/[my_account]/lamp-bootc:latestイメージの準備ができたら、libvirt (または直接 qemu) を使用してイメージを実行できます。
virt-install \
--name lamp-bootc \
--memory 4096 \
--vcpus 2 \
--disk qcow2/disk.qcow2 \
--import \
--os-variant rhel9.4VM が実行されている状態で、ブラウザーを使用して http://[your_instance_ip_address] を表示することで、サイトが実行されていることを確認できます。
AMI ディスクイメージを使用して AWS にデプロイする
この例では、先に作成した lamp Containerfile で cloud-init が使用できることを確認する必要があります。ここでコンテナワークフローが役に立ち、このユースケースに対応する階層化イメージを簡単に作成できます。ここでは階層化ビルドを紹介しますが、そのほうが簡単であれば、元の Containerfile を編集して cloud-init を組み込んでも構いません。
FROM quay.io/[my_account]/lamp-bootc:latest
#install cloud-init for AWS
RUN dnf install -y cloud-init && dnf clean allイメージをビルドしてプッシュします。
$ podman build -f Containerfile -t quay.io/[my_account]/lamp-bootc-aws:latest
$ podman push quay.io/[my_account]/lamp-bootc-aws:latestcloud-init を利用してユーザーと SSH キーを挿入します。これにより、上記で説明した KVM の例の config.json の手順をスキップできます (cloud-init 設定の作成は、このドキュメントの範囲外です)。cloud-init を使用することで、ハードコーディングされた認証情報がイメージに含まれることを防ぎ、セキュリティポスチャが強化されます。次に、イメージビルダーを実行して AMI を作成します。
$ sudo podman run --rm -it --privileged \
--pull=newer \
--security-opt label=type:unconfined_t \
-v $XDG_RUNTIME_DIR/containers/auth.json:/run/containers/0/auth.json \
-v $HOME/.aws:/root/.aws:ro \
--env AWS_PROFILE=default \
registry.redhat.io/rhel9/bootc-image-builder:9.4:latest \
--type ami \
--aws-ami-name lamp-bootc-aws \
--aws-bucket bootc-bucket \
--aws-region us-east-1 \
quay.io/[my_account]/lamp-cloud-init-bootc:latestAWS のプロパティを設定する追加のオプションもあります。 詳細はこちらのリンクをご覧ください。
公開プロセスが正常に完了したら、イメージを起動し、ブラウザーで http://[your_instance_ip_address] を表示できることを確認しましょう。
キックスタートを使用したベアメタルへのインストール
ここまで見てきたように、コンテナをインストールする方法は複数あります。このセクションでは、キックスタートの使用について説明します。キックスタートは、ISO、PXE、または USB ドライブを使用するベアメタルデプロイで極めて一般的に使用されます。このガイドでは詳細を説明しないため、キックスタートの概念にある程度精通していることを前提としています。以下の例に、ユーザー、パスワード、SSH キーに関連する詳細情報を挿入します。その他のオプションの追加はサポートされていますが、ここではインスタンスをコンテナイメージに置き換えるので、このワークフローでは %packages セクションを使用できないことに注意してください。 このサイトから、お使いのアーキテクチャに対応する 9.4 ブート ISO をダウンロードしてください。
text
network --bootproto=dhcp --device=link --activate
# Basic partitioning
clearpart --all --initlabel --disklabel=gpt
reqpart --add-boot
part / --grow --fstype xfs
# Here's where we reference the container image to install - notice the kickstart
# has no `%packages` section! What's being installed here is a container image.
ostreecontainer --url quay.io/[my_account]/lamp-bootc:latest
firewall --disabled
services --enabled=sshd
# optionally add a user
user --name=cloud-user --groups=wheel --plaintext --password=changemme
sshkey --username cloud-user "ssh-ed25519 AAAAC3Nza....."
# if desired, inject a SSH key for root
rootpw --iscrypted locked
sshkey --username root "ssh-ed25519 AAAAC3Nza....." #paste your ssh key here
rebootこの設定ファイルを Web サーバーにコピーし、パスワードと SSH キーを更新して、インストールメディアを使用して物理システムまたは仮想システムをブートし、以下をカーネル引数に追加します。
inst.ks=http://path_to_my_kickstart
Ctrl-X キーを押して、このオプションを使用してブートします。
HTTP サーバーがすぐに利用できない場合は、ほとんどの Python インストールで利用できる http.server モジュールを使用できます。キックスタートファイルが保存されているディレクトリで、次のコマンドを実行します。
$ python -m http.serverHTTP サーバーでキックスタートファイルをホストしない別のアプローチもあります。その場合は、キックスタートをインストーラー ISO に挿入します。lorax パッケージには mksiso というユーティリティが含まれており、このファイルを ISO に埋め込むことができます。これは USB ドライブから直接ブートする場合に便利で、ブートメニューを編集しなくてすみます。 mksiso --ks /PATH/TO/KICKSTART /PATH/TO/ISO /PATH/TO/NEW-ISO を実行します。
アップデートをプッシュする
このストーリーの重要な点は、インストールやデプロイが 1 回限りのタスクであるということです。このモデルの価値の多くは、イメージをレジストリにプッシュすることで変更を加えることができる「Day 2」で実現されます。 自動更新はデフォルトでオンになっています。もちろん、メンテナンス期間を簡単に設定できますし、完全に無効にすることもできます。これを試すには、Containerfile に変更を加えてビルド & プッシュの手順を繰り返し、レジストリで新しいイメージを使用できるようにします。 systemd ユニットのデフォルトのタイマーは、稼働開始から 1 時間後に実行されますが、それよりも前に「bootc upgrade」を実行してアップデートを取得することもできます。
次のステップ
RHEL のイメージモードを使用した簡単な例を紹介しました。ご自身のユースケースをいくつか確認し、オペレーティングシステムのデプロイの管理やバージョン管理にコンテナツールを使用することで得られる可能性と運用効率について検討することをお勧めします。当社の bootc のサンプルリポジトリをご覧ください。多数のプラットフォームや有用なシナリオを実現するのに役立ちます。また、さらに詳しい情報を確認するには、 ドキュメントの全文を確認することをお勧めします。
執筆者紹介
Ben Breard is a Senior Principal Product Manager at Red Hat, focusing on Red Hat Enterprise Linux and Edge Offerings.
類似検索
File encryption and decryption made easy with GPG
Key considerations for 2026 planning: Insights from IDC
Becoming a Coder | Command Line Heroes
The CTO And The Vision | Compiler: Re:Role
チャンネル別に見る
自動化
テクノロジー、チームおよび環境に関する IT 自動化の最新情報
AI (人工知能)
お客様が AI ワークロードをどこでも自由に実行することを可能にするプラットフォームについてのアップデート
オープン・ハイブリッドクラウド
ハイブリッドクラウドで柔軟に未来を築く方法をご確認ください。
セキュリティ
環境やテクノロジー全体に及ぶリスクを軽減する方法に関する最新情報
エッジコンピューティング
エッジでの運用を単純化するプラットフォームのアップデート
インフラストラクチャ
世界有数のエンタープライズ向け Linux プラットフォームの最新情報
アプリケーション
アプリケーションの最も困難な課題に対する Red Hat ソリューションの詳細
仮想化
オンプレミスまたは複数クラウドでのワークロードに対応するエンタープライズ仮想化の将来についてご覧ください