フィードを購読する

Red Hat Enterprise Linux (RHEL) のイメージモードは、コンテナ化アプリケーションと同じツール、スキル、パターンを使用して、構築、出荷、実行が容易なオペレーティングシステムを提供します。この記事ではイメージモードの背景となる概念を説明し、Open Container Initiative (OCI) コンテナイメージでオペレーティングシステムをパッケージ化する際に必要となる基本的な概念を説明します。

以下の手順とプロセスでは、カスタムイメージをビルドしてデプロイすることで、実践的な観点から RHEL のイメージモードの背景にある概念をより深く理解できます。

要件:

  1. すべてのコマンドは、最低でも 10 GB 以上の空き容量のあるディスクを備えた、 サブスクライブした RHEL 9.x システム (ノート PC や仮想マシン (VM) など) で実行します。作成するイメージのサイズと数によっては必要なディスク容量が増える場合があります。
  2. プロダクションまたは開発者サブスクリプションのいずれかの 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.io

bootc コンテナイメージは、技術的に次の 2 つの重要な点でアプリケーションコンテナと異なります。

  • bootc イメージはコンテナ内で OSTree を使用する
  • bootc イメージには、物理マシンまたは仮想マシンをブートするためのカーネルと十分な他のパッケージが含まれている

アプリケーション・コンテナ・ベースイメージには通常、ハードウェア管理とは関係のない最小限のパッケージセットが含まれています。また、Red Hat Universal Base Image (UBI) とは異なり、RHEL bootc イメージは RHEL と同じライセンス条件で配布されます。

 rhel-bootc ベースイメージをプルしましょう。

$ podman pull registry.redhat.io/rhel9/rhel-bootc:9.4

Containerfile を作成する

では、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.4

VM が実行されている状態で、ブラウザーを使用して  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:latest

cloud-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:latest

AWS のプロパティを設定する追加のオプションもあります。 詳細はこちらのリンクをご覧ください。

公開プロセスが正常に完了したら、イメージを起動し、ブラウザーで 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.server

HTTP サーバーでキックスタートファイルをホストしない別のアプローチもあります。その場合は、キックスタートをインストーラー 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.

Read full bio
UI_Icon-Red_Hat-Close-A-Black-RGB

チャンネル別に見る

automation icon

自動化

テクノロジー、チームおよび環境に関する IT 自動化の最新情報

AI icon

AI (人工知能)

お客様が AI ワークロードをどこでも自由に実行することを可能にするプラットフォームについてのアップデート

open hybrid cloud icon

オープン・ハイブリッドクラウド

ハイブリッドクラウドで柔軟に未来を築く方法をご確認ください。

security icon

セキュリティ

環境やテクノロジー全体に及ぶリスクを軽減する方法に関する最新情報

edge icon

エッジコンピューティング

エッジでの運用を単純化するプラットフォームのアップデート

Infrastructure icon

インフラストラクチャ

世界有数のエンタープライズ向け Linux プラットフォームの最新情報

application development icon

アプリケーション

アプリケーションの最も困難な課題に対する Red Hat ソリューションの詳細

Original series icon

オリジナル番組

エンタープライズ向けテクノロジーのメーカーやリーダーによるストーリー