OCI準拠のコンテナイメージとして提供するオフラインナレッジポータル (RHOKP)

Red Hatの小島です。

オフライン環境でもRed Hatの様々なナレッジを参照できるようにするためのオフラインナレッジポータル(Red Hat Offline Knowledge Portal. 通称RHOKP)の提供が、2025年5月に開始されました。

www.redhat.com

RHOKPによってオフライン環境でナレッジが参照しやすくなるだけでなく、Red Hatの製品ドキュメントやナレッジベースなどに記載されている設定ファイルや実行コマンドのコピペをオフライン環境にあるシステム上でも実行しやすくなっています。オフラインの開発環境などで、ナレッジに記載されている設定ファイルや実行コマンドなどを色々試したいときに便利です。

本記事ではRHOKPの利用方法や、RHOKPのコンテナを例にしてPodmanのQuadletによるsystemdとの連携方法をご紹介します。

Red Hat Offline Knowledge Portal (RHOKP)

RHOKPはRed Hat製品に関する独自のナレッジを安全にオフラインで利用するためのポータルであり、軽量なOpen Container Initiative (OCI)準拠のコンテナイメージとして提供しています。RHOKPはRed Hat製品に関する以下の情報をまとめて提供します。

  • 製品ドキュメント
  • 製品ライフサイクル
  • ナレッジベース
  • 製品のエラータ(更新情報)
  • 公開されたCVEとRed Hat製品への影響度
  • 上記のCVEや影響度を照会するためのAPI情報
  • これらの情報の検索エンジン

有効なRed Hat Satelliteのサブスクリプションを持っているユーザーであれば、無料でRHOKPを利用できるようになっています。Red Hat SatelliteのサブスクリプションはAWS/Azure/Google Cloudなどのパブリッククラウドの従量課金制のRHELユーザーは無料で利用できるため、これら従量課金制のRHELユーザーはRHOKPも無料で利用できるようになっています。Red Hat Satelliteと同様に、RHOKPもRed Hatがサポートを提供します。

Red Hatのナレッジ更新に従って、RHOKPのコンテナイメージも定期的に更新されていきます。RHOKPコンテナイメージの情報(更新日/イメージサイズ/タグ/取得方法など)は、Red Hat Ecosystem Catalog(Red Hatとパートナー企業の様々な製品情報を掲載しているWebページ)から参照できます。

RHOKPの利用方法

RHOKPはOCI準拠のコンテナイメージ(x86_64版とARM64版を提供)であるため、RHELのPodmanやOpenShiftだけでなく、OCI準拠のコンテナランタイム(Dockerなど)でも実行できます。ただし、RHELかOpenShift以外でRHOKPを実行する場合、RHOKPのサポートはサードパーティーソフトウェアに関するRed Hatサポートポリシーに従って提供されますのでご注意ください。

RHOKPの公式ドキュメントは以下にあります。RHOKPのユーザーガイドにシステム要件(CPU2コア以上/メモリ2GB以上を推奨)も記載されています。

docs.redhat.com

上記のユーザーガイドに沿ったRHOKPの利用方法をご紹介したブログがありますので、参考にしてください。RHOKPコンテナをユーザーガイドに沿って実行すると、http://localhost:8080またはhttps://localhost:8443でアクセスできます。

qiita.com

RHOKPは最新のRHEL10に関する製品ドキュメントも提供しています。

PodmanのQuadletによるsystemdとの連携

OCI準拠のRHOKPコンテナは podman rundocker run コマンドなどで実行できますが、Podman v4.4以降に導入されたQuadletを利用すると、systemdでコンテナを実行するためのユニットファイルを簡単に作成できるようになります。RHEL8/RHEL9/RHEL10では、Podman v4.6以降でQuadletが利用できるようになっています。以下のブログでは、Quadletを使ってローカルユーザー権限で実行するコンテナをsystemdで管理するためのユニットファイルを作成/実行する例を紹介しています。

www.redhat.com

このブログを参考にして、RHOKPコンテナ実行をrootユーザー権限で永続化してみます。以下のユニットファイルを作成します。RHOKPのコンテナイメージをrootユーザー権限で取得していない場合は、sudo podman pullコマンドでRHOKPのコンテナイメージを取得しておいて下さい。

sudo podman login registry.redhat.io
sudo podman pull registry.redhat.io/offline-knowledge-portal/rhokp-rhel9:latest


cat <<EOF  > rhokp.container 

[Unit]
Description=RHOKP container

[Container]
Image=registry.redhat.io/offline-knowledge-portal/rhokp-rhel9:latest
PublishPort=8080:8080
PublishPort=8443:8443
Environment=ACCESS_KEY=XXXXX
Pull=never

[Install]
WantedBy=multi-user.target default.target

EOF

[Container]セクションでは以下のオプションを指定しています。それ以外は通常のユニットファイルと同じです。各オプションの詳細はman podman-systemd.unitコマンドで確認できます。

  • Image: 実行するコンテナイメージ。
  • PublishPort: コンテナのポートをホストに公開。podman runコマンド実行時の-p 8080:8080 -p 8443:8443オプション。
  • Environment: コンテナ実行時の環境変数。key: ACCESS_KEY, value: XXXXX を指定。
  • Pull: イメージプルのポリシー。never に設定すると、イメージがローカルホストに無い場合にイメージをpullしない。

このrhokp.containerユニットファイルを、rootユーザー権限で/etc/containers/systemd/ディレクトリにコピーした後に、systemdの設定として読み込ませて起動します。

RHOKPユーザーガイド記載のpodman runコマンドなどで実行しているRHOKPコンテナがある場合、ホストのポート重複を避けるため、sudo systemctl startコマンド実行前にpodman stopコマンドなどでRHOKPコンテナを停止しておいて下さい。

sudo cp rhokp.container /etc/containers/systemd/
sudo systemctl daemon-reload
sudo systemctl start rhokp.service

rhokp.serviceを起動した後にしばらく待ちます。systemctl statusコマンドで下記のように出力されれば、正常にRHOKPコンテナがsystemdのサービスとして実行できていることを確認できます。ここでgeneratedと表示されているのは、このrhokp.serviceのユニットファイルがsystemdによって自動生成されたことを示しています。このように自動生成されたユニットファイルについては自動的に有効化されているため、永続化のためのsystemctl enableコマンドを実行する必要はありません。

systemctl status rhokp.service

● rhokp.service - RHOKP container
     Loaded: loaded (/etc/containers/systemd/rhokp.container; generated)
     Active: active (running) since Tue 2025-06-10 06:09:59 UTC; 9h ago
 Invocation: 9bc4e8e5d9c848a1bbcd4f6f20202322
   Main PID: 1717 (conmon)
      Tasks: 285 (limit: 22851)
     Memory: 2.6G (peak: 3.1G)
        CPU: 26min 39.111s
     CGroup: /system.slice/rhokp.service
             ├─libpod-payload-d65230555cdadc2d959e1fc58c87c868c7d8b2311ce1256d83789020cd296b9f
             │ ├─ 1723 mel
             │ ├─ 4795 httpd -D FOREGROUND
             │ ├─ 4796 /bin/bash /usr/local/bin/run-solr
             │ ├─ 4892 java -server -Xms1g -Xmx1g -XX:+UseG1GC -XX:+PerfDisableSharedMem -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=250 -XX:+UseLargePages -XX:+AlwaysPreTo>
             │ ├─ 4934 /usr/bin/coreutils --coreutils-prog-shebang=cat /usr/bin/cat
             │ ├─ 4935 /usr/bin/coreutils --coreutils-prog-shebang=cat /usr/bin/cat
             │ ├─ 4936 /usr/bin/coreutils --coreutils-prog-shebang=cat /usr/bin/cat
             │ ├─ 4937 /usr/bin/coreutils --coreutils-prog-shebang=cat /usr/bin/cat
             │ ├─ 4939 httpd -D FOREGROUND
             │ ├─ 4941 httpd -D FOREGROUND
             │ ├─ 4943 httpd -D FOREGROUND
             │ ├─ 4961 httpd -D FOREGROUND
             │ ├─ 7017 /bin/sh
             │ ├─ 9609 httpd -D FOREGROUND
             │ └─47392 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 60
             └─runtime
               └─1717 /usr/bin/conmon --api-version 1 -c d65230555cdadc2d959e1fc58c87c868c7d8b2311ce1256d83789020cd296b9f -u d65230555cdadc2d959e1fc58c87c868c7d8b2311ce1256d8378>

systemdによって自動生成されたrhokp.serviceのユニットファイルは、/run/systemd/generator/にあります。

cat /run/systemd/generator/rhokp.service

# Automatically generated by /usr/lib/systemd/system-generators/podman-system-generator
# 
[Unit]
Wants=network-online.target
After=network-online.target
Description=RHOKP container
SourcePath=/etc/containers/systemd/rhokp.container
RequiresMountsFor=%t/containers

[X-Container]
Image=registry.redhat.io/offline-knowledge-portal/rhokp-rhel9:latest
PublishPort=8080:8080
PublishPort=8443:8443
Environment=ACCESS_KEY=XXXXX
Pull=never

[Install]
WantedBy=multi-user.target default.target

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
KillMode=mixed
ExecStop=/usr/bin/podman rm -v -f -i --cidfile=%t/%N.cid
ExecStopPost=-/usr/bin/podman rm -v -f -i --cidfile=%t/%N.cid
Delegate=yes
Type=notify
NotifyAccess=all
SyslogIdentifier=%N
ExecStart=/usr/bin/podman run --name systemd-%N --cidfile=%t/%N.cid --replace --rm --cgroups=split --pull never --sdnotify=conmon -d --publish 8080:8080 --publish 8443:8443 --env ACCESS_KEY=XXXXX registry.redhat.io/offline-knowledge-portal/rhokp-rhel9:latest

RHOKPのコンテナイメージを更新する場合、sudo podman pullコマンドで最新のRHOKPのコンテナイメージを取得して、sudo systemctl restartコマンドでRHOKPコンテナを最新のRHOKPイメージで再起動します。この時、不要になった古いRHOKPのコンテナイメージをsudo podman rmiコマンドで削除できます。

sudo podman login registry.redhat.io
sudo podman pull registry.redhat.io/offline-knowledge-portal/rhokp-rhel9:latest
sudo systemctl restart rhokp.service


sudo podman images

REPOSITORY                                               TAG         IMAGE ID      CREATED       SIZE
registry.redhat.io/offline-knowledge-portal/rhokp-rhel9  latest      daebbdb5e677  32 hours ago  11.1 GB
<none>                                                   <none>      3a22adf3b92f  8 days ago    11.1 GB


sudo podman rmi 3a22adf3b92f

systemdで管理しているPodmanコンテナの状態をWebコンソールで確認したい場合は、RHELの標準機能の1つとして提供されるCockpitを利用できます。Cockpit関連のパッケージをインストールして起動した後に、https://localhost:9090 でWebコンソールにアクセスできます。rootユーザーでログインしたい場合、以下のように/etc/cockpit/disallowed-usersファイルのrootをコメントアウトして下さい。

sudo dnf -y install cockpit cockpit-podman
sudo systemctl enable --now cockpit.socket


cat /etc/cockpit/disallowed-users

# List of users which are not allowed to login to Cockpit
# root

RHELのWebコンソールでは、Podmanで保存/実行したコンテナイメージ、実行中のコンテナのCPU/メモリの利用率(以下の画像の例では、ホストのCPU(2コア)/メモリ(4GB)に対する利用率)、コンテナの環境変数/ログ/コンソールを見ることができます。また、Podmanコンテナを以下の「コンテナーの作成」ボタンから実行できるようにもなっています。

QuadletによるRHOKPコンテナの永続化を解除したい場合、sudo systemctl stopコマンドでRHOKPコンテナを削除した後に、/etc/containers/systemd/rhokp.containerファイルを削除してsudo systemctl daemon-reloadを実行します。すると、systemdが自動生成した/run/systemd/generator/rhokp.serviceファイルが自動削除されて、永続化が解除されます。

sudo systemctl stop rhokp.service
sudo rm -f /etc/containers/systemd/rhokp.container
sudo systemctl daemon-reload


ls /run/systemd/generator/rhokp.service

ls: cannot access '/run/systemd/generator/rhokp.service': No such file or directory


systemctl status rhokp.service

× rhokp.service
     Loaded: not-found (Reason: Unit rhokp.service not found.)
     Active: failed (Result: exit-code) since Tue 2025-06-10 16:45:15 UTC; 8min ago
   Duration: 10h 35min 6.202s
 Invocation: 9bc4e8e5d9c848a1bbcd4f6f20202322
   Main PID: 1717 (code=exited, status=137)
   Mem peak: 3.1G
        CPU: 29min 42.898s

おまけ

2025年6月時点でのRHOKPをPodmanで実行する場合のナレッジのURLと、それらに対応するRed HatのWebページのURLは以下のようになっています。

  • 製品ドキュメント
    • 例: RHEL10のリリースノート
      • RHOKP: https://localhost:8443/documentation/en-us/red_hat_enterprise_linux/10/html-single/10.0_release_notes/index
      • Red HatのWebページ: https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html-single/10.0_release_notes/index
  • ナレッジベース
    • 例: RHELのsosreportの紹介
      • RHOKP: https://localhost:8443/solutions/3592
      • Red HatのWebページ: https://access.redhat.com/solutions/3592
  • 製品ライフサイクル
    • RHOKP: https://localhost:8443/product-life-cycles/update_policies/
    • Red HatのWebページ: https://access.redhat.com/product-life-cycles/update_policies/
  • Red Hat CVEのデータベース
    • 例: CVE-2025-5384
      • RHOKP: https://localhost:8443/security/cve/CVE-2025-5384/
      • Red HatのWebページ: https://access.redhat.com/security/cve/cve-2025-5384/
  • 製品のエラータ
    • 例: RHSA-2025:8374 - Moderate: kernel security update
      • RHOKP: https://localhost:8443/errata/RHSA-2025:8374/
      • Red HatのWebページ: https://access.redhat.com/errata/RHSA-2025:8374/

そのため、RHOKPのナレッジのURLをRed HatのWebページのURLに変換したい場合は、

  • 製品ドキュメントの場合: localhost:8443/documentation/en-usdocs.redhat.com/en/documentationに置換
  • ナレッジベースやCVEなどの場合: localhost:8443access.redhat.comに置換

といった置換作業をする必要があります。こちらも参考にしてください。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。