コンテナーの構築、実行、および管理


Red Hat Enterprise Linux 10

Red Hat Enterprise Linux で Podman、Buildah、Skopeo を使用する

概要

Red Hat Enterprise Linux (RHEL) は、コンテナーイメージを使用するためのコマンドラインツールを多数提供しています。Podman を使用して Pod およびコンテナーイメージを管理できます。コンテナーイメージを構築、更新、および管理するには、Buildah を使用できます。リモートリポジトリーでイメージをコピーして検査するには、Skopeo を使用します。コマンドラインツールに加えて、コンテナー、イメージ、Pod、レジストリーを管理するためのグラフィカルインターフェイスである Podman Desktop を使用することもできます。

Red Hat ドキュメントへのフィードバック (英語のみ)

Red Hat は質の高いドキュメントを提供することに尽力しており、皆様からのフィードバックを大切にしています。改善にご協力いただくため、Red Hat Jira トラッキングシステムを通じてご提案やエラー報告をお寄せください。

手順

  1. Jira の Web サイトにログインします。

    アカウントがない場合、アカウント作成オプションを選択します。

  2. 上部のナビゲーションバーで Create をクリックします。
  3. Summary フィールドにわかりやすいタイトルを入力します。
  4. Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
  5. ウィンドウ下部の Create をクリックします。

第1章 コンテナーの紹介

Linux コンテナーは、軽量なアプリケーション分離と、イメージベースのデプロイメント方法の柔軟性を兼ね備えています。RHEL のコアテクノロジーを使用してセキュリティーリスクを軽減し、エンタープライズ品質の環境を提供します。

RHEL は、以下のようなテクノロジーを使用して Linux コンテナーを実装しています。

  • リソース管理用のコントロールグループ (cgroup)
  • プロセス分離用の namespace
  • SELinux (セキュリティー用)
  • セキュアなマルチテナンシー

このような技術は、セキュリティーエクスプロイトの可能性を軽減し、エンタープライズ品質のコンテナーを生成および実行する環境を提供します。

Red Hat OpenShift は、強力なコマンドラインと Web UI ツールを提供し、Pod と呼ばれる単位でコンテナーを構築、管理、および実行します。Red Hat では、OpenShift 外で個々のコンテナーおよびコンテナーイメージをビルドして管理できます。このガイドでは、Red Hat Enterprise Linux システムで直接実行されるタスクを実行するためのツールを説明します。

他のコンテナーツールの実装とは異なり、ここで説明するツールはモノリシック Docker のコンテナーエンジンと、docker コマンドを中心としたものではありません。代わりに、Red Hat はコンテナーエンジンがなくても動作できる一連のコマンドラインツールを提供します。これには、以下が含まれます。

  • podman - Pod およびコンテナーイメージの直接管理 (runstopstartpsattachexec など)
  • buildah - コンテナーイメージの構築、プッシュ、および署名
  • skopeo - イメージのコピー、検証、削除、および署名
  • crun - ルートレスコンテナーの柔軟性、制御、セキュリティーを向上するために設定可能なオプションのランタイム。

これらのツールに加えて、コンテナー管理用の GUI ベースのアプリケーションである Podman Desktop も使用できます。Podman Desktop は Podman 上に構築されており、コンテナー化されたアプリケーションを視覚的に簡単に作成、管理、実行できます。

これは、このツールが、Docker が生成して管理するのと同じ Linux コンテナーや、その他の OCI 互換コンテナーエンジンの管理に使用する Open Container Initiative (OCI) と互換性があるためです。ただし、シングルノードのユースケースでは、Red Hat Enterprise Linux で直接実行することが特に適しています。

マルチノードコンテナープラットフォームについては、CRI-O Container Engine の使用 を参照してください。

1.1. コンテナーのコマンドラインツールに関する情報

Red Hat OpenShift は、Pod と呼ばれる単位でコンテナーを構築、管理、実行するための、強力なコマンドラインと Web UI ツールを提供します。OpenShift 外で個々のコンテナーおよびコンテナーイメージをビルドして管理できます。

以下のツールを使用して、これらのタスクを RHEL システム上で直接実行できます。Red Hat はコンテナーエンジンがなくても動作できる一連のコマンドラインツールを提供します。これには、以下が含まれます。

  • podman - Pod およびコンテナーイメージの直接管理 (runstopstartpsattachexec など)
  • buildah - コンテナーイメージの構築、プッシュ、および署名
  • skopeo - イメージのコピー、検証、削除、および署名
  • runc: podman および buildah へのコンテナーの実行機能と構築機能の提供
  • crun - ルートレスコンテナーの柔軟性、制御、セキュリティーを向上するために設定可能なオプションのランタイム。

これらのツールに加えて、コンテナー管理用の GUI ベースのアプリケーションである Podman Desktop も使用できます。Podman Desktop は Podman 上に構築されており、コンテナー化されたアプリケーションを視覚的に簡単に作成、管理、実行できます。

これは、このツールが、Docker が生成して管理するのと同じ Linux コンテナーや、その他の OCI 互換コンテナーエンジンの管理に使用する Open Container Initiative (OCI) と互換性があるためです。ただし、シングルノードのユースケースでは、Red Hat Enterprise Linux で直接実行することが特に適しています。

1.2. Podman、Podman Desktop、Buildah、Skopeo の特徴

Podman、Podman Desktop、Skopeo、Buildah ツールは、Docker コマンド機能を置き換えるために開発されました。このシナリオの各ツールはより軽量になり、機能のサブセットに焦点を当てています。

Podman、Podman Desktop、Skopeo、Buildah ツールの主な利点は次のとおりです。

  • ルートレスモードでの実行 - ルートレスコンテナーは、特権を追加しなくても実行されるため、はるかにセキュアです。
  • デーモンの必要なし - コンテナーが実行されていない場合、Podman は実行されないので、これらのツールではアイドル時のリソース要件がはるかに少なくなります。または、Docker はデーモンを常時実行します。
  • ネイティブ systemd 統合 - Podman では systemd ユニットファイルを作成し、コンテナーをシステムサービスとして実行できます。

Podman、Podman Desktop、Skopeo、Buildah の特徴は次のとおりです。

  • Podman、Buildah、および CRI-O のコンテナーエンジンはすべて、Docker の保存場所 /var/lib/docker をデフォルトで使用する代わりに、同じバックエンドストアディレクトリー /var/lib/containers を使用します。
  • Podman、Buildah、および CRI-O は、同じストレージディレクトリーを共有しているため、互いのコンテナーと対話することはできません。このツールはイメージを共有できます。
  • プログラムで Podman と対話するには、ルートおよびルートレス環境の両方で動作する Podman v2.0 RESTful API を使用してください。
  • Podman Desktop は、Podman エンジン上でアプリケーションワークロードを実行するためのシンプルで直感的なインターフェイスを提供します。

1.3. Docker を使用せずにコンテナーを実行する

Podman を使用することで、コンテナー化されたアプリケーションを RHEL 上で実行できます。これにより、中央デーモンへの依存関係が排除され、ルートレス操作によりシステムセキュリティーが向上します。

podman-docker パッケージでは、Docker 形式のイメージを管理するための互換性のある環境が提供され、同時にシステムフットプリントの削減と分離性の向上も確保されます。

Red Hat では、RHEL 8 から Docker コンテナーエンジンと、docker コマンドが削除されました。RHEL で Docker を引き続き使用する場合は、異なるアップストリームプロジェクトから Docker を取得できますが、RHEL 10 ではサポート対象外になります。

  • podman-docker パッケージをインストールできます。docker コマンドを実行するたびに、実際には podman コマンドが実行されます。
  • Podman は Docker Socket API にも対応しているため、podman-docker パッケージは /var/run/docker.sock/var/run/podman/podman.sock の間でリンクを設定します。そのため、Docker デーモンを必要とせずに、docker-pydocker-compose ツールを使用して Docker API コマンドをそのまま実行できます。
  • docker コマンドなどの podman コマンドは、Containerfile または Dockerfile からコンテナーイメージを構築できます。Containerfile および Dockerfile 内で使用できる利用可能なコマンドは同じです。
  • podman を使用する場合、docker コマンドで使用できる network、node、secret、service、stack、swarm などのオプションの一部は使用できません。Podman はプラグインをサポートしていないため、プラグインオプションも使用できません。Podman でコンテナーの名前を変更する場合は、rename オプションではなく、rm を実行してから作成する必要があります。Podman では、コンテナーやイメージのオプションを使用する代わりに、サブコマンドを直接実行します。

1.4. RHEL でのコンテナーデプロイメントでサポートされているアーキテクチャー

RHEL でサポート対象のハードウェアアーキテクチャー上にコンテナー化されたアプリケーションをデプロイすることで、多様な環境間でのワークロードの互換性を確保できます。適切なプラットフォームを把握することで、コンテナーイメージのパフォーマンスと移植性を一貫して維持することができます。

Red Hat は、次のコンピューターアーキテクチャー向けにコンテナーイメージとコンテナー関連ソフトウェアを提供しています: * AMD64 および Intel 64 (ベースイメージとレイヤーイメージ。32 ビットアーキテクチャーはサポート対象外) * PowerPC 8 および 9 64 ビット (ベースイメージとほとんどのレイヤーイメージ) * 64 ビット IBM Z (ベースイメージとほとんどのレイヤーイメージ) * ARM 64 ビット (ベースイメージのみ)

1.5. コンテナーツールのインストール

container-tools メタパッケージをインストールすると、Podman、Buildah、Skopeo、CRIU、Udica、および必要なすべてのライブラリーを取得できます。これにより、RHEL 上でコンテナーを操作するための完全な環境が提供されます。

注記

RHEL 10 で安定版ストリームは使用できません。Podman、Buildah、Skopeo などへの安定したアクセスを受けるには、RHEL EUS サブスクリプションを使用します。

手順

  1. RHEL をインストールします。
  2. RHEL の登録: ユーザー名とパスワードを入力します。ユーザー名とパスワードは、Red Hat カスタマーポータルのログイン認証情報と同じです。

    # subscription-manager register
    Registering to: subscription.rhsm.redhat.com:443/subscription
    Username: <username>
    Password: <password>
  3. container-tools メタパッケージをインストールします。

    # dnf install container-tools

    必要に応じて、podmanbuildahskopeo を個別にインストールすることもできます。

  4. オプション: podman-docker パッケージをインストールします。

    # dnf install podman-docker

    podman-docker パッケージは、Docker コマンドラインインターフェイスと docker-api を、同等の Podman コマンドに置き換えます。

1.6. Podman Desktop のインストール

Podman Desktop をインストールすると、Pod やコンテナーを含む開発環境を可視化および管理できます。この GUI ツールは Podman エンジン上で動作し、イメージのビルドや Kubernetes へのデプロイといった作業を単純化します。

Podman Desktop は、開発タスクの実行や開発環境 (実行中の Pod やコンテナーの数など) の可視化に役立ちます。このツールは、macOS、Windows、Linux の 3 つの異なるオペレーティングシステムで実行できます。Podman Desktop は、Podman エンジン上でワークロードを実行するため、コンテナー化されたアプリケーションと対話するための Podman ネイティブ機能を提供します。開発者は、以下を実行できます。

  • コンテナーまたは Pod を作成して管理する
  • コンテナーイメージを管理する
  • Kind、Lima、Minikube、OpenShift を使用してコンテナーまたは Pod を Kubernetes にデプロイする
  • Docker の互換性を管理して、Docker ワークロードを Podman エンジンで実行する
  • 拡張機能を使用してツールを統合する

インストールするには、RHEL 10 マシンでサブスクリプションマネージャーパッケージを使用します。

前提条件

  • RHEL 10 マシンがある。
  • subscription-manager に登録した。

手順

  1. コマンドラインを開き、RHEL 拡張機能リポジトリーを有効にします。

    # subscription-manager repos --enable rhel-10-for-$(arch)-extensions-rpms
  2. プロンプトが表示されたらパスワードを入力します。
  3. Podman Desktop をインストールします。

    # dnf install podman-desktop
  4. インストールされたサイズを確認するには、y と入力します。
  5. GPG キーをインポートしてインストールを完了するには、y と入力します。

検証

  1. ホーム画面の上部にある検索ボックスに Podman Desktop と入力し、Podman Desktop アプリケーションをクリックして開きます。
  2. 指示に従って、アプリケーションの簡単なオンボーディングプロセスを完了します。
注記

Podman は RHEL サブスクリプションに含まれており、アプリケーションによって自動的に検出され、実行されます。

1.7. ルートレスコンテナーに関する特別な考慮事項

非 root ユーザーとしてコンテナーを実行する場合の設定上の違いと制限事項を理解する必要があります。ルートレスコンテナーは異なるストレージパスを使用するため、設定なしでは特定のシステム機能を変更したり、特権ポートにバインドしたりできません。

root 以外のユーザーでコンテナーを実行する場合は、考慮事項が複数あります。

  • ホストコンテナーストレージへのパスは、root ユーザー (/var/lib/containers/storage) と root 以外のユーザー ($HOME/.local/share/containers/storage) との間では異なります。
  • ルートレスコンテナーを実行するユーザーには、ホストシステムでユーザー ID およびグループ ID の範囲として実行する特別な権限が付与されます。ただし、ホストのオペレーティングシステムに対する root 権限はありません。
  • /etc/subuid/etc/subgid を手動で変更した場合は、新しい変更を適用させるために podman system migrate コマンドを実行する必要があります。
  • ルートレスコンテナー環境を設定する必要がある場合は、ホームディレクトリーに設定ファイルを作成します ($HOME/.config/containers)。設定ファイルには、storage.conf (ストレージ設定用) および containers.conf (さまざまなコンテナー設定用) が含まれます。また、registries.conf ファイルを作成し、Podman を使用してイメージをプル、検索、または実行する時に利用可能なコンテナーレジストリーを識別することもできます。
  • root 権限なしで変更できないシステム機能もいくつかあります。たとえば、コンテナー内で SYS_TIME 機能を設定し、ネットワークタイムサービス (ntpd) を実行してシステムクロックを変更できません。root としてコンテナーを実行し、ルートレスコンテナー環境を省略して root ユーザーの環境を使用する必要があります。以下に例を示します。

    # podman run -d --cap-add SYS_TIME docker.io/ntpd/ntpd

    この例では、ntpd がコンテナー内だけでなく、システム全体の時間を調整できることに注意してください。

  • ルートレスコンテナーは、1024 未満のポート番号にアクセスできません。たとえば、ルートレスコンテナーの namespace 内では、コンテナーの httpd サービスからポート 80 を公開するサービスを開始しますが、この namespace の外部からはアクセスできません。

    $ podman run -d httpd

    ただし、そのポートをホストシステムに公開するには、コンテナーには root ユーザーのコンテナー環境を使用するルート権限が必要です。

    # podman run -d -p 80:80 httpd
  • ユーザーがポート 80 にバインドできるようにするには、次のコマンドを実行します。

    # echo 80 > /proc/sys/net/ipv4/ip_unprivileged_port_start

    ワークステーションの管理者は、ユーザーが 1024 番未満のポートでサービスを公開することを許可できますが、そのセキュリティー上の影響を理解しておく必要があります。たとえば、一般ユーザーが公式ポートである 80 番で Web サーバーを実行する可能性があります。その結果、外部ユーザーは、そのサーバーが管理者によって設定されたものだと誤解する可能性が生じます。これは、テスト用のワークステーションで問題ありませんが、ネットワークにアクセス可能な開発サーバーでは適切ではなく、実稼働サーバーでは実行しないでください。

1.8. 高度な Podman 設定のためのモジュールの使用

Podman モジュールを使用して、事前に定義された設定セットをロードできます。Podman モジュールは、Tom's Obvious Minimal Language (TOML) 形式の containers.conf ファイルです。

このモジュールは、次のディレクトリーまたはそのサブディレクトリーにあります。

  • rootless ユーザーの場合: $HOME/.config/containers/containers.conf.modules
  • root ユーザーの場合: /etc/containers/containers.conf.modules、または /usr/share/containers/containers.conf.modules

podman --module <your_module_name> コマンドを使用してオンデマンドでモジュールをロードし、システム設定ファイルおよびユーザー設定ファイルをオーバーライドできます。モジュールを使用する際の注意点:

  • --module オプションを使用して、モジュールを複数回指定できます。
  • <your_module_name> が絶対パスの場合、設定ファイルは直接ロードされます。
  • 相対パスは、前述の 3 つのモジュールディレクトリーを基準にして解決されます。
  • $HOME 内のモジュールは、/etc/ および /usr/share/ ディレクトリー内のモジュールをオーバーライドします。

詳細は、システム上の containers.conf(5) man ページを参照してください。

第2章 コンテナーイメージの種類

RHEL 上のワークロードに最適なデプロイメントストラテジーを決定するには、標準およびマルチアーキテクチャーのイメージ形式を特定します。イメージタイプを選択することで、Podman などのツールを使用して、多様なハードウェアプラットフォーム間でのアプリケーションの互換性と最適な配信を確保できます。これらのコンテナーを使用することで、ユーザーは、信頼性、パフォーマンス、ライフサイクルにおけるメリットを享受できます。

コンテナーイメージには、以下の 2 つのタイプがあります。

  • Red Hat Enterprise Linux Base Images (RHEL ベースイメージ)
  • Red Hat Universal Base Images (UBI イメージ)

どちらのタイプのコンテナーイメージも Red Hat Enterprise Linux の一部から構築されます。これらのコンテナーを使用することで、ユーザーは、信頼性、セキュリティー、パフォーマンス、ライフサイクルを最大限に活用できます。

2 種類のコンテナーイメージの主な違いは、UBI イメージの場合、Red Hat 以外のプラットフォームを含む様々なプラットフォーム間で、コンテナー化されたアプリケーションの共有とデプロイメントが可能になる点です。これらはクラウドネイティブアプリケーションや Web アプリケーションの基盤として機能します。

2.1. RHEL コンテナーイメージの一般的な特徴

RHEL ベースイメージと UBI イメージの共通特性を確認します。これらのイメージは、サポート対象であり、カタログ化および更新され、アプリケーションのセキュアな基盤を提供します。

一般的には、RHEL コンテナーイメージの特徴は以下のとおりです。

  • サポート対象 - コンテナー化されたアプリケーションでの使用は、Red Hat によりサポートされています。Red Hat Enterprise Linux で、セキュアで、テストされ、認定されたものと同じソフトウェアパッケージが含まれています。
  • カタログ対象: 各イメージの説明、技術的な詳細、ヘルスインデックスと共に、Red Hat Container Catalog に記載されています。
  • 更新済み: 明確に定義された更新スケジュールで提供されるため、最新のソフトウェアに更新できます。
  • 追跡対象 - Red Hat 製品エラータにより追跡され、各更新に追加された変更を理解するのに役立ちます。
  • 再利用対象: コンテナーイメージは、一度実稼働環境にダウンロードしてキャッシュする必要があります。各コンテナーイメージは、基盤として含まれるすべてのコンテナーで再利用できます。

この特徴は、RHEL ベースイメージと UBI イメージの両方に当てはまります。

2.2. UBI イメージの特徴

RHEL ソフトウェアをベースとした再配布可能なコンテナーイメージをビルドするには、Universal Base Images (UBI) を使用します。UBI は、さまざまなアプリケーションのニーズに合わせて、マイクロイメージや標準イメージなど、多様なイメージタイプを提供します。

UBI イメージの特徴は以下のとおりです。

  • RHEL コンテンツのサブセットから構築 - Red Hat Universal Base イメージは、通常の Red Hat Enterprise Linux コンテンツのサブセットから構築されます。
  • 再配布可能: UBI イメージは、Red Hat のお客様、パートナー、ISV など向けに標準化できます。UBI イメージを使用すると、自由に共有およびデプロイが可能な公式の Red Hat ソフトウェアにコンテナーイメージを構築できます。
  • 4 つのベースイメージをセットで提供する: micro、minimal、standard、init
  • 事前にビルドされた言語ランタイムコンテナーイメージのセットを提供する: Application Stream をベースとするランタイムイメージは、python、perl、PHP、dotnet、Node.js、ruby など、標準でサポートされているランタイムの恩恵を受けることができるアプリケーションのための基盤を提供します。
  • 関連のある DNF リポジトリーセットを提供する: DNF リポジトリーには、RPM パッケージと更新が含まれており、アプリケーションの依存関係を追加して、UBI コンテナーイメージを再ビルドできます。

    • ubi-10-baseos リポジトリーは、コンテナーに追加できる RHEL パッケージの再配布可能なサブセットを保持します。
    • ubi-10-appstream リポジトリーには、UBI イメージに追加できるアプリケーションストリームパッケージが含まれています。これらのパッケージは、特定のランタイムを必要とするアプリケーションで使用する環境を標準化するのに役立ちます。
    • UBI RPM の追加 - 事前設定された UBI リポジトリーから UBI イメージに RPM パッケージを追加できます。切断した環境でこのような機能を使用するには、その機能を使用する UBI コンテンツ配信ネットワーク (https://cdn-ubi.redhat.com) を許可リストに追加する必要があります。
  • ライセンス: Red Hat Universal Base Image User Licensing Agreement に従い、UBI イメージを自由に使用および再配布できます。
注記

レイヤー化されたイメージはすべて UBI イメージに基づいています。どの UBI イメージがイメージベースであるかを確認するには、Red Hat Container Catalog で Containerfile を表示し、UBI イメージに必要なすべてのコンテンツが含まれていることを確認します。

2.3. UBI standard イメージの概要

UBI standard イメージは、RHEL 上でコンテナー化されたアプリケーションのための高信頼および高性能な基盤として利用できます。これらの自由に再配布できるイメージを使用することで、RHEL エコシステムの安定性と豊富なパッケージライブラリーの恩恵を受けた、セキュアなワークロードを構築および共有できます。

標準イメージ (名称 ubi) は、RHEL で実行されるアプリケーション用に設計されています。Red Hat Universal Base Image (UBI) 標準イメージの主な特徴は以下のとおりです。

  • init system - systemd サービスの管理に必要な systemd 初期化システムのすべての機能は、標準のベースイメージで利用できます。この init システムを使用すると、Web サーバー (httpd) や FTP サーバー (vsftpd) などのサービスを自動的に起動するように事前設定された RPM パッケージをインストールできます。
  • dnf: ソフトウェアの追加や更新が可能な、無料の dnf リポジトリーにアクセスできます。dnf コマンドの標準セット (dnfdnf-config-managerdnfdownloader など) を使用できます。
  • utilities: ユーティリティーには tardmidecodegzipgetfacl などの各種 ACL コマンド、dmsetup などの各種デバイスマッパーコマンドのほか、ここに記載されていないその他のユーティリティーが含まれます。

2.4. UBI init イメージの概要

UBI init イメージ (名称 ubi-init) には、systemd 初期化システムが含まれているため、Web サーバーやファイルサーバーなどの systemd サービスを実行するイメージを構築するのに役立ちます。init イメージには、最小イメージよりも多く、標準イメージよりも少ないコンテンツが含まれます。

ubi10-init イメージは ubi10 イメージの上にビルドされるため、その内容はほぼ同じです。ただし、重要な相違点がいくつかあります。

  • ubi10-init:

    • CMD は /sbin/init に設定され、デフォルトで systemd Init サービスを開始します。
    • ps およびプロセス関連のコマンド (procps-ng パッケージ) が含まれます。
    • また、SIGRTMIN+3StopSignal として設定しています。これは、ubi10-initsystemd が通常の終了信号 (SIGTERM および SIGKILL) を無視しているためですが、SIGRTMIN+3 を受け取った場合は終了します。
  • ubi10:

    • CMD は /bin/bash に設定されます。
    • ps およびプロセス関連のコマンド (procps-ng パッケージ) は含まれません。
    • 通常の終了シグナルを無視しません (SIGTERM および SIGKILL)。

2.5. UBI minimal イメージの概要

ubi-minimal という名前の UBI minimal イメージは、縮小された事前にインストールされたコンテンツセットおよびパッケージマネージャー (microdnf) を提供します。これにより、イメージに含まれる依存関係を縮小しながら、Containerfile を使用できます。

UBI minimal イメージの主な機能には、以下が含まれます。

  • サイズが小さい - 最小イメージは、ディスク上では約 92M、圧縮時は 32M です。これにより、サイズが、標準イメージの半分に満たなくなります。
  • ソフトウェアのインストール (microdnf): 最小限のイメージには、ソフトウェアリポジトリーや RPM ソフトウェアパッケージを使用するための、完全に開発された dnf 機能の代わりに、microdnf ユーティリティーが含まれています。microdnf を使用すると、リポジトリーの有効化/無効化、パッケージの削除/更新、パッケージのインストール後のキャッシュのクリアなどを行うことができます。
  • RHEL パッケージをベースとする - 最小イメージには、通常の RHEL ソフトウェアの RPM パッケージから機能がいくつか削除されたものです。minimal イメージには、systemd や System V init、Python ランタイム環境、および一部のシェルユーティリティーなど、初期化およびサービス管理システムが含まれません。オーバーヘッドの量を可能な限り最小限に抑えながら、RHEL リポジトリーを使用してイメージを構築できます。
  • microdnf のモジュールはサポート対象 - microdnf コマンドで使用されるモジュールにより、利用可能な場合は、同じソフトウェアの複数のバージョンをインストールできます。microdnf module enablemicrodnf module disablemicrodnf module reset を使用して、モジュールストリームを有効化、無効化、リセットできます。

    • たとえば、UBI 最小コンテナー内で nodejs:14 モジュールストリームを有効にするには、次のコマンドを実行します。

      # microdnf module enable nodejs:14
      Downloading metadata...
      ...
      Enabling module streams:
          nodejs:14
      
      Running transaction test...

      Red Hat は UBI の最新バージョンのみをサポートし、ドットリリースの過去バージョンはサポートしません。

2.6. UBI マイクロイメージの概要

ubi-micro は、取得可能な最小の UBI イメージで、パッケージマネージャーと、通常はコンテナーイメージに含まれるすべての依存関係を除外することで得られます。これにより、ubi-micro イメージをベースとするコンテナーイメージの攻撃対象領域が最小限に抑えられます。

他のアプリケーションで UBI standard、minimal、または init を使用している場合でも、最小アプリケーションに ubi-micro を使用することもできます。Linux ディストリビューションパッケージのないコンテナーイメージは Distroless コンテナーイメージと呼ばれます。

第3章 コンテナーレジストリーの使用

コンテナーイメージとアーティファクトを保存および取得するには、コンテナーイメージレジストリーを設定します。システム全体の /etc/containers/registries.conf ファイルは、Podman や Buildah などのレジストリーツールがどのレジストリーを使用するか管理します。

3.1. コンテナーレジストリー

コンテナーレジストリーは、コンテナーイメージとコンテナーベースのアプリケーションアーティファクトを保存するためのリポジトリーまたはリポジトリーのコレクションです。

Red Hat が提供するレジストリーは以下のとおりです。

  • registry.redhat.io (認証が必要)
  • registry.access.redhat.com (認証なし)
  • registry.connect.redhat.com (Red Hat Partner Connect プログラムのイメージを格納)

リモートレジストリー (Red Hat の独自のコンテナーレジストリーなど) からコンテナーイメージを取得して、ローカルシステムに追加するには、podman pull コマンドを使用します。

# podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

ここで、<registry>[:<port>]/[<namespace>/]<name>:<tag> はコンテナーイメージの名前です。

同じイメージにバージョンが複数ある場合は、イメージ名を明示的に指定するタグを追加します。デフォルトでは、Podman は :latest タグを使用します (例: ubi10/ubi:latest)。一部のレジストリーでは、<namespace> も使用して、異なるユーザーまたは組織によって所有される同じ <name> のイメージを区別します。以下に例を示します。

Expand
namespace(<namespace>/<name>) の例

organization

redhat/kubernetesgoogle/kubernetes

login (ユーザー名)

alice/applicationbob/application

role

devel/databasetest/databaseprod/database

注記

レジストリー、namespace、イメージ名、タグを含む完全修飾イメージ名を使用します。短縮名を使用する場合は、なりすましの固有リスクが常にあります。不明なユーザーや匿名ユーザーが任意の名前でアカウントを作成できないように、信頼できるレジストリー (つまりレジストリー) を追加します。

3.2. コンテナーレジストリーの設定

Podman がイメージを検索および取得する方法を制御するには、RHEL 上でコンテナーレジストリーを設定します。信頼済みソースと検索優先順位を定義することで、インフラストラクチャー全体で予測可能なアプリケーションデプロイメントが実現します。

podman info --format コマンドを使用して、コンテナーレジストリーを表示できます。

$ podman info -f json | jq '.registries["search"]'
[
  "registry.access.redhat.com",
  "registry.redhat.io",
  "docker.io"
]
注記

podman info コマンドは、Podman 4.0.0 以降で使用できます。

registries.conf 設定ファイルでコンテナーレジストリーのリストを編集できます。root ユーザーとして、/etc/containers/registries.conf ファイルを編集し、デフォルトのシステム全体の検索設定を変更します。ユーザーとして、$HOME/.config/containers/registries.conf ファイルを作成し、システム全体の設定をオーバライドします。

unqualified-search-registries = ["registry.access.redhat.com", "registry.redhat.io", "docker.io"]
short-name-mode = "enforcing"

デフォルトでは、podman pull および podman search コマンドは、unqualified-search-registries のリストに記載のレジストリーから、その順序でコンテナーイメージを検索します。

ローカルコンテナーレジストリーの設定

TLS 検証なしでローカルコンテナーレジストリーを設定できます。TLS 検証を無効にするには、2 つの方法があります。まず、Podman で --tls-verify=false オプションを使用できます。次に、registries.conf ファイルに insecure=true を設定できます。

[[registry]]
location="localhost:5000"
insecure=true
レジストリー、namespace、またはイメージのブロック

ローカルシステムがアクセスできないレジストリーを定義できます。blocked=true を設定して、特定のレジストリーをブロックできます。

[[registry]]
location = "registry.example.org"
blocked = true

プレフィックスを prefix="registry.example.org/<namespace>" に設定して、namespace をブロックすることもできます。たとえば、podman pull registry. example.org/example/image:latest コマンドを使用するイメージのプルは、指定したプレフィックスが一致するためブロックされます。

[[registry]]
location = "registry.example.org"
prefix="registry.example.org/_<namespace>_"
blocked = true
注記

prefix は任意です。デフォルト値は location の値と同じです。

prefix="registry.example.org/namespace/image" を設定して、特定のイメージをブロックできます。

[[registry]]
location = "registry.example.org"
prefix="registry.example.org/_<namespace>_/image"
blocked = true
レジストリーのミラーリング

元のレジストリーにアクセスできない場合は、レジストリーミラーを設定できます。たとえば、機密レベルの高い環境で作業するため、インターネットに接続することはできません。指定された順序でアクセスされる複数のミラーを指定できます。たとえば、podman pull registry.example.com/myimage:latest コマンドを実行すると、まず mirror-1.com が試行され、次に mirror-2.com が試行されます。

[[registry]]
location="registry.example.com"
[[registry.mirror]]
location="mirror-1.com"
[[registry.mirror]]
location="mirror-2.com"

詳細は、システム上の podman-pull(1) および podman-info(1) man ページを参照してください。

3.3. コンテナーイメージの検索

podman search コマンドを使用して、コンテナーレジストリー全体にわたってイメージを検索できます。また、Red Hat コンテナーカタログ でイメージを検索することもできます。カタログには、イメージの説明、コンテンツ、ヘルスインデックスなど情報が含まれます。

注記

podman search コマンドは、イメージの存在を判断する信頼できる方法ではありません。v1 および v2 Docker ディストリビューション API の podman search 動作は、各レジストリーの実装に固有のものです。レジストリーによっては、検索機能をまったくサポートしていない場合もあります。検索用語を使用しない検索は、v2 API を実装するレジストリーでのみ機能します。docker search コマンドにも、同じことが言えます。

quay.io レジストリーで postgresql-10 イメージを検索するには、手順に従います。

前提条件

  • container-tools メタパッケージがインストールされている。
  • レジストリーが設定されている。

手順

  1. レジストリーに対して認証します。

    # podman login quay.io
  2. イメージを検索します。

    • 特定のレジストリーで特定のイメージを検索するには、以下を入力します。

      # podman search quay.io/postgresql-10
      INDEX       NAME                                           DESCRIPTION           STARS   OFFICIAL   AUTOMATED
      redhat.io   registry.redhat.io/rhel10/postgresql-10         This container image ...  0
      redhat.io   registry.redhat.io/rhscl/postgresql-10-rhel7   PostgreSQL is an  ...     0
    • または、特定のレジストリーで提供されるすべてのイメージを表示するには、以下を入力します。

      # podman search quay.io/*
    • すべてのレジストリー全体でイメージ名を検索するには、以下を入力します。

      # podman search postgresql-10

      完全な説明を表示するには、--no-trunc オプションをコマンドに渡します。詳細は、システム上の podman-search(1) man ページを参照してください。

3.4. 短縮名のエイリアスの設定

registries.conf で短縮名エイリアスを設定し、ubi10 などのショートネームを完全修飾イメージ名にマッピングします。これにより、イメージソースの制御が可能になり、短縮名に関連するなりすましのリスクを防ぐために役立ちます。

イメージは、必ず完全修飾名でプルします。しかし、一般的には短縮名でプルされています。たとえば、registry.access.redhat.com/ubi10:latest の代わりに ubi10 を使用できます。

registries.conf ファイルにより、短縮名のエイリアスを指定でき、管理者はイメージをプルする場所を完全に制御できます。エイリアスは、テーブル内で "name" = "value" の形式で指定されます。

エイリアスのリストは、/etc/containers/registries.conf.d ディレクトリーで確認できます。Red Hat は、このディレクトリーに一連のエイリアスを提供しています。たとえば、podman pull ubi10 は、適切なイメージ、つまり registry.access.redhat.com/ubi10:latest に対して、直接解決されます。

以下に例を示します。

unqualified-search-registries=["registry.fedoraproject.org", "quay.io"]

[aliases]
"fedora"="registry.fedoraproject.org/fedora"

短縮名モードは以下のようになります。

  • enforcing: イメージのプル中に一致するエイリアスが見つからない場合、Podman はユーザーが非修飾レジストリーのいずれかを選択するよう求めます。選択したイメージを正常に取得すると、Podman は、$HOME/.cache/containers/short-name-aliases.conf ファイル (ルートレスユーザー) または /var/cache/containers/short-name-aliases.conf (root ユーザー) に新しい短縮名のエイリアスを自動的に記録します。ユーザーを要求できない場合 (stdin や stdout など) が TTY ではない場合は、Podman は失敗します。short-name-aliases.conf ファイルは、両方が同じエイリアスを指定する場合、registries.conf ファイルよりも優先されることに注意してください。
  • permissive: enforcing モードと似ていますが、ユーザーにプロンプトが表示されないと Podman は失敗しません。代わりに、Podman は指定された順序で修飾されていないすべてのレジストリーを検索します。エイリアスは記録されないことに注意してください。
  • disabled: すべての非修飾検索レジストリーが指定の順序で試行され、エイリアスは記録されません。

3.5. policy.json ファイルを使用したコンテナー署名の検証

Red Hat Enterprise Linux (RHEL) は、コンテナーイメージの署名を必須とし、検証するように設定できます。これにより、プルするイメージが信頼できるソースからのものであり、改ざんされていないことを確認できます。policy.json ファイルを修正することで、この信頼ポリシーを管理できます。これにより、Podman、Buildah、Skopeo などのツールに対して、有効なコンテナイメージ署名を強制できます。

システム全体の設定を行うには、/etc/containers/policy.json ファイルを変更します。ルートレスユーザーの場合は、これらのルールを $HOME/.config/containers/policy.json ファイルに適用できます。

transportregistry、および namespace によるスコープポリシー

policy.json ファイルは、検証ルールを階層的に構造化し、特定のイメージにどのルールが適用されるかを決定します。以下の要素を使用することで、これらのポリシーの範囲を指定できます。

  • Default: デフォルト配列は、具体的に定義されたどのスコープにもイメージが一致しない場合に適用される、フォールバックポリシーを指定します。
  • Transport: トランスポートオブジェクト内でカスタムポリシーを定義できます。コンテナーレジストリーの場合、docker トランスポートの下でカスタムポリシーを定義できます。
  • Registry および Namespace: transport セクションを使用して、さまざまな組織レベルで信頼ポリシーを設定できます。ポリシーの範囲は、以下のいずれかの方法で設定できます。

    • ポリシーのスコープをレジストリー全体に設定します。たとえば、単一の企業向けに専用化されたレジストリーの場合は、<registry> のように指定します。
    • ポリシーを特定の名前空間またはリポジトリーに絞り込みます。たとえば、パブリックレジストリーの場合は、<registry>/<namespace> のようになります。
署名証明書の指定

レジストリーまたは名前空間のブロック内で署名要件を定義することで、特定のスコープ内にあるイメージに対して、対応する鍵や証明書による検証を義務付けることができます。以下のキーと値のペアを設定できます。

  • type: signedBy: コンテナーツールに有効な署名が必要であることを指示します。
  • keyType: 使用するキーの形式を指定します。たとえば、GPGKeys などです。
  • keyPath: 検証に使用されるローカル公開鍵または証明書ファイルへの絶対パスを指定します。たとえば、testdata/sequoia-key.pgp などです。

デフォルトルールを設定して、すべてを受け入れることもできます。ただし、docker トランスポート内で、特定のスコープ付き名前空間 localhost:5003/simple-sq-signed-centos を制限して、有効な署名を厳密に要求できます。以下に例を示します。

{
  "default": [
    {
      "type": "insecureAcceptAnything"
    }
  ],
  "transports": {
    "docker": {
      "localhost:5003/simple-sq-signed-centos": [
        {
          "type": "signedBy",
          "keyType": "GPGKeys",
          "keyPath": "testdata/sequoia-key.pgp"
        }
      ]
    }
  }
}
注記

設定がアクティブになったら、podman pull <registry>/<namespace>/<image> コマンドを実行する必要があります。Podman は、policy.json ファイルで設定したとおりに、署名の存在を自動的に強制します。設定済みのレジストリーから、署名されていない、または誤ったキーで署名されたイメージをプルしようとすると、コマンドは失敗します。

第4章 コンテナーイメージを使用する

Podman ツールを使用してコンテナーイメージを管理します。このツールを使用して、イメージのプル、イメージ署名の検査、タグ付け、保存、読み込み、再配布、および定義を行うことができます。

4.1. レジストリーからのイメージの取得 (プル)

podman pull コマンドを使用して、リモートレジストリーからローカルシステムにコンテナーイメージをダウンロードします。これにより、イメージをコンテナーの作成と実行に使用できるようになります。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. registry.redhat.io レジストリーにログインします。

    $ podman login registry.redhat.io
    Username: <username>
    Password: <password>
    Login Succeeded!
  2. registry.redhat.io/ubi10/ubi コンテナーイメージをプルします。

    $ podman pull registry.redhat.io/ubi10/ubi

検証

  • ローカルシステムにプルしたすべてのイメージをリスト表示します。

    $ podman images
    REPOSITORY                           TAG     IMAGE ID      CREATED      SIZE
    registry.redhat.io/ubi10/ubi          latest  3269c37eae33  7 weeks ago  208 MB

    詳細は、システム上の podman-pull(1) man ページを参照してください。

4.2. 短縮名のエイリアスを使用したコンテナーイメージのプル

Red Hat Enterprise Linux でデプロイメントコマンドを簡素化するには、短縮名のエイリアスを使用してコンテナーイメージをプルします。完全修飾されたイメージパスの代わりに短縮名を使用することで、作業時間を短縮できるだけでなく、信頼できるレジストリーから確実にアーティファクトを取得できるようになります。セキュアな短縮名を使用して、ローカルシステムにイメージを取得できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • fedora コンテナーイメージをプルします。

    $ podman pull fedora
    Resolved "fedora" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
    Trying to pull registry.fedoraproject.org/fedora:latest…
    ...
    Storing signatures
    ...

    エイリアスが検出され、registry.fedoraproject.org/fedora イメージがセキュアにプルされます。unqualified-search-registries のリストは、fedora イメージ名を解決するためには使用されません。

  • nginx コンテナーイメージをプルします。

    $ podman pull nginx
    ? Please select an image:
    registry.access.redhat.com/nginx:latest
    registry.redhat.io/nginx:latest
      ▸ docker.io/library/nginx:latest
    ✔ docker.io/library/nginx:latest
    Trying to pull docker.io/library/nginx:latest…
    ...
    Storing signatures
    ...

    一致するエイリアスが見つからない場合は、unqualified-search-registries リストのいずれかを選択するように求められます。選択したイメージが正常にプルされると、新しい短縮名のエイリアスがローカルに記録されます。それ以外の場合は、エラーが発生します。

検証

  • ローカルシステムにプルしたすべてのイメージをリスト表示します。

    $ podman images
    REPOSITORY                                   TAG     IMAGE ID      CREATED        SIZE
    registry.fedoraproject.org/fedora            latest  28317703decd  12 days ago    184 MB
    docker.io/library/nginx                      latest  08b152afcfae  13 days ago    137 MB

4.3. イメージのリスト表示

Podman を使用して、ローカルに保存されているコンテナーイメージをリストし、バージョンの可用性を確認したり、システムストレージを管理したりできます。イメージリストを確認することで、ワークロードに適した基盤を選択できるだけでなく、ローカル環境の可視性も維持できます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • プルしたイメージがローカルシステムで利用できる。

手順

  • ローカルストレージ内のイメージをすべてリスト表示します。

    $ podman images
    REPOSITORY                           TAG     IMAGE ID      CREATED      SIZE
    registry.access.redhat.com/ubi10/ubi  latest  3269c37eae33  6 weeks ago  208 MB

    詳細は、システム上の podman-images(1) man ページを参照してください。

4.4. ローカルイメージの検証

ローカルシステムにイメージをプルして実行したら、podman inspect コマンドを使用してイメージを調査できます。たとえば、イメージの内容を理解して、イメージ内のソフトウェアを確認します。

前提条件

  • container-tools メタパッケージがインストールされている。
  • プルしたイメージがローカルシステムで利用できる。

手順

  • registry.redhat.io/ubi10/ubi イメージを検査します。

    $ podman inspect registry.redhat.io/ubi10/ubi
    …
     "Cmd": [
            "/bin/bash"
        ],
        "Labels": {
            "architecture": "x86_64",
            "build-date": "2020-12-10T01:59:40.343735",
            "com.redhat.build-host": "cpt-1002.osbs.prod.upshift.rdu2.redhat.com",
            "com.redhat.component": "ubi10-container",
            "com.redhat.license_terms": "https://www.redhat.com/...,
        "description": "The Universal Base Image is ...
        }
    ...

    podman inspect コマンドは、名前または ID で識別されるコンテナーおよびイメージに関する情報を表示します。"Cmd" キーは、コンテナー内で実行するデフォルトのコマンドを指定します。このコマンドは、podman run コマンドに引数として指定すると、オーバライドできます。

    この ubi10/ubi コンテナーは、podman run での起動時に、他の引数を指定していない場合には、bash シェルを実行します。"Entrypoint" キーが設定された場合は、"Cmd" 値の代わりに、その値を使用できます。また、Entrypoint コマンドの引数として "Cmd" の値が使用されます。

4.5. リモートイメージの検証

skopeo inspect コマンドを使用して、システムにイメージをプルする前に、リモートコンテナーレジストリーからイメージに関する情報を表示します。これにより、デフォルトコマンド、環境変数、アーキテクチャーなどの詳細情報が明らかになります。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • registry.redhat.io/ubi10/ubi-init イメージを確認します。

    # skopeo inspect docker://registry.redhat.io/ubi10/ubi-init
    {
        "Name": "registry.redhat.io/ubi10/ubi10-init",
        "Digest": "sha256:c6d1e50ab...",
        "RepoTags": [
            ...
            "latest"
        ],
       "Created": "2020-12-10T07:16:37.250312Z",
        "DockerVersion": "1.13.1",
        "Labels": {
            "architecture": "x86_64",
            "build-date": "2020-12-10T07:16:11.378348",
            "com.redhat.build-host": "cpt-1007.osbs.prod.upshift.rdu2.redhat.com",
            "com.redhat.component": "ubi10-init-container",
            "com.redhat.license_terms": "https://www.redhat.com/en/about/red-hat-end-user-license-agreements#UBI",
            "description": "The Universal Base Image Init is designed to run an init system as PID 1 for running multi-services inside a container
            ...
        }
    }

    詳細は、システム上の skopeo-inspect(1) man ページを参照してください。

4.6. コンテナーイメージのコピー

skopeo copy コマンドを使用して、コンテナーイメージをあるレジストリーから別のレジストリーにコピーできます。たとえば、外部レジストリーのイメージを使用して内部リポジトリーに反映させたり、2 つの異なる場所のイメージレジストリーを同期したりできます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • skopeo コンテナーイメージを docker://quay.io から docker://registry.example.com にコピーします。

    $ skopeo copy docker://quay.io/skopeo/stable:latest docker://registry.example.com/skopeo:latest

    詳細は、システム上の skopeo-copy(1) man ページを参照してください。

4.7. ローカルディレクトリーへのイメージレイヤーのコピー

Skopeo を使用してコンテナーイメージのレイヤーをローカルディレクトリーにコピーし、イメージの内容を監査したり、ファイルシステムの変更をトラブルシューティングしたりできます。レイヤーをローカルに保存することで、コンテナーをデプロイすることなく、イメージ構造を検査したり、セキュリティーコンプライアンスを検証したりできるようになります。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. /var/lib/images/nginx ディレクトリーを作成します。

    $ mkdir -p /var/lib/images/nginx
  2. docker://docker.io/nginx:latest イメージのレイヤーを、新たに作成したディレクトリーにコピーします。

    $ skopeo copy docker://docker.io/nginx:latest dir:/var/lib/images/nginx

検証

  • /var/lib/images/nginx ディレクトリーの内容を表示します。

    $ ls /var/lib/images/nginx
    08b11a3d692c1a2e15ae840f2c15c18308dcb079aa5320e15d46b62015c0f6f3
    ...
    4fcb23e29ba19bf305d0d4b35412625fea51e82292ec7312f9be724cb6e31ffd  manifest.json
    version

    詳細は、システム上の skopeo-copy(1) man ページを参照してください。

4.8. イメージのタグ付け

podman tag コマンドを使用して、ローカルイメージに追加の名前やタグを割り当てます。タグ付けは、イメージを整理し、特定のレジストリーにプッシュするための準備に役立ちます。

この名前は、<registryhost>/<username>/<name>:<tag> のように複数の部分で構成されます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • プルしたイメージがローカルシステムで利用できる。

手順

  1. すべてのイメージをリスト表示します。

    $ podman images
    REPOSITORY                           TAG     IMAGE ID      CREATED      SIZE
    registry.redhat.io/ubi10/ubi          latest  3269c37eae33  7 weeks ago  208 MB
  2. 以下のいずれかのオプションを使用して、myubi 名を registry.redhat.io/ubi10/ubi イメージに割り当てます。

    • イメージ名:

      $ podman tag registry.redhat.io/ubi10/ubi myubi
    • イメージ ID:

      $ podman tag 3269c37eae33 myubi

      どちらのコマンドも、同じ結果になります。

  3. すべてのイメージをリスト表示します。

    $ podman images
    REPOSITORY                           TAG     IMAGE ID      CREATED       SIZE
    registry.redhat.io/ubi10/ubi          latest  3269c37eae33  2 months ago  208 MB
    localhost/myubi                      latest  3269c37eae33  2 months ago  208 MB

    デフォルトのタグがいずれのイメージでも latest であることに注意してください。すべてのイメージ名が単一のイメージ ID 3269c37eae33 に割り当てられていることを確認できます。

  4. 以下のいずれかを使用して、10 タグを registry.redhat.io/ubi10/ubi イメージに追加します。

    • イメージ名:

      $ podman tag registry.redhat.io/ubi10/ubi myubi:10
    • イメージ ID:

      $ podman tag 3269c37eae33 myubi:10

      どちらのコマンドも、同じ結果になります。

検証

  1. すべてのイメージをリスト表示します。

    $ podman images
    REPOSITORY                           TAG     IMAGE ID      CREATED       SIZE
    registry.redhat.io/ubi10/ubi          latest  3269c37eae33  2 months ago  208 MB
    localhost/myubi                      latest  3269c37eae33  2 months ago  208 MB
    localhost/myubi                      10     3269c37eae33  2 months ago  208 MB

    デフォルトのタグがいずれのイメージでも latest であることに注意してください。すべてのイメージ名が単一のイメージ ID 3269c37eae33 に割り当てられていることを確認できます。

  2. registry.redhat.io/ubi10/ubi イメージにタグ付けした後に、コンテナーを実行するオプションが 3 つあります。

    • ID (3269c37eae33)
    • 名前 (localhost/myubi:latest)
    • 名前 (localhost/myubi:10)

      詳細は、システム上の podman-tag(1) man ページを参照してください。

4.9. マルチアーキテクチャーイメージのビルド

RHEL 上で Podman を使用してマルチアーキテクチャーコンテナーイメージをビルドすることで、多様なハードウェアプラットフォーム間でアプリケーションの動作の整合性を保つことができます。環境ごとに個別のビルドを必要とせずに、単一のイメージマニフェストで複数のアーキテクチャーをサポートできます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. サポートする必要がある各アーキテクチャーの Containerfiles を作成します。
  2. 各アーキテクチャー用のイメージをビルドします。以下に例を示します。

    $ podman build --platform linux/arm64,linux/amd64 --manifest <registry>/<image> .
    • --platform linux/arm64,linux/amd64 オプションは、コンテナーイメージのビルド対象のターゲットプラットフォームを指定します。
    • --manifest <registry>/<image> オプションは、指定の名前 (<registry>/<image>) を含むマニフェストリストを作成し、新しくビルドされたイメージをそのリストに追加します。マニフェストリストは、それぞれ異なるアーキテクチャーをターゲットとするイメージマニフェストのコレクションです。
  3. マニフェストリストをレジストリーにプッシュします。

    $ podman manifest push <registry>/<image>

    このマニフェストリストは、マルチアーキテクチャーコンテナーをプルする際の唯一のエントリーポイントとして機能します。

    これにより、単一のマニフェストリストに基づいて、プラットフォームに適したコンテナーイメージをプルできるようになります。

    また、podman manifest remove <manifest_list> <digest_ID> コマンドを使用すると、マニフェストリストから項目を削除できます。<digest_ID> は、コンテナーイメージの SHA-256 チェックサムです。例: podman manifest remove <registry>/<image> sha256:cb8a924afdf…​

検証

  • マニフェストリストを表示します。

    $ podman manifest inspect <registry>/<image>

    詳細は、システム上の podman-build(1) および podman-manifest(1) man ページを参照してください。

4.10. イメージの保存および読み込み

podman save コマンドを使用して、イメージをコンテナーアーカイブに保存します。別のコンテナー環境に後で復元したり、別のユーザーに送信することもできます。

--format オプションを使用して、アーカイブ形式を指定できます。サポート対象の形式は以下のとおりです。

  • docker-archive
  • oci-archive
  • oci-dir (oci マニフェストタイプのあるディレクトリー)
  • docker-archive (v2s2 マニフェストタイプのディレクトリー)

デフォルトの形式は、docker-archive 形式です。

podman load コマンドを使用して、コンテナーイメージアーカイブからコンテナーストレージにイメージを読み込みます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • プルしたイメージがローカルシステムで利用できる。

手順

  1. registry.redhat.io/rhel10/support-tools イメージを tarball として保存します。

    • デフォルトの docker-archive 形式の場合:

      $ podman save -o mysupport-tools.tar registry.redhat.io/rhel10/support-tools:latest
    • oci-archive 形式で、--format オプションを使用します。

      $ podman save -o mysupport-tools-oci.tar --format=oci-archive registry.redhat.io/rhel10/support-tools

      mysupport-tools.tar および mysupport-tools-oci.tar アーカイブはカレントディレクトリーに保存されます。次の手順は、mysupport-tools.tar tarball を使用して実行されます。

  2. mysupport-tools.tar のファイルタイプを確認します。

    $ file mysupport-tools.tar
    mysupport-tools.tar: POSIX tar archive
  3. mysupport-tools.tar から registry.redhat.io/rhel10/support-tools:latest イメージをロードするには、以下を実行します。

    $ podman load -i mysupport-tools.tar
    ...
    Loaded image(s): registry.redhat.io/rhel10/support-tools:latest

    詳細は、システム上の podman-save(1) および podman-load(1) man ページを参照してください。

4.11. UBI イメージの再配布

podman push コマンドを使用してカスタム UBI ベースのイメージをレジストリーにプッシュすることで、それらを共有できます。これにより、他のユーザーは修正されたイメージをダウンロードして使用できます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • プルしたイメージがローカルシステムで利用できる。

手順

  1. 必要に応じて、ubi イメージに別の名前を追加します。

    # podman tag registry.redhat.io/ubi10/ubi registry.example.com:5000/ubi10/ubi
  2. registry.example.com:5000/ubi10/ubi イメージをローカルストレージからレジストリーにプッシュします。

    # podman push registry.example.com:5000/ubi10/ubi
    重要

    このイメージを使用する方法には制限がいくつかありますが、その方法を参照する方法にもいくつかの制限があります。たとえば、Red Hat Container Certification または Red Hat OpenShift Operator Certification の Red Hat Partner Connect Program で認定されていなければ、Red Hat の認定イメージまたは Red Hat のサポートイメージとはみなされません。

4.12. イメージの削除

podman rmi コマンドを使用して、使用されていないコンテナーイメージをローカルストレージから削除します。古いイメージを削除すると、システム上のディスク容量が解放されます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. ローカルシステムにある全イメージのリストを表示します。

    $ podman images
    REPOSITORY                           TAG     IMAGE ID      CREATED      SIZE
    registry.redhat.io/rhel10/support-tools     latest  4b32d14201de  7 weeks ago  228 MB
    registry.redhat.io/ubi10/ubi          latest  3269c37eae33  7 weeks ago  208 MB
    localhost/myubi                      X.Y     3269c37eae33  7 weeks ago  208 MB
  2. すべてのコンテナーをリスト表示します。

    $ podman ps -a
    CONTAINER ID  IMAGE                                    COMMAND          CREATED        STATUS            PORTS   NAMES
    7ccd6001166e  registry.redhat.io/rhel10/support-tools:latest  usr/bin/bash  6 seconds ago  Up 5 seconds ago          my-support-tools

    registry.redhat.io/rhel10/support-tools イメージを削除するには、podman stop コマンドを使用して、このイメージから実行されているすべてのコンテナーを停止する必要があります。コンテナーを ID または名前を使用して停止できます。

  3. my-support-tools コンテナーを停止します。

    $ podman stop my-support-tools
    7ccd6001166e9720c47fbeb077e0afd0bb635e74a1b0ede3fd34d09eaf5a52e9
  4. registry.redhat.io/rhel10/support-tools イメージを削除します。

    $ podman rmi registry.redhat.io/rhel10/support-tools
    • 複数のイメージを削除するには、以下のコマンドを実行します。

      $ podman rmi registry.redhat.io/rhel10/support-tools registry.redhat.io/ubi10/ubi
    • システムからすべてのイメージを削除するには、以下のコマンドを実行します。

      $ podman rmi -a
    • 複数の名前 (タグ) が関連付けられているイメージを削除するには、-f オプションを追加して削除します。

      $ podman rmi -f 1de7d7b3f531
      1de7d7b3f531...

検証

  • podman images コマンドを使用してすべてのイメージをリスト表示し、コンテナーイメージが削除されたことを確認します。

第5章 コンテナーの使用

コンテナーは、デプロイメントされたコンテナーイメージにあるファイルから作成された、実行中プロセスまたは停止プロセスを表します。Podman ツールを使用してコンテナーと連携できます。

5.1. podman run コマンド

podman run コマンドを使用して、イメージから新しいコンテナーを起動します。このコマンドは、必要に応じてイメージをプルし、独自の隔離されたファイルシステムとネットワークを持つコンテナープロセスを起動します。

podman run コマンドは、コンテナーイメージをもとに新しいコンテナーでプロセスを実行します。コンテナーイメージがまだロードされていない場合、podman run は、podman pull image を実行するかのように、イメージからコンテナーを起動する前にそのイメージとすべての依存関係をすレポジトリーからプルします。コンテナープロセスは、独自のファイルシステム、ネットワーク、分離されたプロセスツリーを備えています。

podman run コマンドの形式は次のとおりです。

podman run [options] image [command [arg ...]]

基本オプションは次のとおりです。

  • --detach (-d): コンテナーをバックグラウンドで実行し、新しいコンテナー ID を出力します。
  • --attach (-a): コンテナーをフォアグラウンドモードで実行します。
  • --name (-n): コンテナーに名前を割り当てます。--name で名前がコンテナーに割り当てられていない場合には、ランダムな文字列で名前が生成されます。これはバックグラウンドコンテナーとフォアグラウンドコンテナーの両方で機能します。
  • --rm: 終了時にコンテナーを自動的に削除します。コンテナーが正常に作成または起動できない場合には、削除されない点に注意してください。
  • --tty (-t): コンテナーの標準入力に擬似端末を割り当てて接続します。
  • --interactive (-i): 対話型プロセスの場合に、-i-t を併用して、コンテナープロセスにターミナルを割り当てます。-i -t は頻繁に -it と記述されます。

5.2. ホストからのコンテナーでのコマンド実行

podman run を使用して、ホストからコンテナー内のコマンドを直接入力します。このコマンドを使用すると、対話型シェルに入ることなく、コンテナー環境を検査したり、ユーティリティーを実行したりできます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. cat /etc/os-release コマンドを使用して、registry.access.redhat.com/ubi10/ubi コンテナーイメージをベースとするコンテナーのオペレーティングシステムの種類を表示します。

    $ podman run --rm registry.access.redhat.com/ubi10/ubi cat /etc/os-release
    NAME="Red Hat Enterprise Linux"
    ...
    ID="rhel"
    ...
    HOME_URL="https://www.redhat.com/"
    BUG_REPORT_URL="https://bugzilla.redhat.com/"
    
    REDHAT_BUGZILLA_PRODUCT=" Red Hat Enterprise Linux 10"
    ...
  2. オプション: すべてのコンテナーをリスト表示します。

    $ podman ps
    CONTAINER ID  IMAGE   COMMAND  CREATED  STATUS  PORTS   NAMES

    --rm オプションがあるのでコンテナーは表示されません。コンテナーが削除されました。

5.3. コンテナー内でのコマンドの実行

podman run -it を使用して、コンテナー内で対話型セッションを開始します。このコマンドを使用すると、コンテナーのシェル内でコマンドを入力したり、トラブルシューティングしたりできます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. registry.redhat.io/ubi10/ubi イメージに基づいて、myubi という名前のコンテナーを実行します。

    $ podman run --name=myubi -it registry.access.redhat.com/ubi10/ubi /bin/bash
    [root@6ccffd0f6421 /]#
    • -i オプションは対話式のセッションを作成します。-t オプションを指定しないと、シェルは開いたままにも拘らず、シェルには何も入力できません。
    • -t オプションは、端末セッションを開きます。-i オプションを指定しないと、シェルが開き、終了します。
  2. システムユーティリティーのセットが含まれる procps-ng パッケージをインストールします (例: pstopuptime など)。

    [root@6ccffd0f6421 /]# dnf install procps-ng
  3. ps -ef コマンドを使用して、現在のプロセスをリスト表示します。

    # ps -ef
    UID          PID    PPID  C STIME TTY          TIME CMD
    root           1       0  0 12:55 pts/0    00:00:00 /bin/bash
    root          31       1  0 13:07 pts/0    00:00:00 ps -ef
  4. exit を実行してコンテナーを終了し、ホストに戻ります。

    # exit
  5. 必要に応じて、すべてのコンテナーをリスト表示します。

    $ podman ps -a
    CONTAINER ID  IMAGE                               COMMAND    CREATED         STATUS                     PORTS   NAMES
    1984555a2c27  registry.redhat.io/ubi10/ubi:latest  /bin/bash  21 minutes ago  Exited (0) 21 minutes ago          myubi

    コンテナーが終了ステータスであることを確認できます。

5.4. コンテナーのビルド

アプリケーションとその必要な依存関係を 1 つのポータブルなユニットにパッケージ化するには、Red Hat Enterprise Linux で新しいコンテナーを構築します。Containerfile 内でイメージに関する指示を定義し、ソフトウェアのインストールと設定を自動化します。

前提条件

  1. container-tools メタパッケージがインストールされている。

手順

  1. コンテナーツールのインストール: ご使用の RHEL システムに必要なコンテナーツールがインストールされていることを確認します。container-tools モジュールは、Buildah、Podman、Skopeo を提供します。

    $ sudo dnf install container-tools
  2. Containerfile の作成: Containerfile は、コンテナーイメージをビルドするための手順を定義したものです。このファイルでは、ベースイメージ、インストールするソフトウェア、適用する設定、実行するアプリケーションを指定します。以下に例を示します。

    FROM registry.redhat.io/ubi10/ubi-minimal
    RUN microdnf -y update && microdnf -y install
    COPY index.html /var/www/html/
    EXPOSE 80
    CMD ["httpd", "-DFOREGROUND"]
  3. Buildah を使用してコンテナーイメージをビルドします。コンテナーファイルを含むディレクトリーに移動した後、buildah bud (または podman build) を使用してイメージをビルドします。

    $ cd /<path_to_container_file>
    
    $ buildah bud -t your_image_name:tag .
    • your_image_name: イメージの名前。
    • tag: イメージに付けるタグ (例: latest、1.0)。
    • .: Containerfile がカレントディレクトリーにあることを示します。
  4. コンテナーの実行: イメージをビルドした後、podman run コマンドを使用して、そのイメージからコンテナーを実行できます。

    $ podman run -d -p 8080:80 my-web-app
    • -d: コンテナーをデタッチモード (バックグラウンド) で実行します。
    • -p 8080:80: ホスト上のポート 8080 をコンテナー内のポート 80 にマッピングします。
    • my-web-app: 実行するイメージの名前。

      コンテナービルドにおける heredocs 構文

      BuildKit を有効にしておけば、Red Hat Enterprise Linux ベースイメージを使用した Containerfile 内で heredoc 構文を使用できます。コマンドに heredoc 構文が含まれている場合、Containerfile は、heredoc の区切り文字のみを含む行が現れるまでの後続の行を、同じコマンドの一部とみなします。

      heredocs を使用すると、Containerfile 内の RUNCOPY などの命令内に複数行の文字列を直接埋め込むことができます。これは RHEL ベースのイメージで役立ちます。単純なタスク用に個別のスクリプトファイルを作成する必要がなくなり、可読性と保守性が向上するためです。

      たとえば、一般的な使用例として、単一の RUN 命令内で複数のシェルコマンドを実行して単一のイメージレイヤーを作成し、&& \ 構文の使用を回避する例が挙げられます。

# syntax=container/containerfile:1.4
FROM registry.redhat.io/ubi10/ubi-minimal
# Use a heredoc to perform a multi-line RUN command:
RUN <<EOF
microdnf -y update
microdnf -y install nginx
microdnf clean all
echo "Nginx installed and packages updated"
EOF
  • RUN <<EOF: << は heredocs の開始点を示すものです。EOF はユーザー定義の区切り文字です。
  • <<EOF から最後の EOF までの行は、シェルによって実行される単一のスクリプトとして扱われます。
  • ブロック全体が単一の RUN 命令であるため、より効率的で読みやすくなります。

5.5. コンテナーのリスト表示

podman ps コマンドを使用して、システム上のコンテナーの状態を確認できます。現在実行中のコンテナーをリストすることも、-a オプションを使用して停止中のコンテナーも含めたすべてのコンテナーを表示することもできます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. registry.redhat.io/rhel10/support-tools イメージをベースとするコンテナーを実行します。

    $ podman run -dt registry.redhat.io/rhel10/support-tools
  2. すべてのコンテナーをリスト表示します。

    • 実行中のコンテナーのリストを表示するには、以下のコマンドを実行します。

      $ podman ps
      CONTAINER ID IMAGE              COMMAND         CREATED       STATUS            PORTS NAMES
      74b1da000a11 rhel10/support-tools /usr/bin/bash 2 minutes ago Up About a minute       musing_brown
    • 実行中または停止中のすべてのコンテナーをリスト表示するには、以下を実行します。

      $ podman ps -a
      CONTAINER ID IMAGE         COMMAND    CREATED    STATUS                PORTS NAMES     IS INFRA
      d65aecc325a4 ubi10/ubi      /bin/bash  3 secs ago Exited (0) 5 secs ago peaceful_hopper false
      74b1da000a11 rhel10/support-tools /usr/bin/bash 2 mins ago Up About a minute     musing_brown    false

      --rm オプションを使用して削除しなかった場合、実行されていないコンテナーを再起動できます。

      詳細は、システム上の podman-images(1) man ページを参照してください。

5.6. コンテナーの起動

コンテナーを実行した後、削除せずに停止した場合、コンテナーはローカルシステムに残り、再び実行できる状態になります。podman start コマンドを使用すると、コンテナーを再実行できます。また、コンテナー ID または名前でコンテナーを指定できます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • 1 つ以上のコンテナーが停止されている。

手順

  1. myubi コンテナーを起動します。

    • 非対話モードで以下を行います。

      $ podman start myubi
    • インタラクティブモードで -a (--attach) および -i (--interactive) オプションを使用して、コンテナーの bash シェルと連携します。

      $ podman start -a -i myubi
  2. exit を実行してコンテナーを終了し、ホストに戻ります。

    [root@6ccffd0f6421 /]# exit

    詳細は、システム上の podman-start(1) man ページを参照してください。

5.7. ホストからのコンテナーの検証

podman inspect コマンドを使用して、既存のコンテナーのメタデータを JSON 形式で検証します。コンテナー ID または名前を使用して、コンテナーを指定できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • ID 64ad95327c74 で定義されるコンテナーを検査します。

    • すべてのメタデータを取得するには、以下のコマンドを実行します。

      $ podman inspect 64ad95327c74
      [
          {
              "Id": "64ad95327c740ad9de468d551c50b6d906344027a0e645927256cd061049f681",
              "Created": "2025-05-05T18:15:56.743553292+02:00",
                "Path": "/usr/bin/bash",
                "Args": [
                     "/usr/bin/bash"
                ],
                "State": {
                     "OciVersion": "1.2.0",
                  "Status": "running",
                  ...
    • JSON ファイルから特定の項目 (例: StartedAt タイムスタンプ) を取得するには、以下を実行します。

      $ podman inspect --format='{{.State.StartedAt}}' 64ad95327c74
      2021-03-02 11:23:54.945071961 +0100 CET

      その情報は階層構造で保存されます。コンテナーの StartedAt タイムスタンプ (StartedAtState の配下にある) を確認するには、--format オプションとコンテナー ID または名前を使用します。

      検証する他の項目の例には、以下が含まれます。

  • .Path: コンテナーとともに実行するコマンドを表示します。
  • .Args: コマンドに指定する引数
  • .Config.ExposedPorts: コンテナーから公開する TCP または UDP ポート
  • .State.Pid: コンテナーのプロセス ID を表示します。
  • .HostConfig.PortBindings: コンテナーからホストへのポートマッピング

    詳細は、システム上の podman-inspect(1) man ページを参照してください。

5.8. localhost のディレクトリーのコンテナーへのマウント

コンテナーでホストの /dev/log デバイスをマウントして、コンテナー内のログメッセージをホストシステムに公開できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. log_test という名前のコンテナーを実行し、コンテナーにホストの /dev/log デバイスをマウントします。

    # podman run --name="log_test" -v /dev/log:/dev/log --rm \
      registry.redhat.io/ubi10/ubi logger "Testing logging to the host"
  2. journalctl ユーティリティーを使用してログを表示します。

    # journalctl -b | grep Testing
    Dec 09 16:55:00 localhost.localdomain root[14634]: Testing logging to the host

    --rm オプションは、終了時にコンテナーを削除します。

5.9. コンテナーのファイルシステムのマウント

ホストのディレクトリーやデバイスをマウントすることで、コンテナーと共有できます。たとえば、/dev/log をマウントすることで、コンテナーはホストのシステムジャーナルにログを直接書き込むことができるようになります。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. mysyslog という名前のコンテナーを実行します。

    # podman run -dt --name=mysyslog registry.redhat.io/rhel10/support-tools
  2. podman mount コマンドを実行して、ホストからアクセス可能な場所に、作業コンテナーの root ファイルシステムをマウントします。たとえば、mysyslog コンテナーをマウントします。

    # podman mount mysyslog
    /var/lib/containers/storage/overlay/990b5c6ddcdeed4bde7b245885ce4544c553d108310e2b797d7be46750894719/merged
  3. ls コマンドを使用して、マウントポイントのコンテンツを表示します。

    # ls /var/lib/containers/storage/overlay/990b5c6ddcdeed4bde7b245885ce4544c553d108310e2b797d7be46750894719/merged
    bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
  4. OS バージョンを表示します。

    # cat /var/lib/containers/storage/overlay/990b5c6ddcdeed4bde7b245885ce4544c553d108310e2b797d7be46750894719/merged/etc/os-release
    NAME="Red Hat Enterprise Linux"
    VERSION="10 (Ootpa)"
    ID="rhel"
    ID_LIKE="fedora"
    ...

    詳細は、システム上の podman-mount(1) man ページを参照してください。

5.10. 静的 IP を使用したデーモンとしてのサービスの実行

podman mount コマンドを使用して、ホストからコンテナーのルートファイルシステムにアクセスします。このコマンドを使用すると、ホストから直接コンテナー内のファイルを検査または変更できます。

次の例では、support-tools サービスをデーモンプロセスとしてバックグラウンドで実行します。--ip オプションは、コンテナーのネットワークインターフェイスを特定の IP アドレスに設定します (例: 10.88.0.44)。その後、podman inspect コマンドを実行して、IP アドレスを適切に設定できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. コンテナーのネットワークインターフェイスを IP アドレス 10.88.0.44 に設定します。

    # podman run -d --ip=10.88.0.44 registry.redhat.io/rhel10/support-tools
    efde5f0a8c723f70dd5cb5dc3d5039df3b962fae65575b08662e0d5b5f9fbe85
  2. IP アドレスが正しく設定されていることを確認します。

    # podman inspect efde5f0a8c723 | grep 10.88.0.44
    "IPAddress": "10.88.0.44",

    詳細は、システム上の podman-inspect(1) および podman-run(1) man ページを参照してください。

5.11. 実行中のコンテナー内でのコマンドの実行

実行中のコンテナー内でコマンドを実行し、そのコンテナーを調査するには、podman exec コマンドを使用します。コンテナーアクティビティーを中断せずに実行中のコンテナーを調査できるので、podman run コマンドの代わりに podman exec コマンドを使用します。

前提条件

  • container-tools メタパッケージがインストールされている。
  • コンテナーが実行されている。

手順

  1. my-support-tools コンテナー内で rpm -qa コマンドを入力して、インストールされているすべてのパッケージをリストします。

    $ podman exec -it my-support-tools rpm -qa
    gpg-pubkey-fd431d51-4ae0493b
    gpg-pubkey-5a6340b3-6229229e
    libgcc-11.5.0-2.el9.x86_64
    setup-2.13.7-10.el9.noarch
    ...
  2. my-support-tools コンテナーで /bin/bash コマンドを入力します。

    $ podman exec -it my-support-tools /bin/bash
  3. システムユーティリティーのセットが含まれる procps-ng パッケージをインストールします (例: pstopuptime など)。

    # dnf install procps-ng
  4. コンテナーを検査します。

    • システムにある全プロセスをリスト表示するには、以下のコマンドを実行します。

      # ps -ef
      UID          PID    PPID  C STIME TTY          TIME CMD
      root           8       0  0 11:07 pts/0    00:00:00 /bin/bash
      root          47       8  0 11:13 pts/0    00:00:00 ps -ef
    • ファイルシステムのディスク領域の使用量を表示するには、次のコマンドを実行します。

      # df -h
      Filesystem      Size  Used Avail Use% Mounted on
      tmpfs           6.3G  448K  6.3G   1% /etc/hosts
      shm              63M     0   63M   0% /dev/shm
      overlay         953G   76G  877G   8% /
      tmpfs            64M     0   64M   0% /dev
      devtmpfs        4.0M     0  4.0M   0% /dev/tty
      ...
    • システム情報を表示するには、以下のコマンドを実行します。

      # uname -r
      6.12.0-124.15.1.el10_1.x86_64
    • MB 単位でメモリーの空き容量を表示するには、次のコマンドを実行します。

      # free --mega
      total        used        free      shared  buff/cache   available
      Mem:       2818         615        1183          12         1020        1957
      Swap:      3124           0        3124

5.12. 2 つのコンテナー間でのファイルの共有

ボリュームを使用すると、コンテナーを削除した後でも、コンテナー内のデータを保持できます。ボリュームとは、ホストマシン上に保存するフォルダーであり、複数のコンテナー間でデータを共有するために使用されます。コンテナーとホスト間でボリュームを共有できます。

ボリュームを使用するメリット: * ボリュームはコンテナ間で共有できます。* ボリュームはバックアップや移行が容易です。* ボリュームを使用しても、コンテナーのサイズは増加しません。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. ボリュームを作成します。

    $ podman volume create hostvolume
  2. ボリュームに関する情報を表示します。

    $ podman volume inspect hostvolume
    [
        {
            "name": "hostvolume",
            "labels": {},
            "mountpoint": "/home/username/.local/share/containers/storage/volumes/hostvolume/_data",
            "driver": "local",
            "options": {},
            "scope": "local"
        }
    ]

    volumes ディレクトリーにボリュームが作成されることに注意してください。$ mntPoint=$(podman volume inspect hostvolume --format {{.Mountpoint}}) で、変数へのマウントポイントパスを保存して操作を簡素化できます。

    sudo podman volume create hostvolume を実行すると、マウントポイントが /var/lib/containers/storage/volumes/hostvolume/_data に変わります。

  3. mntPoint 変数に保管されたパスを使用して、ディレクトリー内にテキストファイルを作成します。

    $ echo "Hello from host" >> $mntPoint/host.txt
  4. mntPoint 変数で定義されたディレクトリー内の全ファイルをリスト表示します。

    $ ls $mntPoint/
    host.txt
  5. myubi1 という名前のコンテナーを実行し、ホストのボリューム名 hostvolume で定義したディレクトリーをコンテナーの /containervolume1 ディレクトリーにマッピングします。

    $ podman run -it --name myubi1 -v hostvolume:/containervolume1 registry.access.redhat.com/ubi10/ubi /bin/bash

    mntPoint 変数 (-v $mntPoint:/containervolume1) で定義したボリュームパスを使用する場合には、podman volume prune コマンドを実行すると未使用のボリュームが削除され、データが失われる場合がある点に注意してください。常に -v hostvolume_name:/containervolume_name を使用します。

  6. コンテナー上にある共有ボリューム内のファイルをリスト表示します。

    # ls /containervolume1
    host.txt

    ホスト上で作成した host.txt ファイルが表示されます。

  7. /containervolume1 ディレクトリーにテキストファイルを作成します。

    # echo "Hello from container 1" >> /containervolume1/container1.txt
  8. CTRL+p および CTRL+q を使用してコンテナーからデタッチします。
  9. ホスト上にある共有ボリューム内のファイルをリスト表示します。以下の 2 つのファイルが表示されるはずです。

    $ ls $mntPoint
    container1.rxt  host.txt

    この時点で、コンテナーとホスト間でファイルを共有しています。2 つのコンテナー間でファイルを共有するには、myubi2 という名前の別のコンテナーを実行します。

  10. myubi2 という名前のコンテナーを実行し、ホストのボリューム名 hostvolume で定義したディレクトリーをコンテナーの /containervolume2 ディレクトリーにマッピングします。

    $ podman run -it --name myubi2 -v hostvolume:/containervolume2 registry.access.redhat.com/ubi10/ubi /bin/bash
  11. コンテナー上にある共有ボリューム内のファイルをリスト表示します。

    # ls /containervolume2
    container1.txt host.txt

    ホストで作成した host.txt ファイルと、myubi1 コンテナー内に作成した container1.txt ファイルが表示されます。

  12. /containervolume2 ディレクトリーにテキストファイルを作成します。

    # echo "Hello from container 2" >> /containervolume2/container2.txt
  13. CTRL+p および CTRL+q を使用してコンテナーからデタッチします。
  14. ホスト上にある共有ボリューム内のファイルをリスト表示します。以下の 3 つのファイルが表示されるはずです。

    $ ls $mntPoint
    container1.rxt  container2.txt host.txt

    詳細は、システム上の podman-volume(1) man ページを参照してください。

5.13. コンテナーのエクスポートおよびインポート

異なるホスト環境間でファイルシステムを簡単に転送するには、Red Hat Enterprise Linux コンテナーをエクスポートおよびインポートします。コンテナーをアーカイブ (tar ファイル) にパッケージ化することで、重要なデータのバックアップ、チームとの設定情報の共有、および分離されたワークロードのシームレスな移行が可能になります。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. registry.access.redhat.com/ubi10/ubi イメージをベースとする myubi コンテナーを実行します。

    $ podman run -dt --name=myubi registry.access.redhat.com/10/ubi
  2. 必要に応じて、すべてのコンテナーをリスト表示します。

    $ podman ps -a
    CONTAINER ID  IMAGE                                    COMMAND          CREATED     STATUS         PORTS   NAMES
    a6a6d4896142  registry.access.redhat.com/10:latest   /bin/bash        7 seconds ago  Up 7 seconds ago          myubi
  3. myubi コンテナーに割り当てます。

    $ podman attach myubi
  4. testfile という名前のファイルを作成します。

    [root@a6a6d4896142 /]# echo "hello" > testfile
  5. CTRL+p および CTRL+q を使用してコンテナーからデタッチします。
  6. ローカルマシンで、myubi のファイルシステムを myubi-container.tar としてエクスポートします。

    $ podman export -o myubi.tar a6a6d4896142
  7. 必要に応じて、現在のディレクトリーの内容をリスト表示します。

    $ ls -l
    -rw-r--r--. 1 user user 210885120 Apr  6 10:50 myubi-container.tar
    ...
  8. 必要に応じて、myubi-container ディレクトリーを作成し、myubi-container.tar アーカイブからすべてのファイルを抽出します。ツリー形式で myubi-directory の内容をリスト表示します。

    $ mkdir myubi-container
    $ tar -xf myubi-container.tar -C myubi-container
    $ tree -L 1 myubi-container
    ├── bin -> usr/bin
    ├── boot
    ├── dev
    ├── etc
    ├── home
    ├── lib -> usr/lib
    ├── lib64 -> usr/lib64
    ├── lost+found
    ├── media
    ├── mnt
    ├── opt
    ├── proc
    ├── root
    ├── run
    ├── sbin -> usr/sbin
    ├── srv
    ├── sys
    ├── testfile
    ├── tmp
    ├── usr
    └── var
    
    20 directories, 1 file

    myubi-container.tar にコンテナーのファイルシステムが含まれていることを確認できます。

  9. myubi.tar をインポートして、ファイルシステムイメージとして保存します。

    $ podman import myubi.tar myubi-imported
    Getting image source signatures
    Copying blob 277cab30fe96 done
    Copying config c296689a17 done
    Writing manifest to image destination
    Storing signatures
    c296689a17da2f33bf9d16071911636d7ce4d63f329741db679c3f41537e7cbf
  10. すべてのイメージをリスト表示します。

    $ podman images
    REPOSITORY                              TAG     IMAGE ID      CREATED         SIZE
    docker.io/library/myubi-imported       latest  c296689a17da  51 seconds ago  211 MB
  11. testfile ファイルの内容を表示します。

    $ podman run -it --name=myubi-imported myubi-imported cat testfile
    hello

    podman export コマンドを使用して、実行中のコンテナーのファイルシステムをローカルマシンの tar ファイルにエクスポートできます。たとえば、使用頻度の低い大きなコンテナーや、後で復元するためにスナップショットを保存しておきたいコンテナーがある場合などです。

    podman import コマンドを使用して tar ファイルをインポートし、ファイルシステムイメージとして保存できます。これにより、このファイルシステムイメージを実行するか、他のイメージのレイヤーとして使用できます。

    詳細は、システム上の podman-export (1) および podman-import(1) の man ページを参照してください。

5.14. コンテナーの停止

実行中のコンテナーを停止するには、podman stop コマンドを使用します。コンテナー ID または名前を使用して、コンテナーを指定できます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • 1 つ以上のコンテナーが実行中である。

手順

  • myubi コンテナーを停止します。

    • コンテナー名を使用する場合:

      $ podman stop myubi
    • コンテナー ID を使用する場合:

      $ podman stop 1984555a2c27

      端末セッションに接続されている、実行中のコンテナーを停止するには、コンテナーで exit コマンドを入力してください。

      podman stop コマンドは、SIGTERM シグナルを送信し、実行中のコンテナーを終了します。定義された期間 (デフォルトでは 10 秒) 後にコンテナーが停止しない場合は、Podman は SIGKILL シグナルを送信します。

      また、podman kill コマンドを使用して、コンテナーを強制終了 (SIGKILL) するか、別のシグナルをコンテナーに送信することもできます。以下のコマンド例は、コンテナーに SIGHUP シグナルを送信します。アプリケーションが対応している場合、このシグナルによってアプリケーションは設定ファイルを再度読み込みます。

      # podman kill --signal="SIGHUP" 74b1da000a11
      74b1da000a114015886c557deec8bed9dfb80c888097aa83f30ca4074ff55fb2

      詳細は、システム上の podman-stop(1) および podman-kill(1) man ページを参照してください。

5.15. コンテナーの削除

podman rm コマンドを使用して、コンテナーを削除します。コンテナー ID または名前でコンテナーを指定できます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • 1 つ以上のコンテナーが停止されている。

手順

  1. (実行中または停止中の) すべてのコンテナーを一覧表示するには、以下を実行します。

    $ podman ps -a
    CONTAINER ID IMAGE         COMMAND    CREATED    STATUS                PORTS NAMES     IS INFRA
    d65aecc325a4 ubi10/ubi      /bin/bash  3 secs ago Exited (0) 5 secs ago peaceful_hopper false
    74b1da000a11 rhel10/support-tools usr/bin/bash 2 mins ago Up About a minute     musing_brown    false
  2. コンテナーを削除します。

    • peaceful_hopper を削除するには以下を実行します。

      $ podman rm peaceful_hopper

      peaceful_hopper コンテナーが終了ステータスであったことに注意してください。コンテナーが停止されているので、即座に削除できます。

    • musing_brown コンテナーを削除するには、まずコンテナーを停止してから削除します。

      $ podman stop musing_brown
      $ podman rm musing_brown
    • 複数のコンテナーを削除するには、以下を実行します。

      $ podman rm clever_yonath furious_shockley
    • ローカルシステムからすべてのコンテナーを削除するには、以下のコマンドを実行します。

      $ podman rm -a

検証

  • podman ps -a コマンドを使用してすべてのイメージをリスト表示し、コンテナーが削除されたことを確認します。

5.16. コンテナーに対する SELinux ポリシー

コンテナーの SELinux ポリシーを生成するには、Udica ツールを使用します。詳細は、コンテナー用の SELinux ポリシーの作成 を参照してください。

5.17. Podman での事前実行フックの設定

プラグインスクリプトを作成して、コンテナー操作の詳細な制御を定義できます。特に、コンテナーイメージのプル、実行、リストなどの不正なアクションをブロックできます。

注記

ファイル /etc/containers/podman_preexec_hooks.txt は管理者が作成する必要があり、空であってもかまいません。/etc/containers/podman_preexec_hooks.txt が存在しない場合、プラグインスクリプトは実行されません。

次のルールがプラグインスクリプトに適用されます。

  • root 所有である必要があり、書き込み可能ではありません。
  • /usr/libexec/podman/pre-exec-hooks および /etc/containers/pre-exec-hooks ディレクトリーに配置する必要があります。
  • 英数字順に沿って、連続して実行されます。
  • すべてのプラグインスクリプトがゼロ値を返した場合、podman コマンドを実行できます。
  • いずれかのプラグインスクリプトがゼロ以外の値を返した場合、それは失敗を示します。podman コマンドは終了し、最初に失敗したスクリプトのゼロ以外の値を返します。
  • Red Hat では、スクリプトを正しい順序で実行するために、DDD_name.lang の命名規則を使用することを推奨しています。ここで、

    • DDD は、スクリプトの実行順序を示す 10 進数です。必要に応じて、先頭に 1 つまたは 2 つのゼロを使用します。
    • name はプラグインスクリプトの名前です。
    • lang (オプション) は、指定されたプログラミング言語のファイル拡張子です。たとえば、プラグインスクリプトの名前は 001-check-groups.sh のようになります。
注記

プラグインスクリプトは作成時点で有効です。プラグインスクリプトの前に作成されたコンテナーは影響を受けません。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • 001-check-groups.sh という名前のスクリプトプラグインを作成します。以下に例を示します。

    #!/bin/bash
    if id -nG "$USER" 2> /dev/null | grep -qw "$GROUP" 2> /dev/null ; then
        exit 0
    else
        exit 1
    fi
    • スクリプトは、ユーザーが指定されたグループに属しているかどうかを確認します。
    • USERGROUP は、Podman によって設定される環境変数です。
    • 001-check-groups.sh スクリプトによって提供される終了コードは、podman バイナリーに提供されます。
    • podman コマンドは終了し、最初に失敗したスクリプトのゼロ以外の値を返します。

検証

  • 001-check-groups.sh スクリプトが正しく動作するかどうかを確認します。

    $ podman run image
    ...

    ユーザーが正しいグループに属していない場合、次のエラーが表示されます。

    external preexec hook /etc/containers/pre-exec-hooks/001-check-groups.sh failed

5.18. コンテナー内のアプリケーションのデバッグ

トラブルシューティングのさまざまな側面に合わせてカスタマイズされたさまざまなコマンドラインツールを使用できます。詳細は、コンテナー内のアプリケーションのデバッグ を参照してください。

第6章 再現可能なコンテナービルドの概要

Podman と Buildah によって再現可能なビルドを使用して、同じソースコードから同じコンテナーイメージを作成します。この一貫性により、サプライチェーンのセキュリティーが確保され、ストレージと帯域幅の使用量を削減できます。

イメージ間の変更が少ないほど、あるイメージのバージョンを新しいバージョンに移行するときに、レジストリーから取得する必要があるデータの量を減らすことができます。再現可能なコンテナービルドは、サプライチェーンのセキュリティーの確保、信頼性の高いソフトウェアデプロイの支援、効果的なデバッグの促進に不可欠です。

mtime の更新などの変更は、ユーザーが基となるデータに変更を加えることなく同一の RPM をインストールする場合でも、ストレージ要件を倍増させる可能性があります。この動作はレジストリーのストレージ使用量を増加させ、機能的な変更がない場合でも、ユーザーに新しいレイヤーの取得を要求します。これは、高速な更新に依存する rhel-bootc や RHEL AI などの環境での更新速度を低下させます。

6.1. 再現可能なコンテナービルドの利点

RHEL コンテナーの再現可能なビルドでは、ソースコードとビルド環境に変更がない限り、イメージレイヤーの一貫性が確保されます。これにより、レジストリーストレージが削減され、更新ペイロードのサイズが小さくなり、ダウンロードが高速化されます。

このプロセスにより、レイヤーキャッシュの効率が最大化され、同一データの冗長な保存と転送が防止されます。再現可能なコンテナービルドの主な利点は次のとおりです。

  • レジストリーストレージの削減: イメージが更新されたときに、変更されたレイヤーのみが保存されます。再現可能なビルドは、非決定論的な要因 (タイムスタンプ、ファイルの順序、メタデータ) による変更を防ぎ、同じソースコードから必ず同一のイメージが生成されるようにすることで、余計なストレージ消費を回避します。
  • 効率的で小さい更新ペイロード: セキュリティーパッチなどのコンテナーの軽微な更新の場合、イメージ全体ではなく、変更されたレイヤーだけをダウンロードするだけで済みます。また、再現可能なビルドでは、ソースの更新時に、影響を受けるレイヤーしか変更されません。これは、わずかなコード変更でも複数のレイヤーが変わる可能性がある再現不可能なビルドとは異なります。
  • ダウンロードの高速化: コンテナーの再現可能なビルドは、効率的なキャッシュとネットワークトラフィックの削減によってダウンロードを高速化し、ビルドシステムとエンドユーザーの両方を最適化します。

6.2. 再現可能なコンテナービルドがさまざまな環境に与える影響

Konflux や bootc などの環境間で、再現可能なビルドを使用して一貫性のある同一のコンテナーイメージを確保します。この検証は、サプライチェーンの完全性を維持し、コンプライアンスとデバッグを単純化するために役立ちます。

RHEL 上の再現可能なコンテナービルドにより、ビルドの時間や場所に関係なく、一貫性のある同一のコンテナーイメージが実現します。再現可能なコンテナービルドがさまざまな環境に与える影響は次のとおりです。

Konflux
  • ソフトウェアサプライチェーンの完全性の向上: 再現可能なコンテナービルドは、セキュアで透明性の高いソフトウェアサプライチェーンを提供するという Konflux の使命を強化します。Konflux は再現可能なビルドを使用して、ビルド済みのコンテナイメージが、そのソースコードどおりに作られたものであることを検証します。どのサードパーティーも同じ入力からコンテナーを再ビルドし、出力がビット単位で同一であることを検証できます。また、RHEL の再現可能なコンテナービルドは、"転送中" の脆弱性から保護します。この脆弱性を突かれると、攻撃者によって配布用ミラーが侵害されたり、ビルドプロセスに悪意のあるコードを注入されたりするおそれがあります。Konflux は、リリースされたバイナリーがソースと一致することを証明でき、それによって自身のビルドインフラストラクチャーへの攻撃を軽減します。
  • コンプライアンスと透明性の向上: Konflux は SLSA セキュリティーポリシーを適用します。再現可能な RHEL イメージの出所と来歴を検証し、コンプライアンス確保を簡素化します。Konflux は Tekton Chains を使用して、ビルドプロセス全体をドキュメント化したイミュータブルな署名済みアテステーションを作成します。RHEL の再現可能なコンテナービルドは、ベースイメージが信頼できるものであり、かつ検証可能な状態でビルドされていることを保証することで、このアテステーションの信頼の基礎となる層を追加します。
  • 開発とセキュリティーのワークフロー: 再現可能なビルドは、複数回実行してもコンテナーイメージのダイジェストが一貫していることを保証し、テストとデバッグを簡素化します。Konflux はこれを活用して、RHEL コンテナー内の脆弱なパッケージを効率的にスキャンして更新します。Konflux は検証済みのアテステーションを使用して、基準に準拠していないビルドを自動的にブロックし、柔軟性を低下させることなくセキュリティーポリシーを適用します。
Bootc
  • 検証可能なサプライチェーンとセキュリティーの強化: RHEL の再現可能なコンテナービルドは、起動可能なオペレーティングシステムイメージのために、よりセキュアで信頼性が高く、透明性のあるビルドプロセスを構築することで、rhel-bootc を強化します。ユーザーは、特定の bootc イメージが、その元であると主張されているソースコードからビルドされたことを検証できます。そのため、攻撃者がビルドパイプラインを侵害し、コンテナーイメージに悪意のあるコードを注入することがより困難になります。
  • CI/CD および GitOps ワークフローの効率化: Git ベースのワークフロー (GitOps) を使用して、再現性を保ちながらオペレーティングシステム設定とアプリケーションスタック全体を管理できます。Containerfile を変更しても、すべての環境で一貫した起動可能なイメージが生成されることが保証されます。再現可能なビルドは、自動化された CI/CD パイプラインの基礎となります。
RHEL AI
  • 再現可能なコンテナービルドは、RHEL AI にとって重要です。AI モデルの開発とデプロイに欠かせない基本的な一貫性、セキュリティー、効率性を提供するためです。RHEL AI は起動可能なコンテナーイメージを提供します。つまり、オペレーティングシステム自体をコンテナーアーティファクトとして管理します。再現性により、このような基盤となる AI 環境の一貫性と信頼性が常に確保されます。

6.3. RHEL コンテナーツールでの再現性の実現

Buildah、Podman、Skopeo などの RHEL コンテナーツールを使用してビルドの再現性を実現することで、ビルドプロセス中のタイムスタンプやその他の非決定的な要素を制御できます。

RHEL コンテナーツールは、再現性を確保するために、標準化されたデーモンレスのスクリプト制御可能なワークフローを提供します。このアプローチにより、一度ビルドしたコンテナーをどこでも一貫して実行できることが保証され、依存関係、環境、バージョン管理に関する潜在的な問題に対処できます。

Buildah
RHEL Buildah は、ビルドプロセスをきめ細かく制御することで、再現可能なコンテナービルドを実現します。不安定なタグ、ファイルシステムのメタデータ、ホスト依存データなどの非決定性の原因を軽減するための特別なオプションを備えています。Buildah は、再現可能なビルドのために固定タイムスタンプを使用します。

標準のタイムスタンプは、再現性を大幅に低下させます。デフォルトでは、ファイルの作成時刻と変更時刻は、ファイルがコンテナーレイヤーに追加された時刻を反映します。Buildah を使用すると、このタイムスタンプをゼロにしたり、特定の固定値に設定したりできます。再現性を確保するために、以下のオプションを使用できます。

+

  • --rewrite-timestamp: このオプションは、レイヤーの内容に、--source-date-epoch より後の時刻のタイムスタンプを設定します。また、主に決定論的なビルドを実現する目的で、イメージの作成タイムスタンプとそのレイヤー内ファイルのタイムスタンプを制御します。
  • --source-date-epoch: このオプションは、以前の --timestamp オプションよりも柔軟性が高く、イメージレイヤー内のすべてのファイルに対して特定の再現可能なタイムスタンプを定義できます。これは、イメージメタデータの作成日と履歴の日付に影響します。CLI フラグ、環境変数、またはビルド引数を使用して設定できます。フラグを設定すると、宣言された ARG が RUN 命令の環境で公開され、静的ホスト名が取得されます。また、コミットされたイメージ内のコンテナー ID フィールドがクリアされます。
Podman

podman build コマンドは、ユーザー向けのインターフェイスですが、実際のイメージ作成処理は Buildah ライブラリーに任せています。Podman は Buildah と同じコア機能を活用しているため、再現可能なコンテナービルドを実現できます。Buildah は、ビルドプロセスにおける非決定性の原因を制御することに重点を置いています。

Podman のコマンドは、--rewrite-timestamp および --source-date-epoch オプションも受け取ります。また、ローカルキャッシュを無視して新規ビルドを実行するよう Podman に指示する --no-cache オプションもあります。このオプションを使用すると、コンテナーイメージがゼロから確実に再現できることを確認できます。

Skopeo
Skopeo は、変更可能なタグの代わりに変更不可能なイメージダイジェストを参照することで、再現可能なコンテナービルドを実現します。Skopeo は主にイメージの転送と管理を行います。Buildah などの他のツールが実際の再現可能なイメージの作成を処理します。
注記

--source-date-epoch および --rewrite-timestamp オプションを使用すると、ビルドの再現性が向上します。ただし、完全な再現性は保証されません。COPY 命令の --from オプションを使用して他のイメージから追加されたコンテンツは、RUN 命令の --mount=from= オプションを介してアクセスできます。ADD 命令を使用してダウンロードすることも可能ですが、参照したイメージタグが後で移動された場合や、指定した URL のコンテンツが変更された場合は、結果が変わる可能性があります。

6.4. 再現可能なコンテナービルドの使用

Podman または Buildah でタイムスタンプオプションを指定することで、再現可能なコンテナーイメージをビルドします。--source-date-epoch および --rewrite-timestamp オプションを使用すると、ビルド全体で同一の決定論的なイメージを作成できます。

手順

  • Buildah コマンドを実行する際に、オプションを設定できます。たとえば、Containerfile からイメージを構築し、すべてのタイムスタンプを特定の時刻に強制的に設定するには、次のように指定します。

    Use a specific, immutable image.
    FROM registry.access.redhat.com/ubi10/ubi:10.0 AS builder
    
    # Set the SOURCE_DATE_EPOCH for deterministic timestamps
    ARG SOURCE_DATE_EPOCH
    ENV SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH:-1}
    
    # Build the image using the build-arg and rewrite-timestamp options
    buildah bud --source-date-epoch=${SOURCE_DATE_EPOCH} \
      --rewrite-timestamp \
      -f Containerfile \
      -t my-reproducible-image .
  • 一貫したタイムスタンプを使用して podman build コマンドを実行し、再現可能なイメージを作成します。

    # Set a consistent timestamp using the last Git commit date
    export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)
  • 指定のタイムスタンプを使用してイメージをビルドします。

    podman build --source-date-epoch=${SOURCE_DATE_EPOCH} --rewrite-timestamp -t my-reproducible-app .

検証

  • ビルド後、再現可能なコマンドを再度実行します。ビルドが実際に再現可能であれば、buildah inspect コマンドが同じイメージダイジェストを表示するはずです。

    buildah bud --source-date-epoch=${SOURCE_DATE_EPOCH} \ --rewrite-timestamp \ -f Containerfile \ -t my-reproducible-image-2 .
  • ダイジェストを比較します。

    buildah inspect --format '{{.Digest}}' my-reproducible-image
    buildah inspect --format '{{.Digest}}' my-reproducible-image-2

第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 standard イメージでは、dnf コマンドを使用します。
  • UBI minimal イメージでは、microdnf コマンドを使用します。

7.1. UBI init イメージの使用

UBI init イメージを使用して、システムサービスを実行するコンテナーをビルドします。systemd を使用すると、Web サーバーなどのアプリケーションをコンテナー内で自動的に起動するように設定できます。

Containerfile を使用することで、コンテナーをビルドできます。コンテナーがホストシステム上で実行されている場合、Web サーバー (httpd) がインストールおよび設定され、systemd サービス (/sbin/init) によって自動的に起動するようになります。podman build コマンドは、1 つ以上の Containerfile と指定されたビルドコンテキストディレクトリー内の指示を使用してイメージをビルドします。

コンテキストディレクトリーは、アーカイブ、Git リポジトリー、または Containerfile の URL として指定できます。コンテキストディレクトリーが指定されていない場合、現在の作業ディレクトリーはビルドコンテキストと見なされ、Containerfile が含まれている必要があります。--file オプションで Containerfile を指定することもできます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. 新しいディレクトリーに以下の内容を含む 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) に公開し、コンテナーの起動時、systemd init サービス (/sbin/init) を開始します。

  2. コンテナーをビルドします。

    # podman build --format=docker -t mysysd .
  3. オプション: お使いのシステムで systemd を使用してコンテナーを実行し、SELinux を有効にする場合は、container_manage_cgroup ブール値変数を設定する必要があります。

    # setsebool -P container_manage_cgroup 1
  4. mysysd_run という名前のコンテナーを実行します。

    # podman run -d --name=mysysd_run -p 80:80 mysysd

    mysysd イメージが mysysd_run コンテナーをデーモンプロセスとして実行し、コンテナーのポート 80 がホストシステムのポート 80 に公開されます。

    注記

    ルートレスモードでは、1024 以上のホストのポート番号を選択する必要があります。以下に例を示します。

    $ podman run -d --name=mysysd -p 8081:80 mysysd

    1024 未満のポート番号を使用するには、net.ipv4.ip_unprivileged_port_start 変数を変更する必要があります。

    # sysctl net.ipv4.ip_unprivileged_port_start=80
  5. コンテナーが実行されていることを確認します。

    # podman ps
    a282b0c2ad3d  localhost/mysysd:latest  /sbin/init  15 seconds ago  Up 14 seconds ago  0.0.0.0:80->80/tcp  mysysd_run
  6. Web サーバーをテストします。

    # curl localhost/index.html
    Successful Web Server Test

7.2. UBI マイクロイメージの使用

UBI マイクロイメージと Buildah を使用して、超軽量コンテナーを構築します。イメージにはパッケージマネージャーが含まれていないため、このプロセスではイメージをマウントし、ホストからイメージにソフトウェアをインストールする必要があります。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. registry.access.redhat.com/ubi10/ubi-micro イメージをプルしてビルドします。

    # microcontainer=$(buildah from registry.access.redhat.com/ubi10/ubi-micro)
  2. 作業中のコンテナーの root ファイルシステムをマウントします。

    # micromount=$(buildah mount $microcontainer)
  3. httpd サービスを micromount ディレクトリーにインストールします。

    # dnf install \
        --installroot $micromount \
        --releasever=/ \
        --setopt install_weak_deps=false \
        --setopt=reposdir=/etc/yum.repos.d/ \
        --nodocs -y \
        httpd
    # dnf clean all \
        --installroot $micromount
  4. 作業コンテナーで root ファイルシステムをアンマウントします。

    # buildah umount $microcontainer
  5. 作業コンテナーから ubi-micro-httpd イメージを作成します。

    # buildah commit $microcontainer ubi-micro-httpd

検証

  1. ubi-micro-httpd イメージの詳細を表示します。

    # podman images ubi-micro-httpd
    localhost/ubi-micro-httpd latest 7c557e7fbe9f  22 minutes ago  151 MB

7.3. UBI コンテナーへのソフトウェアの追加 (サブスクライブされたホスト)

サブスクライブ済みの RHEL ホスト上で実行している場合、コンテナー内の RHEL リポジトリー全体にアクセスできます。これにより、標準の UBI リポジトリーで使用可能なパッケージだけでなく、より幅広いパッケージをインストールできるようになります。

登録およびサブスクライブされた RHEL ホストで UBI コンテナーを実行している場合は、RHEL Base リポジトリーおよび AppStream リポジトリーが、標準の UBI コンテナーとすべての UBI リポジトリーで有効になります。

  • Red Hat のエンタイトルメントは、Podman を実行しているホストの /usr/share/containers/mounts.conf で定義されたシークレットマウントとして、サブスクライブされた Red Hat ホストから渡されます。

    マウント設定を確認してください。

    $ cat /usr/share/containers/mounts.conf
    /usr/share/rhel/secrets:/run/secrets
  • yum コマンド、dnf コマンド、および microdnf コマンドは、このパスでエンタイトルメントデータを検索するはずです。
  • パスが存在しない場合、RHV リポジトリーなど、Red Hat のエンタイトルメント適用対象のコンテンツをコマンドで使用できません。これらのコマンドには、ホストが持つキーまたはコンテンツアクセス権がないためです。
  • これは、Red Hat が出荷または提供する RHEL ホスト上の Podman にのみ適用されます。

7.4. 標準の UBI コンテナーへのソフトウェアの追加

標準の UBI コンテナー内にソフトウェアを追加するには、UBI 以外の DNF リポジトリーを無効にして、ビルドするコンテナーが再配布されるようにします。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. registry.access.redhat.com/ubi10/ubi イメージをプルして実行します。

    $ podman run -it --name myubi registry.access.redhat.com/ubi10/ubi
  2. myubi コンテナーにパッケージを追加します。

    • UBI リポジトリーにあるパッケージを追加するには、UBI リポジトリー以外の dnf リポジトリーをすべて無効にします。たとえば、bzip2 パッケージを追加するには、次のコマンドを実行します。

      # dnf install --disablerepo==* --enablerepo=ubi-10-for-x86_64-appstream-rpms --enablerepo=ubi-10-for-x86_64-baseos-rpms bzip2
    • UBI リポジトリーにないパッケージを追加するには、リポジトリーを無効にしないでください。たとえば、zsh パッケージを追加するには、次のコマンドを実行します。

      # dnf install zsh
    • 別のホストリポジトリーにあるパッケージを追加するには、必要なリポジトリーを明示的に有効にします。たとえば、codeready-builder-for-ubi-10-x86_64-rpms リポジトリーから python3-devel パッケージをインストールするには、以下のコマンドを実行します。

      # dnf install --enablerepo=codeready-builder-for-ubi-10-x86_64-rpms python3-devel

検証

  1. コンテナー内で有効なリポジトリーのリストを表示します。

    # dnf repolist
  2. 必要なリポジトリーがリスト表示されていることを確認します。
  3. インストール済みパッケージのリストを表示します。

    # rpm -qa
  4. 必要なパッケージがリスト表示されていることを確認します。
注記

Red Hat UBI リポジトリーに含まれていない Red Hat パッケージをインストールすると、サブスクライブしている RHEL システム以外でコンテナーを配布する機能が限定される可能性があります。

7.5. UBI minimal コンテナーへのソフトウェアの追加

microdnf コマンドを使用して、UBI minimal コンテナーにソフトウェアをインストールします。このコマンドは、コンテナーサイズを小さく保ちながら、基本的なパッケージ管理機能を提供します。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. registry.access.redhat.com/ubi10/ubi-minimal イメージをプルして実行します。

    $ podman run -it --name myubimin registry.access.redhat.com/ubi10/ubi-minimal
  2. myubimin コンテナーにパッケージを追加します。

    • UBI リポジトリーにあるパッケージを追加するには、リポジトリーを無効にしないでください。たとえば、bzip2 パッケージを追加するには、次のコマンドを実行します。

      # microdnf install bzip2 --setopt install_weak_deps=0
    • 別のホストリポジトリーにあるパッケージを追加するには、必要なリポジトリーを明示的に有効にします。たとえば、codeready-builder-for-rhel-10-x86_64-rpms リポジトリーから python3-devel パッケージをインストールするには、以下のコマンドを実行します。

      # microdnf install --enablerepo=codeready-builder-for-rhel-10-x86_64-rpms python3-devel --setopt install_weak_deps=0

      --setopt install_weak_deps=false オプションは、weak 依存関係のインストールを無効にします。Weak 依存関係には、厳密には必要ではないが、デフォルトでインストールされることが多い推奨パッケージや提案パッケージが含まれます。

検証

  1. コンテナー内で有効なリポジトリーのリストを表示します。

    # microdnf repolist
  2. 必要なリポジトリーがリスト表示されていることを確認します。
  3. インストール済みパッケージのリストを表示します。

    # rpm -qa
  4. 必要なパッケージがリスト表示されていることを確認します。
注記

Red Hat UBI リポジトリーに含まれていない Red Hat パッケージをインストールすると、サブスクライブしている RHEL システム以外でコンテナーを配布する機能が限定される可能性があります。

7.6. UBI コンテナーへのソフトウェアの追加 (サブスクライブしていないホスト)

デフォルトの UBI リポジトリーを使用して、未登録ホスト上の UBI コンテナーにソフトウェアを追加します。これらのリポジトリーは無料で使用でき、RHEL サブスクリプションがなくてもアクセスできます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • UBI standard または UBI init イメージをベースとする実行中のコンテナーにパッケージを追加します。リポジトリーを無効にしないでください。コンテナーを実行するには、podman run コマンドを使用します。次に、コンテナー内で dnf install コマンドを使用します。

    • たとえば、bzip2 パッケージを UBI standard ベースのコンテナーに追加するには、次のコマンドを実行します。

      $ podman run -it --name myubi registry.access.redhat.com/ubi10/ubi
      # dnf install bzip2
    • たとえば、bzip2 パッケージを UBI init ベースのコンテナーに追加するには、次のコマンドを実行します。

      $ podman run -it --name myubimin registry.access.redhat.com/ubi10/ubi-init
      # microdnf install bzip2

検証

  1. 有効なリポジトリーをリスト表示します。

    • UBI standard イメージまたは UBI init イメージをベースとするコンテナー内で、有効なリポジトリーをすべてリスト表示する場合は、以下を実行します。

      #  dnf repolist
    • UBI minimal コンテナーをベースとするコンテナー内で、有効なリポジトリーをすべてリスト表示する場合は、以下を実行します。

      # microdnf repolist
  2. 必要なリポジトリーがリスト表示されていることを確認します。
  3. インストール済みパッケージのリストを表示します。

    # rpm -qa
  4. 必要なパッケージがリスト表示されていることを確認します。

7.7. UBI ベースのイメージの構築

Buildah ユーティリティーを使用して、Containerfile から UBI ベースの Web サーバーコンテナーを作成できます。非 UBI DNF リポジトリーをすべて無効にして、イメージに再配布できる Red Hat ソフトウェアのみが含まれていることを確認する必要があります。

注記

UBI 最小イメージの場合は、dnf の代わりに microdnf を使用する: RUN microdnf update -y && rm -rf /var/cache/yum および RUN microdnf install httpd -y && microdnf clean all コマンド。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. Containerfile を作成します。

    FROM registry.access.redhat.com/ubi10/ubi
    USER root
    LABEL maintainer="John Doe"
    # Update image
    RUN dnf update --disablerepo=* --enablerepo=ubi-10-appstream-rpms --enablerepo=ubi-10-baseos-rpms -y && rm -rf /var/cache/yum
    RUN dnf install --disablerepo=* --enablerepo=ubi-10-appstream-rpms --enablerepo=ubi-10-baseos-rpms httpd -y && rm -rf /var/cache/yum
    # Add default Web page and expose port
    RUN echo "The Web Server is Running" > /var/www/html/index.html
    EXPOSE 80
    # Start the service
    CMD ["-D", "FOREGROUND"]
    ENTRYPOINT ["/usr/sbin/httpd"]
  2. コンテナーイメージをビルドします。

    # buildah bud -t johndoe/webserver .
    STEP 1: FROM registry.access.redhat.com/ubi10/ubi:latest
    STEP 2: USER root
    STEP 3: LABEL maintainer="John Doe"
    STEP 4: RUN dnf update --disablerepo=* --enablerepo=ubi-10-appstream-rpms --enablerepo=ubi-10-baseos-rpms -y
    ...
    Writing manifest to image destination
    Storing signatures
    --> f9874f27050
    f9874f270500c255b950e751e53d37c6f8f6dba13425d42f30c2a8ef26b769f2

検証

  1. Web サーバーを実行します。

    # podman run -d --name=myweb -p 80:80 johndoe/webserver
    bbe98c71d18720d966e4567949888dc4fb86eec7d304e785d5177168a5965f64
  2. Web サーバーをテストします。

    # curl http://localhost/index.html
    The Web Server is Running

7.8. Application Stream ランタイムイメージの使用

Application Stream ランタイムイメージをアプリケーションの基盤として使用します。これらのイメージは、Python、Ruby、Node.js などの言語向けに、あらかじめ構築された環境を提供します。

サポートされるランタイムイメージは Python、Ruby、s2-core、s2i-base、.NET Core、PHP です。ランタイムイメージは Red Hat Container Catalog で利用できます。

注記

このような UBI イメージコンテナーには、従来のイメージと同じ基本ソフトウェアが含まれているため、「Red Hat Software Collections Container Images」を参照することで、これらのイメージについて学ぶことができます。

7.9. UBI コンテナーイメージソースコードの取得

UBI イメージのソースコードにアクセスするには、対応するソースコンテナーイメージをダウンロードします。Skopeo を使用してこれらのイメージを取得および展開し、基となるソースを検査します。

すべての Red Hat UBI ベースのイメージのソースコードは、ダウンロード可能なコンテナーイメージの形で入手できます。コンテナーとしてパッケージ化されているにもかかわらず、ソースコンテナーイメージを実行できません。システムに Red Hat ソースコンテナーイメージをインストールするには、podman pull コマンドではなく、skopeo コマンドを使用します。

ソースコンテナーイメージは、それらが表すバイナリーコンテナーに基づいて名前が付けられます。たとえば、特定の標準 RHEL UBI 10 コンテナー registry.access.redhat.com/ubi10:8.1-397 の場合、-source を追加してソースコンテナーイメージ (registry.access.redhat.com/ubi10:8.1-397-source) を取得します。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. skopeo copy コマンドを使用して、ソースコンテナーイメージをローカルディレクトリーにコピーします。

    $ skopeo copy \
    docker://registry.access.redhat.com/ubi10:8.1-397-source \
    dir:$HOME/TEST
    ...
    Copying blob 477bc8106765 done
    Copying blob c438818481d3 done
    ...
    Writing manifest to image destination
    Storing signatures
  2. skopeo inspect コマンドを使用して、ソースコンテナーイメージを検査します。

    $ skopeo inspect dir:$HOME/TEST
    {
        "Digest": "sha256:7ab721ef3305271bbb629a6db065c59bbeb87bc53e7cbf88e2953a1217ba7322",
        "RepoTags": [],
        "Created": "2020-02-11T12:14:18.612461174Z",
        "DockerVersion": "",
        "Labels": null,
        "Architecture": "amd64",
        "Os": "linux",
        "Layers": [
            "sha256:1ae73d938ab9f11718d0f6a4148eb07d38ac1c0a70b1d03e751de8bf3c2c87fa",
            "sha256:9fe966885cb8712c47efe5ecc2eaa0797a0d5ffb8b119c4bd4b400cc9e255421",
            "sha256:61b2527a4b836a4efbb82dfd449c0556c0f769570a6c02e112f88f8bbcd90166",
            ...
            "sha256:cc56c782b513e2bdd2cc2af77b69e13df4ab624ddb856c4d086206b46b9b9e5f",
            "sha256:dcf9396fdada4e6c1ce667b306b7f08a83c9e6b39d0955c481b8ea5b2a465b32",
            "sha256:feb6d2ae252402ea6a6fca8a158a7d32c7e4572db0e6e5a5eab15d4e0777951e"
        ],
        "Env": null
    }
  3. すべてのコンテンツを展開します。

    $ cd $HOME/TEST
    $ for f in $(ls); do tar xvf $f; done
  4. 結果を確認します。

    $ find blobs/ rpm_dir/
    blobs/
    blobs/sha256
    blobs/sha256/10914f1fff060ce31388f5ab963871870535aaaa551629f5ad182384d60fdf82
    rpm_dir/
    rpm_dir/gzip-1.9-4.el8.src.rpm

    結果が正しい場合は、イメージを使用できる状態になります。

    注記

    コンテナーイメージがリリースされてから、関連するソースコンテナーが利用可能になるまでに数時間かかる場合があります。

    詳細は、システム上の skopeo-copy (1) および skopeo-inspect(1) の man ページを参照してください。

第8章 コンテナーイメージへの署名

Red Hat Enterprise Linux でコンテナーイメージに署名することで、イメージの真正性と完全性を確保できます。イメージに署名するには、sigstore 署名を使用します。この署名方法は、OCI 準拠のコンテナーレジストリーであればどれでも互換性があります。Podman を使用して、リモートレジストリーにプッシュする前にイメージに署名し、署名されていないイメージが拒否されるようにコンシューマーを設定できます。

sigstore 署名は、署名をコンテナーレジストリーに保存するため、個別のルックアサイドサーバーを用意する必要がありません。コンテナーイメージに署名すると、サプライチェーンへの攻撃を防ぐことができます。

8.1. 秘密鍵を使用した sigstore 署名によるコンテナーイメージの署名

Red Hat Enterprise Linux (RHEL) 上で秘密鍵を使用して sigstore 署名でコンテナーイメージに署名するには、ローカルで管理されている鍵ペアを使用して Podman ツールを使用します。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. sigstore の公開鍵または秘密鍵のペアを生成します。

    $ skopeo generate-sigstore-key --output-prefix myKey.private
  2. 次の内容を /etc/containers/registries.d/default.yaml ファイルに追加します。

    docker:
        <registry>:
            use-sigstore-attachments: true

    use-sigstore-attachments オプションを設定することで、Podman と Skopeo はコンテナーの sigstore 署名をイメージと共に読み書きし、署名されたイメージと同じリポジトリーに保存できます。

    /etc/containers/registries.d/default.yaml ファイルで、システム全体のレジストリー設定を編集できます。/etc/containers/registries.d ディレクトリーにある任意の YAML ファイルのレジストリーまたはリポジトリー設定セクションを編集することもできます。

    すべての YAML ファイルが読み取られ、ファイル名は任意です。単一のスコープ (default-docker、registry、または namespace) は、/etc/containers/registries.d/ ディレクトリー内の 1 つのファイルにのみ存在できます。

  3. カレントディレクトリーの Containerfile を使用して、コンテナーイメージをビルドします。

    $ podman build -t <registry>/<namespace>/<image>
  4. イメージに署名し、レジストリーにプッシュします。

    $ podman push --sign-by-sigstore-private-key ./myKey.private <registry>/<namespace>/<image>

    podman push コマンドは、<registry>/<namespace>/<image> ローカルイメージを <registry>/<namespace>/<image> としてリモートレジストリーにプッシュします。--sign-by-sigstore-private-key オプションは、myKey.private 秘密鍵を使用して sigstore 署名を <registry>/<namespace>/<image> イメージに追加します。イメージと sigstore 署名がリモートレジストリーにアップロードされます。

    注記

    既存のイメージをコンテナーレジストリー間で移動するときに署名する必要がある場合は、skopeo copy コマンドを使用できます。

    詳細は、お使いのシステムの podman-push(1) および podman-build(1) の man ページを参照してください。

検証

  • イメージをプルします。

    $ podman pull <registry>/<namespace>/<image>

    先ほど設定した署名の存在を強制するには、podman pull コマンドを実行する必要があります。設定済みのレジストリーから、署名されていないイメージ、または誤ったキーで署名されたイメージを取得しようとすると、コマンドは失敗します。

8.2. Fulcio と Rekor を使用した sigstore 署名によるコンテナーイメージの署名

Fulcio および Rekor サーバーを使用すると、秘密鍵を手動で管理する代わりに、OpenID Connect (OIDC) サーバー認証に基づく短期証明書を使用して署名を作成できます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • Fulcio (https://<your-fulcio-server>) サーバーと Rekor (https://<your-rekor-server>) サーバーが実行および設定されている。
  • Podman がインストールされている。

手順

  1. 次の内容を /etc/containers/registries.conf.d/default.yaml ファイルに追加します。

    docker:
        <registry>:
            use-sigstore-attachments: true

    use-sigstore-attachments オプションを設定することで、Podman と Skopeo はコンテナーの sigstore 署名をイメージと共に読み書きし、署名されたイメージと同じリポジトリーに保存できます。

    /etc/containers/registries.d/ ディレクトリー内の任意の YAML ファイルのレジストリーまたはリポジトリー設定セクションを編集できます。単一のスコープ (default-docker、registry、または namespace) は、/etc/containers/registries.d/ ディレクトリー内の 1 つのファイルにのみ存在できます。

    /etc/containers/registries.d/default.yaml ファイルでシステム全体のレジストリー設定を編集することもできます。すべての YAML ファイルが読み取られ、ファイル名は任意であることに注意してください。

  2. /etc/containers/registries.d/file.yml ファイルを作成します。

    fulcio:
      fulcioURL: "https://<your-fulcio-server>"
      oidcMode: "interactive"
      oidcIssuerURL: "https://<your-OIDC-provider>"
      oidcClientID: "sigstore"
    rekorURL: "https://<your-rekor-server>"

    file.yml は、sigstore 署名の作成に必要なオプションを保存するために使用される sigstore 署名パラメーター YAML ファイルです。

  3. イメージに署名し、レジストリーにプッシュします。

    $ podman push --sign-by-sigstore=file.yml <registry>/<namespace>/<image>

    あるいは、同様の --sign-by-sigstore オプションを指定して skopeo copy コマンドを使用して、既存のイメージをコンテナーレジストリー間で移動しながら署名することもできます。

    警告

    パブリックサーバーへの送信には、公開鍵、証明書、および署名メタデータが含まれる点に注意してください。

    詳細は、システム上の containers-sigstore-signing-params.yamlpodman-push(1)、および container-registries.d の man ページを参照してください。

検証

  • イメージをプルします。

    $ podman pull <registry>/<namespace>/<image>

    先ほど設定した署名の存在を強制するには、podman pull コマンドを実行する必要があります。設定済みのレジストリーから、署名されていないイメージ、または誤ったキーで署名されたイメージを取得しようとすると、コマンドは失敗します。

8.3. 秘密鍵と Rekor を使用した sigstore 署名によるコンテナーイメージの署名

イメージの完全性を確保し、ソフトウェアサプライチェーンの来歴を認証するために、Red Hat Enterprise Linux (RHEL) 上で、sigstore と秘密鍵、および Rekor を使用してコンテナーイメージに署名できます。このプロセスには、鍵ペアの生成、秘密鍵によるイメージの署名、および透明性ログに Rekor を使用するようにシステムを設定することが含まれます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. sigstore の公開鍵または秘密鍵のペアを生成します。

    $ skopeo generate-sigstore-key --output-prefix myKey.private

    公開鍵と秘密鍵 myKey.pubmyKey.private が生成されます。

  2. 以下を /etc/containers/registries.conf.d/default.yaml ファイルに追加します。

    docker:
        <registry>:
            use-sigstore-attachments: true

    use-sigstore-attachments オプションを設定することで、Podman と Skopeo はコンテナーの sigstore 署名をイメージと共に読み書きし、署名されたイメージと同じリポジトリーに保存できます。

    注記

    /etc/containers/registries.d/ ディレクトリー内の任意の YAML ファイルのレジストリーまたはリポジトリー設定セクションを編集できます。単一のスコープ (default-docker、registry、または namespace) は、/etc/containers/registries.d/ ディレクトリー内の 1 つのファイルにのみ存在できます。/etc/containers/registries.d/default.yaml ファイルでシステム全体のレジストリー設定を編集することもできます。すべての YAML ファイルが読み取られ、ファイル名は任意であることに注意してください。

  3. カレントディレクトリーの Containerfile を使用して、コンテナーイメージをビルドします。

    $ podman build -t <registry>/<namespace>/<image>
  4. /etc/containers/registries.d/file.yml ファイルを作成します。

    privateKeyFile: "/home/user/sigstore/myKey.private"
    privateKeyPassphraseFile: "/mnt/user/sigstore-myKey.private-passphrase"
    rekorURL: "https://<your-rekor-server>"

    file.yml は、sigstore 署名の作成に必要なオプションを保存するために使用される sigstore 署名パラメーター YAML ファイルです。

  5. イメージに署名し、レジストリーにプッシュします。

    $ podman push --sign-by-sigstore=file.yml <registry>/<namespace>/<image>

    あるいは、同様の --sign-by-sigstore オプションを指定して skopeo copy コマンドを使用して、既存のイメージをコンテナーレジストリー間で移動しながら署名することもできます。

    警告

    パブリックサーバーへの送信には、公開鍵に関するデータと署名に関するメタデータが含まれる点に注意してください。

検証

  • イメージをプルします。

    $ podman pull <registry>/<namespace>/<image>

    先ほど設定した署名の存在を強制するには、podman pull コマンドを実行する必要があります。設定済みのレジストリーから、署名されていないイメージ、または誤ったキーで署名されたイメージを取得しようとすると、コマンドは失敗します。

    詳細は、システム上の podman-push(1)podman-build(1)、および container-registries.d の man ページを参照してください。

8.4. GPG 署名を使用したコンテナーイメージへの署名

信頼性を確立し、ソフトウェアの出所を検証するために、GPG 署名を使用して Red Hat Enterprise Linux コンテナーイメージに署名します。これらの暗号署名を適用することで、イメージが改ざんされていない状態を確実に維持し、侵害されたアプリケーションのインフラストラクチャーへのデプロイを防ぐことができます。

前提条件

  • container-tools メタパッケージと GPG ツールがインストールされている。
  • ルックアサイド Web サーバーがセットアップされ、その上でファイルを公開できます。システム全体のレジストリー設定は、/etc/containers/registries.d/default.yaml ファイルで確認できます。lookaside-staging オプションは、署名を書き込むためのファイルパスを参照し、通常、署名を発行するホストで設定されます。

    # cat /etc/containers/registries.d/default.yaml
docker:
    <registry>:
        lookaside: https://registry-lookaside.example.com
        lookaside-staging: file:///var/lib/containers/sigstore

手順

  1. GPG キーを生成します。

    # gpg --full-gen-key
  2. 公開鍵をエクスポートします。

    # gpg --output <path>/key.gpg --armor --export <username@example.com>
  3. カレントディレクトリーの Containerfile を使用して、コンテナーイメージをビルドします。

    $ podman build -t <registry>/<namespace>/<image>

    <registry><namespace>、および <image> をコンテナーイメージ識別子に置き換えます。

  4. イメージに署名し、レジストリーにプッシュします。

     $  podman push \
        --sign-by <username@example.com> \
        <registry>/<namespace>/<image>
    注記

    既存のイメージをコンテナーレジストリー間で移動するときに署名する必要がある場合は、skopeo copy コマンドを使用できます。

  5. オプション: 新しいイメージ署名を表示します。

    # (cd /var/lib/containers/sigstore/; find . -type f)
    ./<image>@sha256=<digest>/signature-1
  6. ローカル署名をルックアサイド Web サーバーにコピーします。

    # rsync -a /var/lib/containers/sigstore <user@registry-lookaside.example.com>:/registry-lookaside/webroot/sigstore

    署名は、lookaside-staging オプションによって決定される場所 (この場合は /var/lib/containers/sigstore ディレクトリー) に保存されます。

検証

  • イメージをプルします。

    $ podman pull <registry>/<namespace>/<image>

    先ほど設定した署名の存在を強制するには、podman pull コマンドを実行する必要があります。設定済みのレジストリーから、署名されていないイメージ、または誤ったキーで署名されたイメージを取得しようとすると、コマンドは失敗します。

    詳細は、システム上の podman-image-trust(1)podman-push(1)、および podman-build(1) の man ページを参照してください。

8.5. Sequoia PGP を使用した Podman でのコンテナーイメージの署名

バックエンドを Sequoia PGP に切り替えることで、最新の耐量子計算機暗号 (PQC) アルゴリズムを使用して、イメージ署名の検証を向上させることができます。既存の GnuPG ワークフローは引き続き署名に利用可能です。

前提条件

  • container-tools メタパッケージがインストールされている。
  • podman-sequoiasequoia-sq、および sequoia-sqv パッケージがインストールされている。

手順

  1. 現在のディレクトリーで Containerfile を使用してコンテナーイメージをビルドします。

    $ podman build -t <registry>/<namespace>/<image>
  2. キーを生成します。

    # sq key generate --own-key --email <test@example.com> --name <namspace>
  3. 証明書をエクスポートします。

    # sq cert export --cert=<fingerprint_or_key_ID> --output mycerts/sequoia-key.pub
  4. policy.json ファイルを有効なキーを指すように設定します。
  5. キーを使用してイメージに署名してプッシュします。

    $ podman push --sign-by-sq-fingerprint <fingerprint> /<registry>/<namespace>/<image>

検証

  • イメージをプルします。

    $ podman pull <registry>/<namespace>/<image>

    先ほど設定した署名の存在を強制するには、podman pull コマンドを実行する必要があります。設定済みのレジストリーから、署名されていないイメージ、または誤ったキーで署名されたイメージを取得しようとすると、コマンドは失敗します。

第9章 Pod の使用

関連するコンテナーを Pod としてグループ化することで、名前空間やリソースを共有できるようになります。OpenShift や Kubernetes における最小の計算単位である Pod を使用することで、複数のコンテナーを 1 つの単位として管理できます。

9.1. Pod の作成

ネットワークとストレージのリソースを共有するには、コンテナーを Pod に追加します。各 Podman Pod にはインフラストラクチャーコンテナーが含まれています。このインフラストラクチャーコンテナーは名前空間を管理し、他のコンテナーが接続、起動、停止できるようにすることで、Pod の実行状態を維持します。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. 空の Pod を作成します。

    $ podman pod create --name mypod
    223df6b390b4ea87a090a4b5207f7b9b003187a6960bd37631ae9bc12c433aff
    The pod is in the initial state Created.

    Pod の初期状態は Created です。

  2. 必要に応じて、すべての Pod をリスト表示します。

    $ podman pod ps
    POD ID         NAME    STATUS    CREATED                  # OF CONTAINERS   INFRA ID
    223df6b390b4   mypod   Created   Less than a second ago   1                 3afdcd93de3e

    Pod にはコンテナーが 1 つあることに注意してください。

  3. 必要に応じて、関連付けられている全 Pod およびコンテナーをリスト表示します。

    $ podman ps -a --pod
    CONTAINER ID  IMAGE                 COMMAND  CREATED                 STATUS   PORTS  NAMES               POD
    3afdcd93de3e  registry.access.redhat.com/ubi10/pause            Less than a second ago  Created         223df6b390b4-infra  223df6b390b4

    podman ps コマンドからの Pod ID と podman pod ps コマンドの Pod ID が一致することが確認できます。デフォルトの infra コンテナーは registry.access.redhat.com/ubi10/pause イメージをベースとしています。

  4. mypod という名前の既存 Pod 内で、名前が myubi のコンテナーを実行します。

    $ podman run -dt --name myubi --pod mypod registry.access.redhat.com/ubi10/ubi /bin/bash
    5df5c48fea87860cf75822ceab8370548b04c78be9fc156570949013863ccf71
  5. 必要に応じて、すべての Pod をリスト表示します。

    $ podman pod ps
    POD ID         NAME    STATUS    CREATED                  # OF CONTAINERS   INFRA ID
    223df6b390b4   mypod   Running   Less than a second ago   2                 3afdcd93de3e

    Pod にはコンテナーが 2 つあることが分かります。

  6. 必要に応じて、関連付けられている全 Pod およびコンテナーをリスト表示します。

    $ podman ps -a --pod
    CONTAINER ID  IMAGE                                       COMMAND    CREATED                 STATUS                     PORTS  NAMES               POD
    5df5c48fea87  registry.access.redhat.com/ubi10/ubi:latest  /bin/bash  Less than a second ago  Up Less than a second ago         myubi               223df6b390b4
    3afdcd93de3e  registry.access.redhat.com/ubi10/pause                                   Less than a second ago  Up Less than a second ago         223df6b390b4-infra  223df6b390b4

9.2. Pod 情報の表示

Pod のステータスや関連コンテナーなど、Pod に関する詳細情報を表示します。これは、Pod グループの健全性と設定を監視するために役立ちます。

注記

Podman v5.0.0 以降では、Pod の数に関係なく、Pod の出力は常に JSON 配列になります。

詳細は、システム上の podman-pod-top(1)podman-pod-stats(1)、および podman-pod-inspect(1) man ページを参照してください。

前提条件

  • container-tools メタパッケージがインストールされている。
  • Pod が作成されている。詳細は、Pod の作成 セクションを参照してください。

手順

  • Pod で実行されているアクティブなプロセスを表示します。

    • Pod 内のコンテナーで実行中のプロセスを表示するには、以下を入力します。

      $ podman pod top mypod
      USER   PID   PPID   %CPU    ELAPSED         TTY     TIME   COMMAND
      0      1     0      0.000   24.077433518s   ?       0s     /pause
      root   1     0      0.000   24.078146025s   pts/0   0s     /bin/bash
    • 1 つ以上の Pod のコンテナーにおけるリソース使用状況の統計をライブストリームで表示するには、以下を入力します。

      $ podman pod stats -a --no-stream
      ID             NAME              CPU %   MEM USAGE / LIMIT   MEM %   NET IO    BLOCK IO   PIDS
      a9f807ffaacd   frosty_hodgkin    --      3.092MB / 16.7GB    0.02%   -- / --   -- / --    2
      3b33001239ee   sleepy_stallman   --      -- / --             --      -- / --   -- / --    --
    • Pod に関する情報を表示するには、以下を入力します。

      $ podman pod inspect --format json <POD_ID_1> <POD_ID_2> <POD_ID_3>
      [
        {
            "CgroupParent": "/libpod_parent",
            "Containers": [
              {
                "ID": "...",
                "State": "..."
              }
            ],
            "Created": "2025-10-16T12:00:00.000000000Z",
            "ID": "673f326c9f69b0d24c0847f97a544c79532817d2a713917812f865f1e8e52a8a",
            "InfraContainerID": "...",
            "Labels": {},
            "Name": "web_pod",
            "State": "Running",
          },
          {
            "CgroupParent": "/libpod_parent",
            "Containers": [
              {
                "ID": "...",
                "State": "..."
              }
            ],
            "Created": "2025-10-16T12:01:00.000000000Z",
            "ID": "a1b2c3d4e5f678901234567890abcdef1234567890abcdef1234567890abcdef",
            "InfraContainerID": "...",
            "Labels": {},
            "Name": "db_pod",
            "State": "Running",
          }
      ]

      Pod 内のコンテナーの情報を確認できます。

9.3. Pod の停止

podman pod stop コマンドを使用して、Pod 全体とその中に含まれるすべてのコンテナーを停止できます。これにより、Pod 内のすべての関連サービスを確実に同時終了できます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • Pod が作成されている。詳細は、Pod の作成 セクションを参照してください。

手順

  1. Pod mypod を停止します。

    $ podman pod stop mypod
  2. 必要に応じて、関連付けられている全 Pod およびコンテナーをリスト表示します。

    $ podman ps -a --pod
    CONTAINER ID  IMAGE                               COMMAND    CREATED             STATUS                    PORTS   NAMES               POD ID        PODNAME
    5df5c48fea87  registry.redhat.io/ubi10/ubi:latest  /bin/bash  About a minute ago  Exited (0) 7 seconds ago          myubi               223df6b390b4  mypod
    
    3afdcd93de3e  registry.access.redhat.com/10/pause                           About a minute ago  Exited (0) 7 seconds ago          8a4e6527ac9d-infra  223df6b390b4  mypod

    Pod mypod およびコンテナー myubi のステータスが "Exited" であることが分かります。

9.4. Pod の削除

停止した Pod は、podman pod rm コマンドを使用して削除します。これにより、システムから Pod 定義とそれに関連するすべてのコンテナーが削除されます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • Pod が停止されている。詳細は、Pod の停止 を参照してください。

手順

  1. 以下を入力して、Pod mypod を削除します。

    $ podman pod rm mypod
    223df6b390b4ea87a090a4b5207f7b9b003187a6960bd37631ae9bc12c433aff

    Pod を削除すると、その Pod 中の全コンテナーが自動的に削除されることに注意してください。

検証

*すべてのコンテナーと Pod が削除されたことを検証します。

$ podman ps
$ podman pod ps

詳細は、システム上の podman-pod-rm(1) man ページを参照してください。

第10章 コンテナーネットワークの管理

コンテナーネットワークを管理し、コンテナーと外部システム間の通信を制御します。Podman を使用すると、ネットワークを作成、検査、管理してトラフィックを分離し、セキュリティーを維持することができます。

10.1. コンテナーネットワークのリストアップ

root 環境とルートレス環境の両方について、ネットワーク名、ドライバー、その他の設定の詳細を表示するには、利用可能なコンテナーネットワークを表示します。

Podman には、ルートレスとルートフルという 2 つのネットワーク動作があります: * ルートレスネットワーク: このネットワークは自動的にセットアップされ、コンテナーには IP アドレスがありません。* ルートフルネットワーク: このコンテナーには IP アドレスがあります。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • ルートユーザーで全ネットワークをリスト表示します。

    # podman network ls
    NETWORK ID    NAME        VERSION     PLUGINS
    2f259bab93aa  podman      0.4.0       bridge,portmap,firewall,tuning
    • デフォルトでは、Podman はブリッジネットワークを提供します。
    • ルートレスユーザーのネットワークリストは、ルートフルユーザーと同じです。

      詳細は、システム上の podman-network-ls(1) man ページを参照してください。

10.2. ネットワークの検査

podman network inspect コマンドを使用して、特定のネットワークの詳細な設定を表示します。これにより、サブネット、ゲートウェイ、有効になっているプラグインなどの設定が明確になります。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • デフォルトの podman ネットワークを調べます。

    $ podman network inspect podman
    [
        {
            "cniVersion": "0.4.0",
            "name": "podman",
            "plugins": [
                {
                    "bridge": "cni-podman0",
                    "hairpinMode": true,
                    "ipMasq": true,
                    "ipam": {
                        "ranges": [
                            [
                                {
                                    "gateway": "10.88.0.1",
                                    "subnet": "10.88.0.0/16"
                                }
                            ]
                        ],
                        "routes": [
                            {
                                "dst": "0.0.0.0/0"
                            }
                        ],
                        "type": "host-local"
                    },
                    "isGateway": true,
                    "type": "bridge"
                },
                {
                    "capabilities": {
                        "portMappings": true
                    },
                    "type": "portmap"
                },
                {
                    "type": "firewall"
                },
                {
                    "type": "tuning"
                }
            ]
        }
    ]

    IP 範囲、有効なプラグイン、ネットワークの種類など、ネットワークの設定を確認できます。

    詳細は、システム上の podman-network-inspect(1) man ページを参照してください。

10.3. ネットワークの作成

podman network create コマンドを使用して、コンテナー用のカスタムネットワークを作成します。外部アクセスを設定したり、コンテナー間のセキュアな通信のために分離された内部ネットワークを作成したりできます。

デフォルトでは、Podman は外部ネットワークを作成します。コンテナーがホスト上の他のコンテナーと通信できるものの、ホスト外部のネットワークには接続できない内部ネットワークを作成できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • mynet という名前の外部ネットワークを作成します。

    # podman network create mynet
    /etc/cni/net.d/mynet.conflist

検証

  • すべてのネットワークをリストアップします。

    # podman network ls
    NETWORK ID    NAME        VERSION     PLUGINS
    2f259bab93aa  podman      0.4.0       bridge,portmap,firewall,tuning
    11c844f95e28  mynet       0.4.0       bridge,portmap,firewall,tuning,dnsname

    作成された mynet ネットワークとデフォルトの podman ネットワークを確認できます。

注記

Podman 4.0 以降では、podman network create コマンドを使用して新しい外部ネットワークを作成すると、DNS プラグインがデフォルトで有効になります。

詳細は、システム上の podman-network-create(1) man ページを参照してください。

10.4. コンテナーのネットワークへの接続

コンテナーが複数のネットワーク上で同時に通信できるようにするには、podman network connect コマンドを使用して、実行中のコンテナーを別のネットワークにアタッチします。

前提条件

  • container-tools メタパッケージがインストールされている。
  • podman network create コマンドを使用してネットワークが作成さている。
  • コンテナーが作成されている。

手順

  • mycontainer という名前のコンテナーを mynet という名前のネットワークに接続します。

    # podman network connect mynet mycontainer

検証

  • mycontainermynet ネットワークに接続されていることを確認します。

    # podman inspect --format='{{.NetworkSettings.Networks}}' mycontainer
    map[podman:0xc00042ab40 mynet:0xc00042ac60]

    mycontainermynetpodman のネットワークに接続されていることがわかります。

10.5. コンテナーのネットワークからの切断

podman network disconnect コマンドを使用して、コンテナーを特定のネットワークからデタッチします。これにより、コンテナー自体を停止することなく、コンテナーがそのネットワーク上で通信することを阻止できます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • podman network create コマンドを使用してネットワークが作成さている。
  • コンテナーがネットワークに接続されている。

手順

  • mycontainer というコンテナーを mynet というネットワークから切り離します。

    # podman network disconnect mynet mycontainer

検証

  • mycontainermynet ネットワークから切断されていることを確認します。

    # podman inspect --format='{{.NetworkSettings.Networks}}' mycontainer
    map[podman:0xc000537440]

    mycontainermynet ネットワークから切断され、mycontainer がデフォルトの podman ネットワークにのみ接続されていることがわかります。

    詳細は、システム上の podman-network-disconnect(1) man ページを参照してください。

10.6. ネットワークの削除

podman network rm コマンドを使用して、使用されていないネットワークを削除します。いずれかのコンテナーによって使用されているネットワークは削除できないことに注意してください。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. すべてのネットワークをリストアップします。

    # podman network ls
    NETWORK ID    NAME        VERSION     PLUGINS
    2f259bab93aa  podman      0.4.0       bridge,portmap,firewall,tuning
    11c844f95e28  mynet       0.4.0       bridge,portmap,firewall,tuning,dnsname
  2. mynet ネットワークを削除します。

    # podman network rm mynet
    mynet
    注記

    削除されたネットワークにコンテナーが関連付けられている場合は、podman network rm -f コマンドを使用してコンテナーと Pod を削除する必要があります。

検証

  • mynet ネットワークが削除されたかどうかを確認します。

    # podman network ls
    NETWORK ID    NAME        VERSION     PLUGINS
    2f259bab93aa  podman      0.4.0       bridge,portmap,firewall,tuning

    詳細は、システム上の podman-network-rm(1) man ページを参照してください。

10.7. 未使用の全ネットワークの削除

podman network prune で、使われていないネットワークをすべて削除してください。未使用のネットワークとは、コンテナーが接続されていないネットワークのことです。podman network prune コマンドでは、デフォルトの podman ネットワークは削除されません。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • 未使用のネットワークをすべて削除します。

    # podman network prune
    WARNING! This will remove all networks not used by at least one container.
    Are you sure you want to continue? [y/N] y

検証

  • すべてのネットワークが削除されたことを確認します。

    # podman network ls
    NETWORK ID    NAME        VERSION     PLUGINS
    2f259bab93aa  podman      0.4.0       bridge,portmap,firewall,tuning

    詳細は、システム上の podman-network-prune(1) man ページを参照してください。

第11章 コンテナー間の通信

コンテナー間、ホスト間、および外部アプリケーション間の通信を可能にします。ポートマッピング、DNS 解決、Pod ネットワークなどの方法を使用して、接続性を管理できます。

11.1. ネットワークモードとレイヤー

Podman で使用可能なネットワークモード (ブリッジ、ホスト、slirp4netns など) について説明します。適切なモードを選択することで、コンテナーがネットワークスタックと対話する方法が決まります。

Podman は以下のネットワークモードとオプションを使用します。

  • bridge: デフォルトのブリッジネットワーク上に別のネットワークを作成します。
  • container:<id> - id が <id> のコンテナーと同じネットワークを使用します。
  • host: ホストネットワークスタックを使用します。
  • network-id: podman network create コマンドで作成されたユーザー定義のネットワークを使用します。
  • private: コンテナーの新しいネットワークを作成します。
  • slirp4netns: ルートレスコンテナーのデフォルトオプションである slirp4netns を使用してユーザーネットワークスタックを作成します。
  • pasta: slirp4netns の高性能な代替品。Podman v4.4.1 以降では pasta を使用できます。
  • none: コンテナーのネットワークの namespace を作成しますが、ネットワークインターフェイスは設定しません。コンテナーにはネットワーク接続がありません。
  • ns:<path>: 参加するネットワーク namespace へのパス

    注記

    ホストモードでは、D-bus (コンテナーはプロセス間通信 (IPC) システム) などのローカルシステムサービスにフルアクセスできるため、セキュアでないと考えられています。

11.2. slirp4netns と pasta の違い

pastaslirp4netns のネットワークモードの主な違いについて説明します。

slirp4netns と比較した pasta ネットワークモードの顕著な違いは次のとおりです。

  • pasta は、IPv6 ポート転送をサポートしています。
  • pasta は、slirp4netns よりも効率的です。
  • pasta は、ホストから IP アドレスをコピーしますが、slirp4netns は定義済みの IPv4 アドレスを使用します。
  • pasta は、ホストからのインターフェイス名を使用しますが、slirp4netns はインターフェイス名として tap0 を使用します。
  • pasta は、ホストからのゲートウェイアドレスを使用しますが、slirp4netns は、独自のゲートウェイアドレスを定義して NAT を使用します。
注記

ルートレスコンテナーのデフォルトのネットワークモードは pasta です。

11.3. ネットワークモードの設定

コンテナーの起動時に、podman run コマンドに --network オプションを指定して、コンテナーのネットワーク設定を指定します。ホストネットワークなどのモードを選択したり、カスタムブリッジにアタッチしたりできます。

前提条件

  • container-tools モジュールがインストールされている。

手順

  1. オプション: pasta ネットワークモードを使用する場合は、passt パッケージをインストールします。

    $ {PackageManager} install passt
  2. registry.access.redhat.com/ubi10/ubi イメージをベースとするコンテナーを実行します。

    $ podman run --network=<network_mode> -d --name=myubi registry.access.redhat.com/ubi10/ubi

    <network_mode> は、必要なネットワークモードです。あるいは、containers.conf ファイルの default_rootless_network_cmd オプションを使用して、デフォルトのネットワークモードを切り替えることもできます。

    注記

    ルートレスコンテナーのデフォルトのネットワークモードは pasta です。

検証

  • ネットワークモードの設定を確認します。

    $ podman inspect --format {{.HostConfig.NetworkMode}} myubi
    <netwok_mode>

11.4. コンテナーのネットワーク設定の検査

接続に関する問題をトラブルシューティングするには、Red Hat Enterprise Linux コンテナーのネットワーク設定を確認してください。IP アドレス、ポート、ゲートウェイなどの設定の詳細を確認することで、環境を検証し、分離されたサービスが効果的に通信していることを確認できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. コンテナーの IP アドレスを表示します。

    # podman inspect --format='{{.NetworkSettings.IPAddress}}' <containerName>
  2. コンテナーが接続されている全ネットワークを表示します。

    # podman inspect --format='{{.NetworkSettings.Networks}}' <containerName>
  3. ポートマッピングを表示します。

    # podman inspect --format='{{.NetworkSettings.Ports}}' <containerName>

11.5. コンテナーとアプリケーション間の通信

コンテナーとアプリケーションの間で通信を行うことができます。アプリケーションのポートは、リスニング状態かオープン状態のどちらかです。これらのポートは自動的にコンテナーネットワークに公開されるため、このようなネットワークを使用してコンテナーに到達できます。デフォルトでは、Web サーバーはポート 80 でリッスンします。この手順例では、myubi コンテナーは web-container アプリケーションと通信を行います。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. web-container という名前のコンテナーを起動します。

    # podman run -dt --name=web-container docker.io/library/httpd
  2. すべてのコンテナーをリスト表示します。

    # podman ps -a
    
    CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS       NAMES
    b8c057333513  docker.io/library/httpd:latest  httpd-foreground  4 seconds ago  Up 5 seconds ago              web-container
  3. コンテナーを点検し、IP アドレスを表示します。

    # podman inspect --format='{{.NetworkSettings.IPAddress}}' web-container
    
    10.88.0.2
  4. myubi コンテナーを実行し、Web サーバーが動作していることを確認します。

    # podman run -it --name=myubi ubi10/ubi curl 10.88.0.2:80

11.6. コンテナーとホスト間の通信

ブリッジネットワーク上でコンテナーの IP アドレスを使用して、ホストからコンテナーに通信します。コンテナー内で実行されているサービスには、ホストから直接アクセスできます。

デフォルトでは、podman ネットワークはブリッジネットワークです。つまり、ネットワークデバイスがコンテナーネットワークとホストネットワークをつなぎます。

前提条件

手順

  1. ブリッジが設定されていることを確認します。

    # podman network inspect podman | grep bridge
    
        "type": "bridge"
  2. ホストネットワークの設定を表示します。

    # ip addr show cni-podman0
    
    6: podman0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 62:af:a1:0a:ca:2e brd ff:ff:ff:ff:ff:ff
        inet 10.88.0.1/16 brd 10.88.255.255 scope global podman0
           valid_lft forever preferred_lft forever
        inet6 fe80::60af:a1ff:fe0a:ca2e/64 scope link
           valid_lft forever preferred_lft forever

    web-containerpodman0 サブネットの IP が指定されており、ネットワークがホストにブリッジされていることがわかります。

  3. web-container をチェックし、その IP アドレスを表示します。

    # podman inspect --format='{{.NetworkSettings.IPAddress}}' web-container
    
    10.88.0.2
  4. ホストから直接 web-container にアクセスします。

    $ curl 10.88.0.2:80

11.7. ポートマッピングを使用したコンテナー間の通信

分離されたサービスと外部クライアント間の通信を有効化するには、ネットワークポートを Red Hat Enterprise Linux コンテナーにマッピングします。ポートマッピングを設定することで、特定のコンテナー化されたアプリケーションをセキュアに公開し、環境への受信トラフィックの流れを正確に制御できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. 未公開のコンテナーを実行します。

    # podman run -dt --name=web1 ubi10/httpd-24
  2. 自動的に公開されたコンテナーを実行します。

    # podman run -dt --name=web2 -P ubi10/httpd-24
  3. 手動で公開したコンテナーを実行し、コンテナーポート 8080 を公開します。

    # podman run -dt --name=web3 -p 8888:8080 ubi10/httpd-24
  4. すべてのコンテナーをリスト表示します。

    # podman ps
    
    CONTAINER ID  IMAGE                                            COMMAND               CREATED         STATUS         PORTS                                             NAMES
    db23e8dabc74  registry.access.redhat.com/ubi10/httpd-24:latest  /usr/bin/run-http...  23 seconds ago  Up 23 seconds  8080/tcp, 8443/tcp                                web1
    1824b8f0a64b  registry.access.redhat.com/ubi10/httpd-24:latest  /usr/bin/run-http...  18 seconds ago  Up 18 seconds  0.0.0.0:33127->8080/tcp, 0.0.0.0:37679->8443/tcp  web2
    39de784d917a  registry.access.redhat.com/ubi10/httpd-24:latest  /usr/bin/run-http...  5 seconds ago  Up 5 seconds  0.0.0.0:8888->8080/tcp, 8443/tcp                  web3

    以下が確認できます。

    • コンテナー web1 には公開ポートがなく、コンテナーネットワークまたはブリッジにでのみアクセスできます。
    • コンテナー web2 は、ポート 33127 と 37679 を自動的にマッピングして、それぞれアプリケーションポート 8080 と 8443 を公開します。

      registry.access.redhat.com/ubi10/httpd-24:latest イメージの ContainerfileEXPOSE 8080EXPOSE 8443 コマンドがあるため、自動ポートマッピングが可能です。

    • コンテナー web3 は手動でポートを公開しています。ホストポート 8888 はコンテナーポート 8080 にマッピングされています。
  5. web1web3 コンテナーの IP アドレスを表示します。

    # podman inspect --format='{{.NetworkSettings.IPAddress}}' web1
    # podman inspect --format='{{.NetworkSettings.IPAddress}}' web3
  6. <IP>:<port> 表記を使用して web1 コンテナーに到達します。

    # curl 10.88.0.2:8080
    ...
    <title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title>
    ...
  7. localhost:<port> 表記を使用して web2 コンテナーに到達します。

    # curl localhost:43595
    ...
    <title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title>
    ...
  8. <IP>:<port> 表記を使用して web3 コンテナーに到達します:

    # curl 10.88.0.4:8080
    ...
    <title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title>
    ...

11.8. DNS を利用したコンテナー間の通信

DNS プラグインが有効な場合に、コンテナー名を使用してコンテナーのアドレスを指定します。

前提条件

  • container-tools メタパッケージがインストールされている。
  • DNS プラグインを有効にしたネットワークが podman network create コマンドで作成されている。

手順

  1. mynet ネットワークに接続された receiver コンテナーを実行します。

    # podman run -d --net mynet --name receiver ubi10 sleep 3000
  2. sender コンテナーを実行し、その名前で receiver コンテナーにアクセスします。

    # podman run -it --rm --net mynet --name sender alpine ping receiver
    
    PING rcv01 (10.89.0.2): 56 data bytes
    64 bytes from 10.89.0.2: seq=0 ttl=42 time=0.041 ms
    64 bytes from 10.89.0.2: seq=1 ttl=42 time=0.125 ms
    64 bytes from 10.89.0.2: seq=2 ttl=42 time=0.109 ms

    CTRL+C で終了します。

    sender コンテナーは、receiver コンテナーの名前を使用して ping を送信できることがわかります。

11.9. Pod 内の 2 つのコンテナー間での通信

同じ Pod 内のコンテナーはすべて、IP アドレス、MAC アドレス、およびポートマッピングを共有します。同じ Pod 内のコンテナー間では、localhost:port の表記で通信が可能です。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. web-pod という名前の Pod を作成します。

    $ podman pod create --name=web-pod
  2. web-container という名前の Web コンテナーを Pod で実行します。

    $ podman container run -d --pod web-pod --name=web-container docker.io/library/httpd
  3. 関連付けられている全 Pod およびコンテナーをリスト表示します。

    $ podman ps --pod
    
    CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS       NAMES               POD ID        PODNAME
    58653cf0cf09  k8s.gcr.io/pause:3.5                              4 minutes ago  Up 3 minutes ago              4e61a300c194-infra  4e61a300c194  web-pod
    b3f4255afdb3  docker.io/library/httpd:latest  httpd-foreground  3 minutes ago  Up 3 minutes ago              web-container  4e61a300c194  web-pod
  4. docker.io/library/fedora イメージを元に、web-pod でコンテナーを実行します。

    $ podman container run -it --rm --pod web-pod docker.io/library/fedora curl localhost

    コンテナーが web-container に到達できることがわかります。

11.10. Pod での通信

Pod レベルでポートを公開することで、Pod 内で実行されているサービスを公開します。Pod 内のコンテナーは、公開されたポートを共有します。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. web-pod という名前の Pod を作成します。

    # podman pod create --name=web-pod-publish -p 80:80
  2. すべての Pod をリスト表示します。

    # podman pod ls
    
    POD ID        NAME         STATUS   CREATED        INFRA ID      # OF CONTAINERS
    26fe5de43ab3  web-pod-publish Created  5 seconds ago  7de09076d2b3  1
  3. web-podweb-container という名前の Web コンテナーを実行します。

    # podman container run -d --pod web-pod-publish --name=web-container docker.io/library/httpd
  4. コンテナーの一覧を表示します。

    # podman ps
    
    CONTAINER ID  IMAGE                    COMMAND           CREATED             STATUS             PORTS               NAMES
    7de09076d2b3  k8s.gcr.io/pause:3.5                       About a minute ago  Up 23 seconds ago  0.0.0.0:80->80/tcp  26fe5de43ab3-infra
    088befb90e59  docker.io/library/httpd  httpd-foreground  23 seconds ago      Up 23 seconds ago  0.0.0.0:80->80/tcp  web-container
  5. web-container に到達できることを確認します。

    $ curl localhost:80

11.11. コンテナーネットワークへの Pod のアタッチ

Pod を作成する際に、特定のネットワークに接続します。その後 Pod に追加されたすべてのコンテナーは、自動的にそのネットワークに参加します。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. pod-net という名前のネットワークを作成します。

    # podman network create pod-net
    
    /etc/cni/net.d/pod-net.conflist
  2. Pod web-pod を作成します。

    # podman pod create --net pod-net --name web-pod
  3. web-podweb-container という名前のコンテナーを実行します。

    # podman run -d --pod web-pod --name=web-container docker.io/library/httpd
  4. オプション: コンテナーが関連付けられている Pod を表示します。

    # podman ps -p
    
    CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS       NAMES               POD ID        PODNAME
    b7d6871d018c   registry.access.redhat.com/ubi10/pause:latest                             9 minutes ago  Up 6 minutes ago              a8e7360326ba-infra  a8e7360326ba  web-pod
    645835585e24  docker.io/library/httpd:latest  httpd-foreground  6 minutes ago  Up 6 minutes ago              web-container    a8e7360326ba  web-pod

検証

  • コンテナーに接続されているすべてのネットワークを表示します。

    # podman ps --format="{{.Networks}}"
    
    pod-net

11.12. Podman の HTTP プロキシー変数の設定

プロキシーサーバーの背後でイメージをプルするには、Podman の HTTP プロキシー変数を設定する必要があります。Podman は環境変数 HTTP_PROXY を読み取り、HTTP プロキシー情報を確認します。HTTP プロキシー情報は、環境変数として、または /etc/profile.d で設定できます。

前提条件

  • container-tool メタパッケージがインストールされている。

手順

  • Podman のプロキシー変数を設定します。以下に例を示します。

    • 非認証プロキシー:

      # cat /etc/profile.d/unauthenticated_http_proxy.sh
      export HTTP_PROXY=http://192.168.0.1:3128
      export HTTPS_PROXY=http://192.168.0.1:3128
      export NO_PROXY=example.com,172.5.0.0/16
    • 認証プロキシー:

      # cat /etc/profile.d/authenticated_http_proxy.sh
      export HTTP_PROXY=http://USERNAME:PASSWORD@192.168.0.1:3128
      export HTTPS_PROXY=http://USERNAME:PASSWORD@192.168.0.1:3128
      export NO_PROXY=example.com,172.5.0.0/16

第12章 コンテナーネットワークモードの設定

Podman を使用してコンテナーのネットワークモードを設定し、ワークロードがホストおよび外部ネットワークと通信する方法を定義できます。適切なネットワーク環境を選択することで、特定のアプリケーション要件に合わせた最適なパフォーマンスとセキュリティー分離を実現できます。

12.1. 静的 IP でのコンテナー実行

--ip オプションを使用して、コンテナーに特定の IP アドレスを割り当てます。これは、固定 IP アドレスを必要とするサービスに対して、一貫したネットワークアドレス割り当てを確保するために役立ちます。

podman run コマンドで --ip オプションを指定すると、コンテナーのネットワークインターフェイスが特定の IP アドレスに設定します (例: 10.88.0.44)。podman inspect コマンドを実行して、IP アドレスが正しく設定されていることを確認します。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • コンテナーのネットワークインターフェイスを IP アドレス 10.88.0.44 に設定します。

    # podman run -d --name=myubi --ip=10.88.0.44 registry.access.redhat.com/ubi10/ubi
    efde5f0a8c723f70dd5cb5dc3d5039df3b962fae65575b08662e0d5b5f9fbe85

検証

  • IP アドレスが正しく設定されていることを確認します。

    # podman inspect --format='{{.NetworkSettings.IPAddress}}' myubi
    10.88.0.44

12.2. systemd を使用した Netavark の DHCP プラグインの実行

コンテナーに動的 IP アドレスを割り当てるには、Netavark 用の DHCP プラグインを systemd サービスとして実行します。このプラグインを永続的なサービスとして運用することで、コンテナー化されたワークロードは自動的に一貫したネットワーク接続を維持できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. systemd ソケットを使用して DHCP プロキシーを有効にします。

    systemctl enable --now netavark-dhcp-proxy.socket
    Created symlink /etc/systemd/system/sockets.target.wants/netavark-dhcp-proxy.socket → /usr/lib/systemd/system/netavark-dhcp-proxy.socket.
  2. オプション: ソケットユニットファイルを表示します。

    # cat /usr/lib/systemd/system/netavark-dhcp-proxy.socket
    [Unit]
    Description=Netavark DHCP proxy socket
    
    [Socket]
    ListenStream=%t/podman/nv-proxy.sock
    SocketMode=0660
    
    [Install]
    WantedBy=sockets.target
  3. macvlan ネットワークを作成し、それを使用してホストインターフェイスを指定します。通常、これは外部インターフェイスです。

    # podman network create -d macvlan --interface-name <LAN_INTERFACE> mv1
    mv1
  4. 新しく作成したネットワークを使用してコンテナーを実行します。

    # podman run --rm --network mv1 -d --name test alpine top
    894ae3b6b1081aca2a5d90a9855568eaa533c08a174874be59569d4656f9bc45

検証

  1. コンテナーにローカルサブネット上の IP があることを確認します。

    # podman exec test ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
        link/ether 5a:30:72:bf:13:76 brd ff:ff:ff:ff:ff:ff
        inet 192.168.188.36/24 brd 192.168.188.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::5830:72ff:febf:1376/64 scope link
           valid_lft forever preferred_lft forever
  2. コンテナーを検査して、正しい IP アドレスが使用されていることを確認します。

    # podman container inspect test --format {{.NetworkSettings.Networks.mv1.IPAddress}}
    192.168.188.36
    注記

    この IP アドレスへの接続を試みるときは、必ず別のホストから接続してください。macvlan ネットワークを使用する場合、同じホストから接続することはできません。

12.3. MacVLAN プラグイン

macvlan プラグインを使用すると、コンテナーを物理ネットワークインターフェイスに直接接続できます。このプラグインを使用すると、コンテナーはネットワーク上で物理デバイスとして認識されます。

ほとんどのコンテナーイメージには DHCP クライアントが含まれていません。dhcp プラグインは、コンテナーが DHCP サーバーと通信するためのプロキシー DHCP クライアントとして機能します。

ホストシステムは、コンテナーへのネットワークアクセス権限を持っていません。ホスト外部からコンテナーへのネットワーク接続を有効化するには、コンテナーには、ホストと同じネットワーク上に IP が必要です。

macvlan プラグインを使用すると、コンテナーをホストと同じネットワークに接続できます。これはルートフルコンテナーにのみ適用されます。ルートレスコンテナーは macvlan および dhcp プラグインを使用できないためです。

podman network create --driver=macvlan コマンドを使用して、MacVLAN ネットワークを作成できます。

第13章 Podman を使用した systemd へのコンテナーの移植

systemd の統合機能を使用して、コンテナーをシステムサービスとして管理します。この機能を使用すると、標準の systemctl コマンドを使用して、コンテナーの自動起動、依存関係の管理、状態の制御を行うことができます。

Podman は、デーモンレスのコンテナーエンジンであり、Docker CLI と同等のコマンドライン操作が可能です。他のコンテナーエンジンからの移行を簡素化し、Pod、コンテナー、イメージの管理をサポートします。

当初、Podman は Linux システムやサービスの完全な管理を目的として設計されたものではありませんでした。しかし、Red Hat がコンテナーと systemd を統合したことにより、Podman によって構築された OCI および Docker 形式のコンテナーを、systemd 初期化サービスを使用して他の Linux サービスと同様に管理できるようになりました。

systemd ユニットファイルを使用すると、コンテナーや Pod を systemd サービスとして起動したり、実行順序や依存関係を定義したりすることができます。systemctl コマンドを使用することで、それらの状態を制御できます。

13.1. Quadlets を使用した systemd ユニットファイルの自動生成

Quadlet を使用して systemd サービスファイルを自動的に生成します。Quadlet は、コンテナーを記述するシンプルなユニットファイルを作成することで、systemd との統合に伴う複雑さに対処します。

Quadlet を使用する場合、通常の systemd ユニットファイルによく似た形式でコンテナーを実行する方法を記述します。コンテナーの記述は、関連するコンテナーの詳細を中心に行うため、systemd でのコンテナー実行に関する技術的詳細を意識せずに済みます。次のいずれかのディレクトリーに <CTRNAME>.container ユニットファイルを作成します。

  • root ユーザーの場合: /usr/share/containers/systemd/ または /etc/containers/systemd/
  • ルートレスユーザーの場合: $HOME/.config/containers/systemd/$XDG_CONFIG_HOME/containers/systemd//etc/containers/systemd/users/$(UID)、または /etc/containers/systemd/users/

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. mysleep.container ユニットファイルを作成します。

    $ cat $HOME/.config/containers/systemd/mysleep.container
    [Unit]
    Description=The sleep container
    After=local-fs.target
    
    [Container]
    Image=registry.access.redhat.com/ubi10-minimal:latest
    Exec=sleep 1000
    
    [Install]
    # Start by default on boot
    WantedBy=multi-user.target default.target

    [Container] セクションでは、以下を指定する必要があります。

    • Image - 実行するコンテナーイメージ
    • Exec - コンテナー内で実行するコマンド

      systemd ユニットファイルで指定されているその他のフィールドはすべて使用できます。

  2. mysleep.container ファイルに基づいて mysleep.service を作成します。

    $ systemctl --user daemon-reload
  3. オプション: mysleep.service のステータスを確認します。

    $ systemctl --user status mysleep.service
    ○ mysleep.service - The sleep container
    	 Loaded: loaded (/home/username/.config/containers/systemd/mysleep.container; generated)
    	 Active: inactive (dead)
  4. mysleep.service を起動します。

    $ systemctl --user start mysleep.service
    注記

    Quadlet は Podman v4.6 以降で利用可能です。

検証

  1. mysleep.service のステータスを確認します。

    $ systemctl --user status mysleep.service
    ● mysleep.service - The sleep container
    	 Loaded: loaded (/home/username/.config/containers/systemd/mysleep.container; generated)
    	 Active: active (running) since Thu 2023-02-09 18:07:23 EST; 2s ago
       Main PID: 265651 (conmon)
          Tasks: 3 (limit: 76815)
    	 Memory: 1.6M
       	 CPU: 94ms
    	 CGroup: ...
  2. すべてのコンテナーをリスト表示します。

    $ podman ps -a
    CONTAINER ID  IMAGE                            COMMAND               CREATED            STATUS                          PORTS   NAMES
    421c8293fc1b  registry.access.redhat.com/ubi10-minimal:latest               sleep 1000  30 seconds ago   Up 10 seconds ago systemd-mysleep

    作成されたコンテナーの名前は次の要素で構成されています。

    • systemd- 接頭辞
    • systemd ユニットの名前、つまり systemd-mysleep

      この名前は、一般的なコンテナーと systemd ユニットで実行されているコンテナーを区別するのに役立ちます。また、コンテナーがどのユニットで実行されるかを判断するのにも役立ちます。コンテナーの名前を変更する場合は、[Container] セクションの ContainerName フィールドを使用します。

      詳細は、システム上の podman-systemd.unit(5) man ページを参照してください。

13.2. systemd サービスの有効化

コンテナー化されたサービスが起動時に自動的に開始されるように設定できます。ユーザーサービスについては、ログアウト後もサービスが継続するように、リンガリングを有効にする必要があります。

手順

  • サービスの有効化:

    • システムの起動時にサービスを有効にするには、ユーザーがログインしているかどうかに拘らず、次のコマンドを実行します。

      # systemctl enable <service>

      systemd ユニットファイルを /etc/systemd/system ディレクトリーにコピーする必要があります。

    • ユーザーのログイン時にサービスを起動し、ユーザーのログアウト時に停止するには、次のコマンドを実行します。

      $ systemctl --user enable <service>

      systemd ユニットファイルを $HOME/.config/systemd/user ディレクトリーにコピーする必要があります。

    • システムの起動時にサービスを起動し、ログアウト後もそのまま起動した状態を保つには、次のコマンドを実行します。

      # loginctl enable-linger <username>

      詳細は、システム上の systemctl(1) および loginctl(1) man ページを参照してください。

13.3. systemd を使用したコンテナーの自動起動

systemctl コマンドを使用して、systemd システムおよびサービスマネージャーの状態を制御できます。root 以外のユーザーでサービスを有効化、起動、停止できます。root ユーザーとしてサービスをインストールするには、--user オプションを省略します。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. systemd マネージャーの設定を再読み込みするには、次のコマンドを実行します。

    # systemctl --user daemon-reload
  2. サービス container.service を有効にし、起動時に開始します。

    # systemctl --user enable container.service
  3. サービスをすぐに起動します。

    # systemctl --user start container.service
  4. サービスのステータスを確認します。

    $ systemctl --user status container.service
    ● container.service - Podman container.service
       Loaded: loaded (/home/user/.config/systemd/user/container.service; enabled; vendor preset: enabled)
       Active: active (running) since Wed 2020-09-16 11:56:57 CEST; 8s ago
         Docs: man:podman-generate-systemd(1)
      Process: 80602 ExecStart=/usr/bin/podman run --conmon-pidfile //run/user/1000/container.service-pid --cidfile //run/user/1000/container.service-cid -d ubi10-minimal:>
      Process: 80601 ExecStartPre=/usr/bin/rm -f //run/user/1000/container.service-pid //run/user/1000/container.service-cid (code=exited, status=0/SUCCESS)
     Main PID: 80617 (conmon)
       CGroup: /user.slice/user-1000.slice/user@1000.service/container.service
               ├─ 2870 /usr/bin/podman
               ├─80612 /usr/bin/slirp4netns --disable-host-loopback --mtu 65520 --enable-sandbox --enable-seccomp -c -e 3 -r 4 --netns-type=path /run/user/1000/netns/cni->
               ├─80614 /usr/bin/fuse-overlayfs -o lowerdir=/home/user/.local/share/containers/storage/overlay/l/YJSPGXM2OCDZPLMLXJOW3NRF6Q:/home/user/.local/share/contain>
               ├─80617 /usr/bin/conmon --api-version 1 -c cbc75d6031508dfd3d78a74a03e4ace1732b51223e72a2ce4aa3bfe10a78e4fa -u cbc75d6031508dfd3d78a74a03e4ace1732b51223e72>
               └─cbc75d6031508dfd3d78a74a03e4ace1732b51223e72a2ce4aa3bfe10a78e4fa
                 └─80626 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1d

    systemctl is-enabled container.service コマンドを使用して、サービスが有効化されているか確認できます。

  5. オプション: container.service を停止するには、以下を入力します。

    # systemctl --user stop container.service

検証

  • 実行中または終了したコンテナーをリスト表示します。

    # podman ps
    CONTAINER ID  IMAGE                            COMMAND  CREATED         STATUS             PORTS  NAMES
    f20988d59920  registry.access.redhat.com/ubi10-minimal:latest  top      12 seconds ago  Up 11 seconds ago         funny_zhukovsky

13.4. podman generate systemd コマンドではなく Quadlets を使用する利点

通常の systemd ユニットファイルと同様の形式でコンテナーを実行する方法を記述する Quadlets ツールを使用できます。

注記

Quadlet は Podman v4.6 以降で使用可能です。

Quadlets には、podman generate systemd コマンドを使用してユニットファイルを生成する場合に比べて、次のような多くの利点があります。

  • メンテナンスが簡単: コンテナーの記述は、関連するコンテナーの詳細を中心に行うため、systemd でのコンテナー実行に関する技術的詳細を意識せずに済みます。
  • 自動更新: Quadlets では、更新後にユニットファイルを手動で再生成する必要はありません。Podman の新しいバージョンがリリースされた場合、起動時などに systemctl daemon-reload コマンドを実行すると、サービスが自動的に更新されます。
  • シンプルなワークフロー: 簡素化された構文のおかげで、Quadlet ファイルをゼロから作成して、どこにでもデプロイできます。
  • 標準の systemd オプションのサポート: Quadlet は、既存の systemd-unit 構文を新しいテーブル (コンテナーを設定するテーブルなど) で拡張します。
注記

Quadlet は Kubernetes YAML 機能のサブセットをサポートします。次のツールのいずれかを使用して YAML ファイルを生成できます。

  • Podman: podman generate kube コマンド
  • OpenShift: oc generate コマンドと --dry-run オプション
  • Kubernetes: kubectl create コマンドと --dry-run オプション

Quadlet は次のユニットファイルタイプをサポートします。

  • コンテナーユニット: podman run コマンドを実行してコンテナーを管理するために使用します。

    • ファイル拡張子: .container
    • セクション名: [Container]
    • 必須フィールド: サービスによって実行されるコンテナーイメージを記述する Image
  • Kube ユニット: podman kube play コマンドを実行して、Kubernetes YAML ファイルで定義したコンテナーを管理するために使用します。

    • ファイル拡張子: .kube
    • セクション名: [Kube]
    • 必須フィールド: Kubernetes YAML ファイルへのパスを定義する Yaml
  • ネットワークユニット: .container または .kube ファイルで参照される可能性のある Podman ネットワークを作成するために使用します。

    • ファイル拡張子: .network
    • セクション名: [Network]
    • 必須フィールド: なし
  • ボリュームユニット: .container ファイルで参照される可能性のある Podman ボリュームを作成するために使用します。

    • ファイル拡張子: .volume
    • セクション名: [Volume]
    • 必須フィールド: なし

      詳細は、システム上の podman-systemd.unit(5) man ページを参照してください。

13.5. Podman を使用した systemd ユニットファイルの生成

podman generate systemd コマンドを使用して、既存コンテナー用の systemd ユニットファイルを作成します。これにより、Podman は実行中のコンテナーをサービスとして管理できますが、新しい設定には Quadlet が推奨されます。

podman generate systemd コマンドは、ユニットファイルの最新バージョンを確実に取得するためにも役立ちます。

注記

podman v4.6 以降では、Quadlets を使用できるようになりました。Quadlets を使用すると、通常の systemd ユニットファイルと同様の形式でコンテナーを実行する方法を記述でき、systemd でコンテナーを実行する際の複雑さを意識せずに済みます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. コンテナー (例: myubi) を作成します。

    $ podman create --name myubi registry.access.redhat.com/ubi10:latest sleep infinity
    0280afe98bb75a5c5e713b28de4b7c5cb49f156f1cce4a208f13fee2f75cb453
  2. コンテナー名または ID を使用して systemd ユニットファイルを生成し、それを ~/.config/systemd/user/container-myubi.service ファイルに送ります。

    $ podman generate systemd --name myubi > ~/.config/systemd/user/container-myubi.service

検証

  • 生成された systemd ユニットファイルの内容を表示します。

    $ cat ~/.config/systemd/user/container-myubi.service
    # container-myubi.service
    # autogenerated by Podman 3.3.1
    # Wed Sep  8 20:34:46 CEST 2021
    
    [Unit]
    Description=Podman container-myubi.service
    Documentation=man:podman-generate-systemd(1)
    Wants=network-online.target
    After=network-online.target
    RequiresMountsFor=/run/user/1000/containers
    
    [Service]
    Environment=PODMAN_SYSTEMD_UNIT=%n
    Restart=on-failure
    TimeoutStopSec=70
    ExecStart=/usr/bin/podman start myubi
    ExecStop=/usr/bin/podman stop -t 10 myubi
    ExecStopPost=/usr/bin/podman stop -t 10 myubi
    PIDFile=/run/user/1000/containers/overlay-containers/9683103f58a32192c84801f0be93446cb33c1ee7d9cdda225b78049d7c5deea4/userdata/conmon.pid
    Type=forking
    
    [Install]
    WantedBy=multi-user.target default.target
    • Restart=on-failure 行は再起動ポリシーを設定し、サービスを正常に開始または停止できない場合、またはプロセスがゼロ以外で終了した場合に再起動するように systemd に指示します。
    • ExecStart 行は、コンテナーの開始方法を示しています。
    • ExecStop 行は、コンテナーを停止して削除する方法を示しています。

      詳細は、システム上の podman-generate-systemd(1) man ページを参照してください。

13.6. Podman を使用した systemd ユニットファイルの自動生成

デフォルトで、Podman は既存のコンテナーまたは Pod のユニットファイルを生成します。podman generate systemd --new を使用すると、より移植性の高い systemd ユニットファイルを生成できます。--new フラグでは、コンテナーの作成、起動、削除を行うユニットファイルを生成するように Podman に指示します。

注記

podman v4.6 以降では、Quadlets を使用できるようになりました。Quadlets を使用すると、通常の systemd ユニットファイルと同様の形式でコンテナーを実行する方法を記述でき、systemd でコンテナーを実行する際の複雑さを意識せずに済みます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. システムで使用するイメージをプルします。たとえば、httpd-24 イメージをプルするには、以下を実行します。

    # podman pull registry.access.redhat.com/ubi10/httpd-24
  2. オプション: システムで使用可能なすべてのイメージをリストします。

    # podman images
    REPOSITORY                                TAG                  IMAGE ID      CREATED        SIZE
    registry.access.redhat.com/ubi10/httpd-24  latest               8594be0a0b57  2 weeks ago    462 MB
  3. httpd コンテナーを作成します。

    # podman create --name httpd -p 8080:8080 registry.access.redhat.com/ubi10/httpd-24
    cdb9f981cf143021b1679599d860026b13a77187f75e46cc0eac85293710a4b1
  4. オプション: コンテナーが作成されたことを確認します。

    # podman ps -a
    CONTAINER ID  IMAGE                                            COMMAND               CREATED        STATUS      PORTS                   NAMES
    cdb9f981cf14  registry.access.redhat.com/ubi10/httpd-24:latest  /usr/bin/run-http...  5 minutes ago  Created     0.0.0.0:8080->8080/tcp  httpd
  5. httpd コンテナーの systemd ユニットファイルを生成します。

    # podman generate systemd --new --files --name httpd
    /root/container-httpd.service
  6. 生成された container-httpd.service systemd ユニットファイルの内容を表示します。

    # cat /root/container-httpd.service
    # container-httpd.service
    # autogenerated by Podman 3.3.1
    # Wed Sep  8 20:41:44 CEST 2021
    
    [Unit]
    Description=Podman container-httpd.service
    Documentation=man:podman-generate-systemd(1)
    Wants=network-online.target
    After=network-online.target
    RequiresMountsFor=%t/containers
    
    [Service]
    Environment=PODMAN_SYSTEMD_UNIT=%n
    Restart=on-failure
    TimeoutStopSec=70
    ExecStartPre=/bin/rm -f %t/%n.ctr-id
    ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --sdnotify=conmon --cgroups=no-conmon --rm -d --replace --name httpd -p 8080:8080 registry.access.redhat.com/ubi10/httpd-24
    ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
    ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
    Type=notify
    NotifyAccess=all
    
    [Install]
    WantedBy=multi-user.target default.target
    注記

    --new オプションを使用して生成されたユニットファイルでは、コンテナーと Pod が存在することを想定していません。したがって、サービスの起動時に (ExecStart の行を参照)、podman start コマンドではなく、podman run コマンドを実行します。たとえば、Generating a systemd unit file using Podman のセクションを参照してください。

    • podman run コマンドは、以下のコマンドラインオプションを使用します。

      • --conmon-pidfile オプションは、ホストで実行している conmon プロセスのプロセス ID を格納するパスを指します。conmon プロセスはコンテナーと同じ終了ステータスで終了します。これにより、systemd は正しいサービスステータスを報告し、必要に応じてコンテナーを再起動できます。
      • --cidfile オプションは、コンテナー ID を格納するパスを指します。
      • %t は、ランタイムディレクトリーのルートへのパスです (例: /run/user/$UserID)。
      • %n は、サービスの完全な名前です。
  7. /etc/systemd/system にユニットファイルをコピーして root ユーザーとしてインストールします。

    # cp -Z container-httpd.service /etc/systemd/system
  8. container-httpd.service を有効にして起動します。

    # systemctl daemon-reload
    # systemctl enable --now container-httpd.service
    Created symlink /etc/systemd/system/multi-user.target.wants/container-httpd.service → /etc/systemd/system/container-httpd.service.
    Created symlink /etc/systemd/system/default.target.wants/container-httpd.service → /etc/systemd/system/container-httpd.service.

検証

  • container-httpd.service のステータスを確認します。

    # systemctl status container-httpd.service
        ● container-httpd.service - Podman container-httpd.service
           Loaded: loaded (/etc/systemd/system/container-httpd.service; enabled; vendor preset: disabled)
           Active: active (running) since Tue 2021-08-24 09:53:40 EDT; 1min 5s ago
             Docs: man:podman-generate-systemd(1)
          Process: 493317 ExecStart=/usr/bin/podman run --conmon-pidfile /run/container-httpd.pid --cidfile /run/container-httpd.ctr-id --cgroups=no-conmon -d --repla>
          Process: 493315 ExecStartPre=/bin/rm -f /run/container-httpd.pid /run/container-httpd.ctr-id (code=exited, status=0/SUCCESS)
         Main PID: 493435 (conmon)
        ...

13.7. systemd を使用した Pod の自動起動

Pod 全体を systemd サービスとして管理することで、Pod 内のすべてのコンテナーが同時に起動および停止するようにできます。これにより、マルチコンテナーアプリケーションの管理が単純化されます。

systemctl コマンドは、Pod でだけ使用するようにしてください。コンテナーは Pod サービスと内部の infra-container で管理されているため、systemctl を使用して個別にコンテナーを開始または停止しないでください。

注記

podman v4.6 以降では、Quadlets を使用できるようになりました。Quadlets を使用すると、通常の systemd ユニットファイルと同様の形式でコンテナーを実行する方法を記述でき、systemd でコンテナーを実行する際の複雑さを意識せずに済みます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. たとえば、systemd-pod などの空の Pod を作成します。

    $ podman pod create --name systemd-pod
    11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577
  2. 必要に応じて、すべての Pod をリスト表示します。

    $ podman pod ps
    POD ID        NAME         STATUS   CREATED         # OF CONTAINERS  INFRA ID
    11d4646ba41b  systemd-pod  Created  40 seconds ago  1                8a428b257111
    11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577
  3. 空の Pod に 2 つのコンテナーを作成します。たとえば、container0container1systemd-pod に作成するには、以下を実行します。

    $ *podman create --pod systemd-pod --name container0 registry.access.redhat.com/ubi*10 top
    $ *podman create --pod systemd-pod --name container1 registry.access.redhat.com/ubi*10 top
  4. 必要に応じて、関連付けられている全 Pod およびコンテナーをリスト表示します。

    $ podman ps -a --pod
    CONTAINER ID  IMAGE                                   COMMAND  CREATED        STATUS         PORTS   NAMES               POD ID        PODNAME
    24666f47d9b2  registry.access.redhat.com/ubi10:latest  top      3 minutes ago  Created                container0          3130f724e229  systemd-pod
    56eb1bf0cdfe  k8s.gcr.io/pause:3.2                             4 minutes ago  Created                3130f724e229-infra  3130f724e229  systemd-pod
    62118d170e43  registry.access.redhat.com/ubi10:latest  top      3 seconds ago  Created                container1          3130f724e229  systemd-pod
  5. 新しい Pod の systemd ユニットファイルを生成します。

    $ podman generate systemd --files --name systemd-pod
    /home/user1/pod-systemd-pod.service
    /home/user1/container-container0.service
    /home/user1/container-container1.service

    3 つの systemd ユニットファイルが生成されることに注意してください。1 つは systemd-pod Pod 用、2 つはコンテナー container0 および container1 用です。

  6. pod-systemd-pod.service ユニットファイルを表示します。

    $ cat pod-systemd-pod.service
    # pod-systemd-pod.service
    # autogenerated by Podman 3.3.1
    # Wed Sep  8 20:49:17 CEST 2021
    
    [Unit]
    Description=Podman pod-systemd-pod.service
    Documentation=man:podman-generate-systemd(1)
    Wants=network-online.target
    After=network-online.target
    RequiresMountsFor=
    Requires=container-container0.service container-container1.service
    Before=container-container0.service container-container1.service
    
    [Service]
    Environment=PODMAN_SYSTEMD_UNIT=%n
    Restart=on-failure
    TimeoutStopSec=70
    ExecStart=/usr/bin/podman start bcb128965b8e-infra
    ExecStop=/usr/bin/podman stop -t 10 bcb128965b8e-infra
    ExecStopPost=/usr/bin/podman stop -t 10 bcb128965b8e-infra
    PIDFile=/run/user/1000/containers/overlay-containers/1dfdcf20e35043939ea3f80f002c65c00d560e47223685dbc3230e26fe001b29/userdata/conmon.pid
    Type=forking
    
    [Install]
    WantedBy=multi-user.target default.target
    • [Unit] セクションの Requires 行は、container-container0.servicecontainer-container1.service ユニットファイルの依存関係を定義します。両方のユニットファイルがアクティベートされます。
    • [Service] セクションの ExecStart 行および ExecStop 行はそれぞれ infra-container を開始して停止します。
  7. container-container0.service ユニットファイルを表示します。

    $ cat container-container0.service
    # container-container0.service
    # autogenerated by Podman 3.3.1
    # Wed Sep  8 20:49:17 CEST 2021
    
    [Unit]
    Description=Podman container-container0.service
    Documentation=man:podman-generate-systemd(1)
    Wants=network-online.target
    After=network-online.target
    RequiresMountsFor=/run/user/1000/containers
    BindsTo=pod-systemd-pod.service
    After=pod-systemd-pod.service
    
    [Service]
    Environment=PODMAN_SYSTEMD_UNIT=%n
    Restart=on-failure
    TimeoutStopSec=70
    ExecStart=/usr/bin/podman start container0
    ExecStop=/usr/bin/podman stop -t 10 container0
    ExecStopPost=/usr/bin/podman stop -t 10 container0
    PIDFile=/run/user/1000/containers/overlay-containers/4bccd7c8616ae5909b05317df4066fa90a64a067375af5996fdef9152f6d51f5/userdata/conmon.pid
    Type=forking
    
    [Install]
    WantedBy=multi-user.target default.target
    • [Unit] セクションの BindsTo l 行は、pod-systemd-pod.service ユニットファイルの依存関係を定義します。
    • [Service] セクションの ExecStart 行および ExecStop 行では、それぞれ container0 を起動および停止します。
  8. container-container1.service ユニットファイルを表示します。

    $ cat container-container1.service
  9. 生成されたファイルをすべて $HOME/.config/systemd/user にコピーして、root 以外のユーザーとしてインストールします。

    $ cp pod-systemd-pod.service container-container0.service container-container1.service $HOME/.config/systemd/user
  10. ユーザーのログイン時に、サービスを有効にして開始します。

    $ systemctl enable --user pod-systemd-pod.service
    Created symlink /home/user1/.config/systemd/user/multi-user.target.wants/pod-systemd-pod.service → /home/user1/.config/systemd/user/pod-systemd-pod.service.
    Created symlink /home/user1/.config/systemd/user/default.target.wants/pod-systemd-pod.service → /home/user1/.config/systemd/user/pod-systemd-pod.service.

    サービスは、ユーザーのログアウト時に停止される点に注意してください。

検証

  • サービスが有効になっているかどうかを確認します。

    $ systemctl is-enabled pod-systemd-pod.service
    enabled

詳細は、システム上の podman-create(1)podman-generate-systemd(1)、および systemctl(1) man ページを参照してください。

13.8. Podman を使用したコンテナーの自動更新

podman auto-update コマンドを使用すると、自動更新のポリシーに従ってコンテナーを自動的に更新できます。podman auto-update コマンドは、コンテナーイメージがレジストリーで更新されるとサービスを更新します。

自動更新を使用するには、--label "io.containers.autoupdate=image" ラベルで作成され、podman generate systemd --new コマンドで生成される systemd ユニットでコンテナーを実行する必要があります。

Podman は、"io.containers.autoupdate" ラベルが "image" に設定されている実行中のコンテナーを検索して、コンテナーのレジストリーと通信します。イメージが変更されると、Podman は対応する systemd ユニットを再起動して古いコンテナーを停止し、新しいイメージで新規のコンテナーを作成します。そのため、コンテナー、その環境、およびすべての依存関係が再起動されます。

注記

podman v4.6 以降では、Quadlets を使用できるようになりました。Quadlets を使用すると、通常の systemd ユニットファイルと同様の形式でコンテナーを実行する方法を記述でき、systemd でコンテナーを実行する際の複雑さを意識せずに済みます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. registry.access.redhat.com/ubi10/ubi-init イメージをもとに、myubi コンテナーを起動します。

    # podman run --label "io.containers.autoupdate=image" \
    --name myubi -dt registry.access.redhat.com/ubi10/ubi-init top
    bc219740a210455fa27deacc96d50a9e20516492f1417507c13ce1533dbdcd9d
  2. 必要に応じて、実行中または終了したコンテナーをリスト表示します。

    # podman ps -a
    CONTAINER ID  IMAGE                                            COMMAND  CREATED         STATUS             PORTS   NAMES
    76465a5e2933  registry.access.redhat.com/10/ubi-init:latest  top      24 seconds ago  Up 23 seconds ago          myubi
  3. myubi コンテナーの systemd ユニットファイルを生成します。

    # podman generate systemd --new --files --name myubi
    /root/container-myubi.service
  4. /usr/lib/systemd/system にユニットファイルをコピーして root ユーザーとしてインストールします。

    # cp -Z ~/container-myubi.service /usr/lib/systemd/system
  5. systemd マネージャー設定をリロードします。

    # systemctl daemon-reload
  6. コンテナーを起動して、ステータスを確認します。

    # systemctl start container-myubi.service
    # systemctl status container-myubi.service
  7. コンテナーを自動更新します。

    # podman auto-update

    詳細は、システム上の podman-generate-systemd(1) および systemctl(1) man ページを参照してください。

13.9. systemd を使用したコンテナーの自動更新

podman-auto-update タイマーとサービスを使用して、コンテナーの自動更新をスケジュールします。これにより、手動で操作しなくても、システムは確実にイメージの更新を定期的に確認し、適用します。

Podman を使用したコンテナーの自動更新 セクションで説明したように、podman auto-update コマンドを使用してコンテナーを更新できます。カスタムスクリプトに組み込み、必要に応じて呼び出すことができます。コンテナーを自動更新するもう 1 つの方法は、プリインストールされている podman-auto-update.timer および podman-auto-update.service systemd サービスを使用することです。

podman-auto-update.timer は、特定の日付と時刻で自動更新をトリガーするように設定できます。podman-auto-update.service は、systemctl コマンドによってさらに開始することも、他の systemd サービスによる依存関係として使用することもできます。

その結果、時間およびイベントに基づく自動更新は、個々のニーズやユースケースを満たすためにさまざまな方法でトリガーできます。

注記

podman v4.6 以降では、Quadlets を使用できるようになりました。Quadlets を使用すると、通常の systemd ユニットファイルと同様の形式でコンテナーを実行する方法を記述でき、systemd でコンテナーを実行する際の複雑さを意識せずに済みます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. podman-auto-update.service ユニットファイルを表示します。

    # cat /usr/lib/systemd/system/podman-auto-update.service
    
    [Unit]
    Description=Podman auto-update service
    Documentation=man:podman-auto-update(1)
    Wants=network.target
    After=network-online.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/podman auto-update
    
    [Install]
    WantedBy=multi-user.target default.target
  2. podman-auto-update.timer ユニットファイルを表示します。

    # cat /usr/lib/systemd/system/podman-auto-update.timer
    
    [Unit]
    Description=Podman auto-update timer
    
    [Timer]
    OnCalendar=daily
    Persistent=true
    
    [Install]
    WantedBy=timers.target

    この例では、podman auto-update コマンドは、毎日、深夜に起動します。

  3. システム起動時に podman-auto-update.timer サービスを有効にします。

    # systemctl enable podman-auto-update.timer
  4. systemd サービスを開始します。

    # systemctl start podman-auto-update.timer
  5. 必要に応じて、すべてのタイマーをリスト表示します。

    # systemctl list-timers --all
    NEXT                         LEFT      LAST                         PASSED       UNIT                         ACTIVATES
    Wed 2020-12-09 00:00:00 CET  9h left   n/a                          n/a          podman-auto-update.timer     podman-auto-update.service

    podman-auto-update.timerpodman-auto-update.service を有効化したことが確認できます。

第14章 Podman を使用した OpenShift へのコンテナーの移植

OpenShift または Kubernetes にデプロイするため、ローカルコンテナーの移植可能な YAML 記述を生成します。この機能を使用すると、Podman を使用してローカル環境で開発し、グローバルにデプロイできます。

YAML ファイルを使用して以下を実行できます。

  • 必要最小限の入力で、ローカル環境にオーケストレーションされた一連のコンテナーや Pod を実行できます。これは、反復型開発に役立ちます。
  • 別のマシンで同じコンテナーと Pod を実行します。

podman kube play コマンドは、Kubernetes YAML 機能のサブセットをサポートします。詳細は、システム上の podman-kube-play(1) man ページを参照してください。

14.1. Podman を使用した Kubernetes YAML ファイルの生成

1 つのコンテナーで Pod を作成し、podman generate kube コマンドを使用して Kubernetes YAML ファイルを生成できます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • Pod が作成されている。詳細は、Pod の作成 セクションを参照してください。

手順

  1. 関連付けられている全 Pod およびコンテナーをリスト表示します。

    $ podman ps -a --pod
    CONTAINER ID  IMAGE                                       COMMAND    CREATED                 STATUS                     PORTS  NAMES               POD
    5df5c48fea87  registry.access.redhat.com/ubi10/ubi:latest  /bin/bash  Less than a second ago  Up Less than a second ago         myubi               223df6b390b4
    3afdcd93de3e  k8s.gcr.io/pause:3.1                                   Less than a second ago  Up Less than a second ago         223df6b390b4-infra  223df6b390b4
  2. Pod 名または ID を使用して Kubernetes YAML ファイルを生成します。

    $ podman generate kube mypod > mypod.yaml

    podman generate コマンドは、コンテナーに接続されている論理ボリュームマネージャー (LVM) の論理ボリュームまたは物理ボリュームを反映しません。

  3. mypod.yaml ファイルを表示します。

    $ cat mypod.yaml
    # Generation of Kubernetes YAML is still under development!
    #
    # Save the output of this file and use kubectl create -f to import
    # it into Kubernetes.
    #
    # Created with podman-1.6.4
    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: "2020-06-09T10:31:56Z"
      labels:
    app: mypod
      name: mypod
    spec:
      containers:
      - command:
            - /bin/bash
            env:
            - name: PATH
                  value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
            - name: TERM
                  value: xterm
            - name: HOSTNAME
            - name: container
                  value: oci
            image: registry.access.redhat.com/ubi10/ubi:latest
            name: myubi
            resources: {}
            securityContext:
                  allowPrivilegeEscalation: true
                  capabilities: {}
                  privileged: false
                  readOnlyRootFilesystem: false
            tty: true
            workingDir: /
    status: {}

14.2. OpenShift 環境での Kubernetes YAML ファイルの生成

OpenShift 環境では、oc create コマンドを使用して、アプリケーションを記述する YAML ファイルを生成します。

注記

Kubernetes 環境では、同じフラグを指定して kubectl create コマンドを使用できます。

手順

  • myapp アプリケーションの YAML ファイルを生成します。

    $ oc create myapp --image=me/myapp:v1 -o yaml --dry-run > myapp.yaml

    oc create コマンドは myapp イメージを作成して実行します。オブジェクトは --dry-run オプションを使用して出力され、myapp.yaml 出力ファイルにリダイレクトされます。

14.3. Podman でのコンテナーおよび Pod の起動

生成された YAML ファイルを使用すると、任意の環境でコンテナーおよび Pod を自動的に起動できます。YAML ファイルは、Kubernetes や OpenShift など、Podman 以外のツールを使用して生成できます。

podman play kube コマンドを使用すると、YAML 入力ファイルに基づいて Pod とコンテナーを再作成できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. mypod.yaml ファイルから Pod およびコンテナーを作成します。

    $ podman play kube mypod.yaml
    Pod:
    b8c5b99ba846ccff76c3ef257e5761c2d8a5ca4d7ffa3880531aec79c0dacb22
    Container:
    848179395ebd33dd91d14ffbde7ae273158d9695a081468f487af4e356888ece
  2. すべての Pod をリスト表示します。

    $ podman pod ps
    POD ID         NAME    STATUS    CREATED          # OF CONTAINERS   INFRA ID
    b8c5b99ba846   mypod   Running   19 seconds ago   2                 aa4220eaf4bb
  3. 関連付けられている全 Pod およびコンテナーをリスト表示します。

    $ podman ps -a --pod
    CONTAINER ID  IMAGE                                       COMMAND    CREATED             STATUS                 PORTS  NAMES               POD
    848179395ebd  registry.access.redhat.com/ubi10/ubi:latest  /bin/bash  About a minute ago  Up About a minute ago         myubi               b8c5b99ba846
    aa4220eaf4bb  k8s.gcr.io/pause:3.1                                   About a minute ago  Up About a minute ago         b8c5b99ba846-infra  b8c5b99ba846

    podman ps コマンドからの Pod ID と、podman pod ps コマンドからの Pod ID が一致します。

    詳細は、システム上の podman-play-kube(1) man ページを参照してください。

14.4. OpenShift 環境でのコンテナーおよび Pod の起動

oc create コマンドを使用して、OpenShift 環境で Pod およびコンテナーを作成できます。

手順

  • OpenShift 環境で YAML ファイルから Pod を作成します。

    $ oc create -f mypod.yaml
    注記

    Kubernetes 環境では、同じフラグを指定して kubectl create コマンドを使用できます。

14.5. Podman を使用したコンテナーと Pod の手動実行

Podman を使用して、WordPress や MariaDB などのマルチコンテナーアプリケーションを手動でデプロイします。これには、Pod を作成し、それに接続されたコンテナーを追加する作業が含まれます。

次のようなディレクトリーレイアウトがあるとします。

├── mariadb-conf
│   ├── Containerfile
│   ├── my.cnf

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. mariadb-conf/Containerfile ファイルを表示します。

    $ cat mariadb-conf/Containerfile
    FROM docker.io/library/mariadb
    COPY my.cnf /etc/mysql/my.cnf
  2. mariadb-conf/my.cnf ファイルを表示します。

    [client-server]
    # Port or socket location where to connect
    port = 3306
    socket = /run/mysqld/mysqld.sock
    
    # Import all .cnf files from the configuration directory
    [mariadbd]
    skip-host-cache
    skip-name-resolve
    bind-address = 127.0.0.1
    
    !includedir /etc/mysql/mariadb.conf.d/
    !includedir /etc/mysql/conf.d/
  3. mariadb-conf/Containerfile を使用して docker.io/library/mariadb イメージをビルドします。

    $ cd mariadb-conf
    $ podman build -t mariadb-conf .
    $ cd ..
    STEP 1: FROM docker.io/library/mariadb
    Trying to pull docker.io/library/mariadb:latest...
    Getting image source signatures
    Copying blob 7b1a6ab2e44d done
    ...
    Storing signatures
    STEP 2: COPY my.cnf /etc/mysql/my.cnf
    STEP 3: COMMIT mariadb-conf
    --> ffae584aa6e
    Successfully tagged localhost/mariadb-conf:latest
    ffae584aa6e733ee1cdf89c053337502e1089d1620ff05680b6818a96eec3c17
  4. 必要に応じて、すべてのイメージをリスト表示します。

    $ podman images
    LIST IMAGES
    REPOSITORY                                                       TAG         IMAGE ID      CREATED             SIZE
    localhost/mariadb-conf                                           latest      b66fa0fa0ef2  57 seconds ago      416 MB
  5. wordpresspod という名前の pod を作成し、コンテナーとホストシステム間のポートマッピングを設定します。

    $ podman pod create --name wordpresspod -p 8080:80
  6. wordpresspod pod の中に mydb コンテナーを作成します。

    $ podman run --detach --pod wordpresspod \
        -e MYSQL_ROOT_PASSWORD=1234 \
        -e MYSQL_DATABASE=mywpdb \
        -e MYSQL_USER=mywpuser \
        -e MYSQL_PASSWORD=1234 \
        --name mydb localhost/mariadb-conf
  7. wordpresspod pod の中に myweb コンテナーを作成します。

    $ podman run --detach --pod wordpresspod \
        -e WORDPRESS_DB_HOST=127.0.0.1 \
        -e WORDPRESS_DB_NAME=mywpdb \
        -e WORDPRESS_DB_USER=mywpuser \
        -e WORDPRESS_DB_PASSWORD=1234 \
        --name myweb docker.io/wordpress
  8. 必要に応じて、関連付けられている全 Pod およびコンテナーをリスト表示します。

    $ podman ps --pod -a
    CONTAINER ID  IMAGE                               COMMAND               CREATED                 STATUS                     PORTS                 NAMES               POD ID        PODNAME
    9ea56f771915  k8s.gcr.io/pause:3.5                                      Less than a second ago  Up Less than a second ago  0.0.0.0:8080->80/tcp  4b7f054a6f01-infra  4b7f054a6f01  wordpresspod
    60e8dbbabac5  localhost/mariadb-conf:latest       mariadbd              Less than a second ago  Up Less than a second ago  0.0.0.0:8080->80/tcp  mydb                4b7f054a6f01  wordpresspod
    045d3d506e50  docker.io/library/wordpress:latest  apache2-foregroun...  Less than a second ago  Up Less than a second ago  0.0.0.0:8080->80/tcp  myweb               4b7f054a6f01  wordpresspod

検証

  • curl コマンドを使用して、Pod が実行されていることを確認します。

    $ curl localhost:8080/wp-admin/install.php
    <!DOCTYPE html>
    <html xml:lang="en-US">
    <head>
    ...
    </head>
    <body class="wp-core-ui">
    <p id="logo">WordPress</p>
        <h1>Welcome</h1>
    ...

    詳細は、システム上の podman-play-kube(1) man ページを参照してください。

14.6. Podman を使用した YAML ファイルの生成

Kubernetes の YAML ファイルは、podman generate kube コマンドを使用して生成できます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • wordpresspod という名前の Pod が作成されている。詳細は、Pod の作成 セクションを参照してください。

手順

  1. 関連付けられている全 Pod およびコンテナーをリスト表示します。

    $ podman ps --pod -a
    CONTAINER ID  IMAGE                               COMMAND               CREATED                 STATUS                     PORTS                 NAMES               POD ID        PODNAME
    9ea56f771915  k8s.gcr.io/pause:3.5                                      Less than a second ago  Up Less than a second ago  0.0.0.0:8080->80/tcp  4b7f054a6f01-infra  4b7f054a6f01  wordpresspod
    60e8dbbabac5  localhost/mariadb-conf:latest       mariadbd              Less than a second ago  Up Less than a second ago  0.0.0.0:8080->80/tcp  mydb                4b7f054a6f01  wordpresspod
    045d3d506e50  docker.io/library/wordpress:latest  apache2-foregroun...  Less than a second ago  Up Less than a second ago  0.0.0.0:8080->80/tcp  myweb               4b7f054a6f01  wordpresspod
  2. Pod 名または ID を使用して Kubernetes YAML ファイルを生成します。

    $ podman generate kube wordpresspod >> wordpresspod.yaml

検証

  • wordpresspod.yaml ファイルを表示します。

    $ cat wordpresspod.yaml
    ...
    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: "2021-12-09T15:09:30Z"
      labels:
        app: wordpresspod
      name: wordpresspod
    spec:
      containers:
      - args:
            value: podman
          - name: MYSQL_PASSWORD
            value: "1234"
          - name: MYSQL_MAJOR
            value: "8.0"
          - name: MYSQL_VERSION
            value: 8.0.27-1debian10
          - name: MYSQL_ROOT_PASSWORD
            value: "1234"
          - name: MYSQL_DATABASE
            value: mywpdb
          - name: MYSQL_USER
            value: mywpuser
            image: mariadb
                name: mydb
                ports:
                - containerPort: 80
                  hostPort: 8080
                  protocol: TCP
      - args:
        - name: WORDPRESS_DB_NAME
          value: mywpdb
        - name: WORDPRESS_DB_PASSWORD
          value: "1234"
        - name: WORDPRESS_DB_HOST
          value: 127.0.0.1
        - name: WORDPRESS_DB_USER
          value: mywpuser
          image: docker.io/library/wordpress:latest
          name: myweb

    詳細は、システム上の podman-play-kube(1) man ページを参照してください。

14.7. Podman を使用したコンテナーと Pod の自動実行

次に、podman play kube コマンドを使用して、生成された YAML ファイルを Kubernetes または OpenShift 環境に転送する前に、ローカルシステムで Pod およびコンテナーの作成をテストできます。

podman play kube コマンドは、YAML ファイルを使って、1 つのポッド内に複数のコンテナーを含む複数のポッドを自動的にビルドおよび実行することもできます。これは docker compose コマンドと類似した動作です。以下の条件が該当する場合には、自動的にイメージが構築されます。

  1. YAML ファイルで使用されているイメージと同じ名前のディレクトリーが存在する
  2. そのディレクトリーには Containerfile が含まれている

前提条件

手順

  1. 最初からやり直す場合は、ローカルに保存されているイメージを削除してください。

    $ podman rmi localhost/mariadb-conf
    $ podman rmi docker.io/library/wordpress
    $ podman rmi docker.io/library/mysql
  2. wordpress.yaml ファイルを使用して、wordpress Pod を作成します。

    $ podman play kube wordpress.yaml
    STEP 1/2: FROM docker.io/library/mariadb
    STEP 2/2: COPY my.cnf /etc/mysql/my.cnf
    COMMIT localhost/mariadb-conf:latest
    --> 428832c45d0
    Successfully tagged localhost/mariadb-conf:latest
    428832c45d07d78bb9cb34e0296a7dc205026c2fe4d636c54912c3d6bab7f399
    Trying to pull docker.io/library/wordpress:latest...
    Getting image source signatures
    Copying blob 99c3c1c4d556 done
    ...
    Storing signatures
    Pod:
    3e391d091d190756e655219a34de55583eed3ef59470aadd214c1fc48cae92ac
    Containers:
    6c59ebe968467d7fdb961c74a175c88cb5257fed7fb3d375c002899ea855ae1f
    29717878452ff56299531f79832723d3a620a403f4a996090ea987233df0bc3d

    podman play kube コマンド:

    • docker.io/library/mariadb イメージを元に localhost/mariadb-conf:latest イメージを自動構築します。
    • docker.io/library/wordpress:latest のイメージをプルします。
    • wordpresspod-mydbwordpresspod-myweb の 2 つのコンテナーが含まれる、wordpresspod という名前の Pod を作成します。
  3. すべてのコンテナーと Pod を表示します。

    $ podman ps --pod -a
    CONTAINER ID  IMAGE                               COMMAND               CREATED        STATUS                    PORTS                 NAMES               POD ID        PODNAME
    a1dbf7b5606c  k8s.gcr.io/pause:3.5                                      3 minutes ago  Up 2 minutes ago          0.0.0.0:8080->80/tcp  3e391d091d19-infra  3e391d091d19  wordpresspod
    6c59ebe96846  localhost/mariadb-conf:latest       mariadbd              2 minutes ago  Exited (1) 2 minutes ago  0.0.0.0:8080->80/tcp  wordpresspod-mydb   3e391d091d19  wordpresspod
    29717878452f  docker.io/library/wordpress:latest  apache2-foregroun...  2 minutes ago  Up 2 minutes ago          0.0.0.0:8080->80/tcp  wordpresspod-myweb  3e391d091d19  wordpresspod

検証

  • curl コマンドを使用して、Pod が実行されていることを確認します。

    $ curl localhost:8080/wp-admin/install.php
    <!DOCTYPE html>
    <html xml:lang="en-US">
    <head>
    ...
    </head>
    <body class="wp-core-ui">
    <p id="logo">WordPress</p>
        <h1>Welcome</h1>
    ...

    詳細は、システム上の podman-play-kube(1) man ページを参照してください。

14.8. Podman を使用した Pod の自動停止/削除

podman play kube --down コマンドは、すべての Pod とそのコンテナーを停止して削除します。

前提条件

手順

  • wordpresspod.yaml ファイルで作成された全 Pod とコンテナーを削除します。

    $ podman play kube --down wordpresspod.yaml
    Pods stopped:
    3e391d091d190756e655219a34de55583eed3ef59470aadd214c1fc48cae92ac
    Pods removed:
    3e391d091d190756e655219a34de55583eed3ef59470aadd214c1fc48cae92ac
    注記

    ボリュームが使用中の場合には削除されません。

検証

  • wordpresspod.yaml ファイルで作成された全 Pod とコンテナーが削除されたことを確認します。

    $ podman ps --pod -a
    CONTAINER ID  IMAGE                               COMMAND               CREATED                 STATUS                     PORTS                 NAMES               POD ID        PODNAME

    詳細は、システム上の podman-play-kube(1) man ページを参照してください。

第15章 RHEL システムロールを使用したコンテナーの管理

podman RHEL システムロールは、Red Hat Enterprise Linux システム上のコンテナーを管理します。このロールでは、Ansible を使用して Podman の設定やコンテナーのライフサイクル管理を行い、さらにはコンテナー化されたアプリケーションを systemd サービスとしてデプロイします。

15.1. RHEL システムロールと bootc ベースのイメージビルドの統合

bootc、Ansible、および RHEL システムロールを使用して、事前設定済みのシステムコンポーネントとアプリケーションを含むコンテナーを構築します。コンテナー内に Ansible ランタイムと 1 つ以上の RHEL システムロールをインストールし、その後 Ansible を使用して Playbook を実行します。この Playbook は、1 つ以上のロールを使用してシステムコンポーネントとアプリケーションを設定します。

たとえば、podman ロールを使用して、物理的にバインドされたイメージを作成および管理できます。podman ロールを使用したビルドと管理の詳細は、物理的にバインドされたイメージのビルドと管理を 参照してください。

15.2. Podman およびその他のコンテナーツールを対象としたイメージレジストリー管理の設定

podman RHEL システムロールを使用すると、複数の RHEL システムにわたる Podman の管理 (レジストリー設定を含む) を自動化できます。ファイルを手動で編集する代わりに、Ansible Playbook でレジストリー設定を定義します。

podman RHEL システムロールは、podman_registries_conf 変数を使用します。この変数は、レジストリー設定を含むディクショナリーを受け取ります。その後、このロールは、システム設定を管理するためのベストプラクティスに従って、たとえば /etc/containers/registries.conf.d/ にドロップインファイルを作成し、設定を適用します。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure Podman registries with RHEL system roles
      hosts: managed-node-01.example.com
      vars:
        podman_registries_conf:
          unqualified-search-registries:
            - "registry.access.redhat.com"
            - "docker.io"
            - "my-company-registry.com"
          registry:
            - location: "my-company-registry.com"
            - location: "my-local-registry:5000"
              insecure: true
      tasks:
        - name: Include the podman system role
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.podman

    サンプル Playbook で指定されている設定は次のとおりです。

    • unqualified-search-registries: 短いイメージ名 (例: podman pull <my-image>) を使用する場合に、Podman が検索対象とするレジストリーのリストを追加します。Podman は、デフォルトのレジストリーの後に my-company-registry.com でイメージを検索します。
    • [registry]: 特定のレジストリー用に特定のプロパティーを定義します。たとえば、my-local-registry:5000 で実行されているローカルレジストリーに insecure=true を設定することで、セキュアでない接続を有効にできます。

    podman_use_new_toml_formatter 変数は、Podman と互換性のある TOML 準拠の設定ファイルを生成します。この変数は、以前使用されていた Jinja テンプレートの代わりに、本格的な TOML フォーマッターを使用し、テーブルやインラインテーブルを含むすべての TOML 機能をサポートすることで、Podman ロールを強化します。

    以前のフォーマッターの動作との互換性を維持するために、新しいフォーマッターはデフォルトで無効になっています。新しいフォーマッターを有効にするには、設定で podman_use_new_toml_formatter: true を指定します。

    podman_use_new_toml_formatter: true
    podman_containers_conf:
      containers:
        annotations:
          - environment=production
          - status=tier2
  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml

検証

  1. ホスト上で podman info コマンドを実行します。

    $ ansible managed-node-01.example.com -m command -a 'podman info'
  2. registeries セクションを確認します。

    registries:
      my-company-registry.com:
        Blocked: false
        Insecure: false
        Location: my-company-registry.com
        MirrorByDigestOnly: false
        Mirrors: null
        Prefix: my-company-registry.com
        PullFromMirror: ""
      my-local-registry:5000:
        Blocked: false
        Insecure: true
        Location: my-local-registry:5000
        MirrorByDigestOnly: false
        Mirrors: null
        Prefix: my-local-registry:5000
        PullFromMirror: ""
      search:
      - registry.access.redhat.com
      - docker.io
      - my-company-registry.com

podman RHEL システムロールを使用すると、Ansible Playbook を実行してバインドマウントによりルートレスコンテナーを作成し、アプリケーション設定を管理できます。

この Ansible Playbook の例では、データベース用と Web アプリケーション用の 2 つの Kubernetes Pod を起動します。データベース Pod の設定は Playbook で指定します。Web アプリケーション Pod は外部 YAML ファイルで定義します。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • ユーザーとグループ webapp が存在し、ホスト上の /etc/subuid および /etc/subgid ファイルにリストされている。
  • dbuser という名前のユーザーと dbgroup という名前のグループが、すでに作成されている必要がある。

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    - name: Configure Podman
      hosts: managed-node-01.example.com
      tasks:
        - name: Create a web application and a database
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.podman
          vars:
            podman_create_host_directories: true
            podman_firewall:
              - port: 8080-8081/tcp
                state: enabled
              - port: 12340/tcp
                state: enabled
            podman_selinux_ports:
              - ports: 8080-8081
                setype: http_port_t
            podman_kube_specs:
              - state: started
                run_as_user: dbuser
                run_as_group: dbgroup
                kube_file_content:
                  apiVersion: v1
                  kind: Pod
                  metadata:
                    name: db
                  spec:
                    containers:
                      - name: db
                        image:  quay.io/rhel-system-roles/mysql:5.6
                        ports:
                          - containerPort: 1234
                            hostPort: 12340
                        volumeMounts:
                          - mountPath: /var/lib/db:Z
                            name: db
                    volumes:
                      - name: db
                        hostPath:
                          path: /var/lib/db
              - state: started
                run_as_user: webapp
                run_as_group: webapp
                kube_file_src: /path/to/webapp.yml

    サンプル Playbook で指定されている設定は次のとおりです。

    • run_as_user and run_as_group:: コンテナーがルートレスであることを指定します。
    • kube_file_content:: db という名前の最初のコンテナーを定義する Kubernetes YAML ファイルが含まれています。Kubernetes YAML ファイルは、podman kube generate コマンドを使用して生成できます。

      • db コンテナーは、quay.io/db/db:stable コンテナーイメージに基づいています。
      • db バインドマウントは、ホスト上の /var/lib/db ディレクトリーをコンテナー内の /var/lib/db ディレクトリーにマップします。Z フラグにより、コンテンツにプライベート非共有ラベルが付与されます。そのため、そのコンテンツにアクセスできるのは db コンテナーだけです。

        kube_file_src: <path>
        2 つ目のコンテナーを定義します。コントローラーノードの /path/to/webapp.yml ファイルの内容は、マネージドノードの kube_file フィールドにコピーされます。
        volumes: <list>
        1 つ以上のコンテナーで提供するデータのソースを定義する YAML リスト。たとえば、ホスト上のローカルディスク (hostPath) またはその他のディスクデバイスなどです。
        volumeMounts: <list>
        個々のコンテナーが特定のボリュームをマウントする場所を定義する YAML リスト。
        podman_create_host_directories: true

        ホスト上にディレクトリーを作成します。これにより、hostPath ボリュームの kube 仕様を確認し、ホスト上にそれらのディレクトリーを作成するようにロールに指示します。所有権と権限をさらに細かく制御する必要がある場合は、podman_host_directories を使用します。

        Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.podman/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

podman RHEL システムロールを使用して、Ansible Playbook を実行することで、Podman ボリュームを持つルートフルコンテナーを作成できます。このルートフルコンテナーを使用することで、アプリケーションの設定を管理できます。

この Ansible Playbook の例では、ubi10-httpd という名前の Kubernetes Pod をデプロイします。この Pod は、registry.access.redhat.com/ubi10/httpd-24 イメージから HTTP サーバーコンテナーを実行します。コンテナーの Web コンテンツは、ubi10-html-volume という名前の永続ボリュームからマウントされます。デフォルトでは、podman ロールはルートフルコンテナーを作成します。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    - name: Configure Podman
      hosts: managed-node-01.example.com
      tasks:
        - name: Start Apache server on port 8080
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.podman
      vars:
        podman_firewall:
          - port: 8080/tcp
            state: enabled
        podman_kube_specs:
          - state: started
            kube_file_content:
              apiVersion: v1
              kind: Pod
              metadata:
                name: ubi10-httpd
              spec:
                containers:
                  - name: ubi10-httpd
                    image: registry.access.redhat.com/ubi10/httpd-24
                    ports:
                      - containerPort: 8080
                        hostPort: 8080
                    volumeMounts:
                      - mountPath: /var/www/html:Z
                        name: ubi10-html
                volumes:
                  - name: ubi10-html
                    persistentVolumeClaim:
                      claimName: ubi10-html-volume

    サンプル Playbook で指定されている設定は次のとおりです。

    kube_file_content

    ubi10-httpd という名前の 1 つ目コンテナーを定義する Kubernetes YAML ファイルが含まれています。Kubernetes YAML ファイルは、podman kube generate コマンドを使用して生成できます。

    • ubi10-httpd コンテナーは、registry.access.redhat.com/ubi10/httpd-24 コンテナーイメージに基づいています。
    • ubi10-html-volume は、ホスト上の /var/www/html ディレクトリーをコンテナーにマッピングします。Z フラグにより、コンテンツにプライベート非共有ラベルが付与されます。そのため、そのコンテンツにアクセスできるのは ubi10-httpd コンテナーだけです。
    • Pod は、マウントパス /var/www/html を使用して、ubi10-html-volume という名前の既存の永続ボリュームをマウントします。

      Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.podman/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml

    このコマンドは構文のみを検証するものであり、誤っているが有効な設定に対する保護機能はありません。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml

15.5. podman RHEL システムロールを使用したシークレットを含む Quadlet アプリケーションの作成

podman RHEL システムロールを使用して、Ansible Playbook を実行することで、シークレットを含む Quadlet アプリケーションを作成できます。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • コンテナー内の Web サーバーの証明書とそれに対応する秘密鍵が、~/certificate.pem および ~/key.pem ファイルに保存されている。

手順

  1. 証明書と秘密鍵ファイルの内容を表示します。

    $ cat ~/certificate.pem
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
    
    $ cat ~/key.pem
    -----BEGIN PRIVATE KEY-----
    ...
    -----END PRIVATE KEY-----

    この情報は後の手順で必要になります。

  2. 機密性の高い変数を暗号化されたファイルに保存します。

    1. vault を作成します。

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
    2. ansible-vault create コマンドでエディターが開いたら、機密データを <key>: <value> 形式で入力します。

      root_password: <root_password>
      certificate: |-
        -----BEGIN CERTIFICATE-----
        ...
        -----END CERTIFICATE-----
      key: |-
        -----BEGIN PRIVATE KEY-----
        ...
        -----END PRIVATE KEY-----

      certificate 変数および key 変数のすべての行が 2 つのスペースで始まるようにします。

    3. 変更を保存して、エディターを閉じます。Ansible は vault 内のデータを暗号化します。
  3. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    - name: Deploy a wordpress CMS with MySQL database
      hosts: managed-node-01.example.com
      vars_files:
        - ~/vault.yml
      tasks:
      - name: Create and run the container
        ansible.builtin.include_role:
          name: redhat.rhel_system_roles.podman
        vars:
          podman_create_host_directories: true
          podman_activate_systemd_unit: false
          podman_quadlet_specs:
            - name: quadlet-demo
              type: network
              file_content: |
                [Network]
                Subnet=192.168.30.0/24
                Gateway=192.168.30.1
                Label=app=wordpress
            - file_src: quadlet-demo-mysql.volume
            - template_src: quadlet-demo-mysql.container.j2
            - file_src: envoy-proxy-configmap.yml
            - file_src: quadlet-demo.yml
            - file_src: quadlet-demo.kube
              activate_systemd_unit: true
          podman_firewall:
            - port: 8000/tcp
              state: enabled
            - port: 9000/tcp
              state: enabled
          podman_secrets:
            - name: mysql-root-password-container
              state: present
              skip_existing: true
              data: "{{ root_password }}"
            - name: mysql-root-password-kube
              state: present
              skip_existing: true
              data: |
                apiVersion: v1
                data:
                  password: "{{ root_password | b64encode }}"
                kind: Secret
                metadata:
                  name: mysql-root-password-kube
            - name: envoy-certificates
              state: present
              skip_existing: true
              data: |
                apiVersion: v1
                data:
                  certificate.key: {{ key | b64encode }}
                  certificate.pem: {{ certificate | b64encode }}
                kind: Secret
                metadata:
                  name: envoy-certificates

    この手順では、MySQL データベースと組み合わせた WordPress コンテンツ管理システムを作成します。podman_quadlet_specs role ロール変数では、Quadlet の一連の設定を定義します。この設定は、連携するコンテナーまたはサービスのグループを参照します。これには次の仕様を含めます。

    • Wordpress ネットワークを、quadlet-demo ネットワークユニットで定義します。
    • MySQL コンテナーのボリューム設定を、file_src: quadlet-demo-mysql.volume フィールドで定義します。
    • template_src: quadlet-demo-mysql.container.j2 フィールドを使用して、MySQL コンテナーの設定を生成します。
    • その後に、2 つの YAML ファイル file_src: envoy-proxy-configmap.yml および file_src: quadlet-demo.yml を指定します。.yml は有効な Quadlet ユニットタイプではないため、これらのファイルはコピーされるだけで、Quadlet 仕様として処理されません。
    • Wordpress および envoy プロキシーコンテナーと設定を、file_src: quadlet-demo.kube フィールドで定義します。kube ユニットは、[Kube] セクション内の上記の YAML ファイルを、Yaml=quadlet-demo.yml および ConfigMap=envoy-proxy-configmap.yml として参照します。

      Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.podman/README.md ファイルを参照してください。

  4. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml

    このコマンドは構文のみを検証するものであり、誤っているが有効な設定に対する保護機能はありません。

  5. Playbook を実行します。

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

関連情報

第16章 RHEL Web コンソールを使用したコンテナーイメージの管理

RHEL Web コンソールを使用してコンテナーイメージを管理できます。Web コンソールはグラフィカルインターフェイスを提供し、Podman containers セクションでコンテナーイメージの取得、整理、削除を実行できます。

16.1. Web コンソールでのコンテナーイメージの取得

コンテナーイメージをローカルシステムにダウンロードし、それを使用してコンテナーを作成できます。

前提条件

手順

  1. RHEL 10 Web コンソールにログインします。
  2. メインメニューで Podman containers をクリックします。
  3. Images テーブルで、右上隅にあるオーバーフローメニューをクリックし、Download new image を選択します。
  4. Search for an image ウィンドウが開きます。
  5. Search for フィールドに、イメージの名前を入力するか、その説明を指定します。
  6. in ドロップダウンリストで、イメージを取得するレジストリーを選択します。
  7. オプション: Tag フィールドに、イメージのタグを入力します。
  8. Download をクリックします。

検証

  • メインメニューで Podman containers をクリックします。新しくダウンロードしたイメージは、Images テーブルで確認できます。
注記

Images テーブルの Create container ボタンをクリックすると、ダウンロードしたイメージからコンテナーを作成できます。コンテナーを作成するには、Web コンソールでのコンテナーの作成 のステップ 3 - 8 に従ってください。

16.2. Web コンソールでのコンテナーイメージのプルーニング

RHEL Web コンソールでコンテナーイメージをプルーニングすることで、どのコンテナーにも使用されていない、不要なイメージをすべて削除できます。

前提条件

  • 少なくとも 1 つのコンテナーイメージがプルされます。
  • RHEL 10 Web コンソールがインストールされている。手順は、Web コンソールのインストールおよび有効化 を参照してください。
  • cockpit-podman アドオンをインストールしている。

手順

  1. RHEL 10 Web コンソールにログインします。
  2. メインメニューで Podman containers をクリックします。
  3. Images テーブルで、右上隅のオーバーフローメニューをクリックし、Prune unused images を選択します。
  4. イメージのリストが表示されたウィンドウが開きます。Prune をクリックして選択を確定します。

検証

  • メインメニューで Podman containers をクリックします。削除されたイメージは、Images テーブルにリストされません。

16.3. Web コンソールでのコンテナーイメージの削除

Web コンソールを使用して、以前にプルしたコンテナーイメージを削除できます。

前提条件

  • 少なくとも 1 つのコンテナーイメージがプルされます。
  • RHEL 10 Web コンソールがインストールされている。
  • cockpit-podman アドオンがインストールされている。

手順

  1. RHEL 10 Web コンソールにログインします。
  2. メインメニューの Podman containers ボタンをクリックします。
  3. Images テーブルで、削除するイメージを選択し、オーバーフローメニューをクリックして Delete を選択します。
  4. 次のダイアログで、Delete tagged images をクリックして選択を確定します。

検証

  • メインメニューで Podman containers クリックします。削除されたコンテナーは、Images テーブルにリストされません。

第17章 RHEL Web コンソールを使用したコンテナーの管理

RHEL Web コンソールを使用して、コンテナーと Pod を管理できます。Web コンソールを使用すると、非 root または root ユーザーとしてコンテナーを作成できます。

  • root ユーザーとして、追加の権限とオプションを備えたシステムコンテナーを作成できます。
  • 非 root ユーザーには 2 つのオプションがあります。

    • ユーザーコンテナーのみを作成するには、Web コンソールをデフォルトモード (Limited access) で使用できます。
    • ユーザーコンテナーとシステムコンテナーの両方を作成するには、Web コンソールページの上部パネルで Administrative access をクリックします。

17.1. Web コンソールでのコンテナーチェックポイントの作成

実行中のコンテナーの正確な現在の状態を保存するには、Red Hat Enterprise Linux の Web コンソールでコンテナーのチェックポイントを作成します。このチェックポイントを設定することで、作業の進行状況を失うことなく、安全に操作を一時停止したり、ワークロードを別のホストに移行したり、後でコンテナーを復元したりすることができます。

前提条件

手順

  1. RHEL 10 Web コンソールにログインします。
  2. メインメニューで Podman containers をクリックします。
  3. Containers テーブルで、変更するコンテナーを選択し、オーバーフローアイコンメニューをクリックして Containers を選択します。
  4. オプション: Checkpoint container フォームで、必要なオプションをチェックします。

    • すべての一時チェックポイントファイルを保持する: チェックポイント処理中に Checkpoint/Restore In Userspace (CRIU) によって作成されたすべての一時ログおよび統計ファイルを保持します。さらなるデバッグのためのチェックポイント設定が失敗した場合でも、これらのファイルは削除されません。
    • チェックポイントをディスクに書き込んだ後も実行したままにする: チェックポイントを作成した後もコンテナーを停止するのではなく、実行したままにします。
    • 確立された TCP 接続の維持のサポート
  5. Checkpoint をクリックします。

    注記

    チェックポイントの作成は、システムコンテナーでのみ使用できます。

検証

  • メインメニューで Podman containers クリックします。チェックポイントを設定したコンテナーを選択し、オーバーフローメニューアイコンをクリックして、Restore オプションがあることを確認します。

17.2. Web コンソールでのコンテナーチェックポイントの復元

以前に保存した状態から操作を再開するには、Red Hat Enterprise Linux の Web コンソールでコンテナーのチェックポイントを復元します。ホストの再起動後、ワークロードを迅速に復旧したり、移行したコンテナーをデータ損失なくオンラインに戻したりすることも可能です。

前提条件

  • コンテナーにチェックポイントが設定されている。
  • RHEL 10 Web コンソールがインストールされている。手順は、Web コンソールのインストールおよび有効化 を参照してください。
  • cockpit-podman アドオンがインストールされている。

手順

  1. RHEL 10 Web コンソールにログインします。
  2. メインメニューで Podman containers をクリックします。
  3. Containers テーブルで、変更するコンテナーを選択し、オーバーフローメニューをクリックして Restore を選択します。
  4. オプション: Restore container フォームで、必要なオプションを確認します。

    • すべての一時チェックポイントファイルを保持する: チェックポイント処理中に CRIU によって作成されたすべての一時ログおよび統計ファイルを保持します。さらなるデバッグのためのチェックポイント設定が失敗した場合でも、これらのファイルは削除されません。
    • Restore with established TCP connections
    • 静的に設定されている場合は IP アドレスを無視する: ユーザーが IP アドレスを使用してコンテナーを開始した場合、復元されたコンテナーもその IP アドレスの使用を試みます。その IP アドレスがすでに使用されている場合、復元操作は失敗します。このオプションは、コンテナーの作成時に Integration タブでポートマッピングを追加した場合に適用されます。
    • 静的に設定されている場合は MAC アドレスを無視する: IP アドレスを使用してコンテナーが開始された場合、復元されたコンテナーもその MAC アドレスの使用を試みます。その MAC アドレスがすでに使用されている場合、復元操作は失敗します。
  5. Restore をクリックします。

    注記

    チェックポイントの作成は、システムコンテナーでのみ使用できます。

検証

  • メインメニューで Podman containers クリックします。Containers テーブルで復元されたコンテナーが実行されていることがわかります。

17.3. Web コンソールでの Pod の作成

関連するコンテナーを 1 つの単位としてグループ化して管理するには、Red Hat Enterprise Linux Web コンソールインターフェイスでコンテナー Pod を作成します。前提条件は以下のとおりです。

手順

  1. RHEL 10 Web コンソールにログインします。
  2. メインメニューで Podman containers をクリックします。
  3. Create pod をクリックします。
  4. Create pod フォームに必要な情報を入力します。

    • 管理アクセスでのみ使用可能: コンテナーの所有者: システムまたはユーザーを選択します。
    • Name フィールドに、コンテナーの名前を入力します。
    • Add port mapping をクリックして、コンテナーとホストシステムの間にポートマッピングを追加します。

      • IP アドレス、ホストポート、コンテナーポート、プロトコルを入力します。
    • Add volume をクリックしてボリュームを追加します。

      • ホストパス、コンテナーパスを入力します。書き込み可能チェックボックスをオンにして、書き込み可能なボリュームを作成できます。SELinux ドロップダウンリストで、次のオプションのいずれかを選択します: No Label、Shared、または Private。
  5. Create をクリックします。

検証

  • メインメニューで Podman containers をクリックします。新しく作成された Pod は Containers テーブルで確認できます。

17.4. Web コンソールの Pod 内にコンテナーを作成する

RHEL の Web コンソール GUI を使用して、Pod 内にコンテナーを作成できます。

前提条件

手順

  1. RHEL 10 Web コンソールにログインします。
  2. メインメニューで Podman containers をクリックします。
  3. Create container in pod をクリックします。
  4. Name フィールドに、コンテナーの名前を入力します。
  5. Details タブに必要な情報を入力します。

    • 管理アクセスでのみ使用可能: コンテナーの所有者: システムまたはユーザーを選択します。
    • Image ドロップダウンリストで、選択したレジストリー内のコンテナーイメージを選択または検索します。

      • オプション: 最新のコンテナーイメージをプルするには、Pull latest image チェックボックスをオンにします。
    • Command フィールドはコマンドを指定します。必要に応じて、デフォルトのコマンドを変更できます。

      • オプション: ターミナルを使用してコンテナーを実行するには、With terminal チェックボックスをオンにします。
    • Memory limit フィールドでは、コンテナーのメモリー制限を指定します。デフォルトのメモリー制限を変更するには、チェックボックスをオンにして制限を指定します。
    • システムコンテナーでのみ使用可能: CPU シェアフィールド で、相対的な CPU 時間量を指定します。デフォルト値は 1024 です。デフォルト値を変更するには、チェックボックスをオンにします。
    • システムコンテナーでのみ使用可能: Restart policy ドロップダウンメニューで、次のオプションのいずれかを選択します。

      • No (デフォルト値): アクションはありません。
      • On Failure: 失敗時にコンテナーを再起動します。
      • Always: コンテナーの終了時またはシステム起動後にコンテナーを再起動します。
  6. Integration タブに必要な情報を入力します。

    • Add port mapping をクリックして、コンテナーとホストシステムの間にポートマッピングを追加します。

      • IP アドレスホストポートコンテナーポート、および プロトコル を入力します。
    • Add volume をクリックしてボリュームを追加します。

      • ホストパスコンテナーパス を入力します。Writable オプションのチェックボックスをオンにして、書き込み可能なボリュームを作成できます。SELinux ドロップダウンリストで、No LabelShared、または Private のいずれかのオプションを選択します。
    • Add variable をクリックして環境変数を追加します。

      • KeyValue を入力します。
  7. Health check タブに必要な情報を入力します。

    • Command フィールドに、ヘルスチェックコマンドを入力します。
    • ヘルスチェックのオプションを指定します。

      • Interval (デフォルトは 30 秒)
      • Timeout (デフォルトは 30 秒)
      • Start period
      • Retries (デフォルトは 3)
      • When unhealthy: 次のいずれかのオプションを選択します。

        • No action (デフォルト): アクションはありません。
        • Restart: コンテナーを再起動します。
        • Stop: コンテナーを停止します。
        • Force stop: コンテナーを強制的に停止します。コンテナーが終了するまで待ちません。

          注記

          コンテナーと Pod の所有者は同じです。Pod では、コンテナーの検査、コンテナーのステータスの変更、コンテナーのコミット、またはコンテナーの削除を行うことができます。

検証

  • メインメニューで Podman containers をクリックします。Pod 内の Containers テーブルの下に、新しく作成されたコンテナーが表示されます。

第18章 ルートレス Podman の統一設定

統一されたシステム全体の設定ファイルを使用することで、Podman のすべてのルートレスユーザーに対して実現できます。手動で設定することなくデフォルト設定を継承しながら、個人設定ファイルを通じてシステムデフォルト設定をオーバーライドできる柔軟性も維持できます。

18.1. ルートレス Podman の統一設定の概要

デフォルトでは、containers.conf ルートレスは、すべてのユーザーに影響を与えるグローバル設定として /etc/containers/containers.conf を読み込んでいました。システム上のすべてのユーザーに対して、ルートフル Podman のプロセスに影響を与えることなく、ルートレス Podman のデフォルト設定を一元的に設定する方法がありませんでした。

ルートレスユーザーのみに影響するグローバル設定には、/etc/containers/containers.rootless.d/*.conf および /etc/containers/containers.rootless.d/$UID/*.conf を使用します。

統一設定は、主にモジュール化された階層構造の一連の設定ファイルを通じて管理されます。統一設定の主な特徴と利点は以下のとおりです。

  • システム管理者の場合: ルートレスコンテナーの組織全体のデフォルトを設定し、すべてのユーザー間で一貫した設定を確立し、共通のリソース制限、レジストリー設定、ランタイム動作を適用することで、運用上の標準化を実現できます。
  • エンドユーザーの場合: 手動で設定することなくデフォルト設定が継承され、個人の設定ファイルを通じてシステムのデフォルトをオーバーライドできます。既存のユーザーワークフローや設定を変更する必要がないため、下位互換性も確保されます。

以前は、システム管理者が使用できる、システム上のすべてのユーザーに対して、ルートフル Podman のプロセスに影響を与えることなく、ルートレス Podman のデフォルト設定を一元的に設定する手段がありませんでした。

18.2. 統一設定の指定

RHEL 上でルートレス Podman の統一設定を指定するには、前提条件に関するシステム全体の設定を主に管理しつつ、ユーザーに対してホームディレクトリー内にある特定の設定のオーバーライドを許可する必要があります。

前提条件

  • Podman をインストールしている。
  • ルートレス設定がセットアップされていることを確認した。

手順

  1. 統一設定は、以下の 2 つの方法で指定できます。

    • root 以外のすべてのユーザーに対して設定を指定できます。

      1. /etc/containers/containers.rootless.conf.d/ ディレクトリーを作成して、すべての非 root ユーザーに対して設定します。

        $ mkdir /etc/containers/containers.rootless.conf.d/
      2. たとえば、DNS サーバーを設定するには、/etc/containers/containers.rootless.conf.d/dns.conf 設定ファイルを作成します。

        [containers]
        dns_servers = [
          "1.1.1.1",
          "8.8.8.8",
        ]
    • 特定の非 root ユーザーに対して設定を指定できます。

      1. 特定の非 root ユーザーに対して設定するには、/etc/containers/containers.rootless.conf.d/UID/ ディレクトリーを作成します。

        $ mkdir /etc/containers/containers.rootless.conf.d/UID/
      2. たとえば、/etc/containers/containers.rootless.conf.d/4242740/dns.conf ディレクトリーに DNS サーバーを設定するための dns.conf 設定ファイルを作成します。

        [containers]
        dns_servers = [
          "1.1.1.1",
          "8.8.8.8",
        ]

        設定ファイルは、ユーザーの UID と同じ名前のディレクトリーに配置します。そうすることで、podman はどのユーザーに設定を適用するか認識できます。

第19章 コンテナーでの Skopeo、Buildah、および Podman の実行

これらのツールをホストに直接インストールせずにイメージをビルド、検査、管理するには、Red Hat Enterprise Linux 上のコンテナー内で Skopeo、Buildah、および Podman を実行します。コンテナー操作を分離することで、デプロイメントパイプラインが簡素化され、クリーンなホスト環境が維持されます。

19.1. コンテナーにおける Skopeo、Buildah、Podman の概要

Red Hat Enterprise Linux 上のコンテナー環境内で、Skopeo、Buildah、および Podman を実行できます。これには、ルートレス運用やデーモンレスアーキテクチャーなど、いくつかの利点があります。自己完結型の環境内で、コンテナーイメージの管理、構築、および検査を行うことができます。

Skopeo を使用すると、すべてのレイヤーでイメージ全体をダウンロードすることなく、リモートレジストリーのイメージを検査できます。また、Skopeo を使用して、イメージのコピー、イメージの署名、イメージの同期、さまざまな形式およびレイヤー圧縮でのイメージ変換を行うこともできます。

Buildah を使用すると、OCI コンテナーイメージのビルドが容易になります。Buildah を使用すると、作業コンテナーをゼロから作成することも、イメージを開始点として使用して作成することも可能です。作業コンテナーからか、Containerfile の指示を使用して、イメージを作成できます。作業コンテナーの root ファイルシステムをマウントおよびアンマウントできます。

Podman を使用すると、コンテナーおよびイメージ、それらのコンテナーにマウントされたボリューム、およびコンテナーのグループから作成された Pod を管理できます。Podman は、コンテナーライフサイクル管理の libpod ライブラリーに基づいています。libpod ライブラリーは、コンテナー、Pod、コンテナーイメージ、およびボリュームを管理するための API を提供します。

コンテナーで Buildah、Skopeo、および Podman を実行する理由:

  • CI/CD システム:

    • Podman および Skopeo: Kubernetes で CI/CD システムを実行するか、OpenShift を使用してコンテナーイメージをビルドし、これらのイメージを異なるコンテナーレジストリーに配布できます。Skopeo を Kubernetes ワークフローに統合するには、Skopeo をコンテナーで実行する必要があります。
    • Buildah: Kubernetes または OpenShift CI/CD システム内で、イメージを継続的に構築する OCI/ コンテナイメージをビルドする必要がある場合。これは、システムへの root アクセス権をパスワード要求なしで付与することと同等であり、セキュアではありません。このため、Red Hat はコンテナーで Buildah を使用することを推奨します。
  • 各種バージョン:

    • All: ホストで古いオペレーティングシステムを実行していても、最新バージョンの Skopeo、Buildah、または Podman を実行します。このソリューションは、コンテナーでコンテナーツールを実行します。たとえば、これは、最新版をネイティブで使用できない Red Hat Enterprise Linux 7 コンテナーホストで、Red Hat Enterprise Linux 8 で提供される最新版のコンテナーツールを実行するのに役立ちます。
  • HPC 環境:

    • All: HPC 環境における一般的な制限として、root ユーザー以外のユーザーはホストにパッケージをインストールできません。コンテナーで Skopeo、Buildah、または Podman を実行すると、root 以外のユーザーとしてこの特定のタスクを実行することができます。

19.2. コンテナーでの Skopeo の実行

Skopeo を使用してリモートコンテナーイメージを検査できます。コンテナーで Skopeo を実行すると、コンテナーの root ファイルシステムがホストの root ファイルシステムから分離されることを意味します。ホストとコンテナー間でファイルを共有またはコピーするには、ファイルとディレクトリーをマウントする必要があります。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. registry.redhat.io レジストリーにログインします。

    $ podman login registry.redhat.io
    Username: myuser@mycompany.com
    Password: <password>
    Login Succeeded!
  2. registry.redhat.io/rhel10/skopeo コンテナーイメージを取得します。

    $ podman pull registry.redhat.io/rhel10/skopeo
  3. Skopeo を使用して、リモートコンテナーイメージ registry.access.redhat.com/ubi10/ubi を検査します。

    $ podman run --rm registry.redhat.io/rhel10/skopeo \
      skopeo inspect docker://registry.access.redhat.com/ubi10/ubi
    {
        "Name": "registry.access.redhat.com/ubi10/ubi",
        ...
        "Labels": {
            "architecture": "x86_64",
            ...
            "name": "ubi10",
            ...
            "summary": "Provides the latest release of Red Hat Universal Base Image 10.",
            "url": "https://access.redhat.com/containers/#/registry.access.redhat.com/ubi10/images/8.2-347",
            ...
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Layers": [
        ...
        ],
        "Env": [
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "container=oci"
        ]
    }

    --rm オプションは、コンテナーの終了後に registry.redhat.io/rhel10/skopeo イメージを削除します。

19.3. 認証情報を使用したコンテナーでの Skopeo の実行

コンテナーレジストリーを使用する場合には、データへのアクセスや変更に認証が必要です。Skopeo は、さまざまな認証情報の指定方法に対応します。たとえば、コマンドラインで --cred USERNAME[:PASSWORD] オプションを使用することで、認証情報を指定できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • ロックされたレジストリーに対して Skopeo を使用してリモートコンテナーイメージを検証します。

    $ podman run --rm registry.redhat.io/rhel10/skopeo inspect --creds $USER:$PASSWORD docker://$IMAGE

19.4. authfile を使用したコンテナーでの Skopeo の実行

認証ファイル (authfile) を使用して認証情報を指定できます。skopeo login コマンドは、特定のレジストリーにログインし、認証トークンを authfile に保存します。authfiles を使用する利点は、認証情報を繰り返し入力する必要がないことです。

同じホストで実行する場合、Skopeo、Buildah、Podman などのすべてのコンテナーツールで同じ authfile を共有します。コンテナーで Skopeo を実行する場合は、コンテナーに authfile をボリュームマウントしてホスト上で authfile を共有するか、コンテナー内で再認証する必要があります。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • ロックされたレジストリーに対して Skopeo を使用してリモートコンテナーイメージを検証します。

    $ podman run --rm -v $AUTHFILE:/auth.json registry.redhat.io/rhel10/skopeo inspect docker://$IMAGE

    -v $AUTHFILE:/auth.json オプションの volume-mounts は、コンテナー内の /auth.json に authfile をマウントします。Skopeo は、ホストの authfile の認証トークンにアクセスでき、レジストリーにセキュアにアクセスできるようになります。

    その他の Skopeo コマンドも同様に機能します。以下に例を示します。

    • skopeo-copy コマンドで --source-creds および --dest-creds オプションを使用して、ソースおよび宛先のイメージに、コマンドラインで認証情報を指定します。また、/auth.json の authfile も読み取ります。
    • ソースイメージおよび宛先イメージに個別の authfile を指定する場合は、--source-authfile オプションおよび --dest-authfile オプションを使用し、ホストからコンテナーにこれらの authfile をボリュームマウントします。

19.5. ホストに対するコンテナーイメージのコピー

Skopeo、Buildah、Podman は同じローカルコンテナーイメージストレージを共有します。ホストコンテナーストレージとの間でコンテナーをコピーする場合は、これを Skopeo コンテナーにマウントする必要があります。

注記

ホストコンテナーストレージへのパスは、root (/var/lib/containers/storage) と root 以外のユーザー ($HOME/.local/share/containers/storage) の間で異なります。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. registry.access.redhat.com/ubi10/ubi イメージをローカルストレージにコピーします。

    $ podman run --privileged --rm -v $HOME/.local/share/containers/storage:/var/lib/containers/storage \
    registry.redhat.io/rhel10/skopeo skopeo copy \
    docker://registry.access.redhat.com/ubi10/ubi containers-storage:registry.access.redhat.com/ubi10/ubi
    • --privileged オプションは、すべてのセキュリティーメカニズムを無効にします。Red Hat では、このオプションは信頼できる環境でのみ使用することを推奨します。
    • セキュリティーメカニズムを無効にするには、イメージを tarball またはその他のパスベースのイメージトランスポートにエクスポートして Skopeo コンテナーにマウントします。

      • $ podman save --format oci-archive -o oci.tar $IMAGE
      • $ podman run --rm -v oci.tar:/oci.tar registry.redhat.io/rhel10/skopeo copy oci-archive:/oci.tar $DESTINATION
  2. オプション: ローカルストレージ内のイメージをリスト表示します。

    $ podman images
    REPOSITORY                               TAG     IMAGE ID      CREATED       SIZE
    registry.access.redhat.com/ubi10/ubi      latest  ecbc6f53bba0  8 weeks ago   211 MB

19.6. コンテナーでの Buildah の実行

コンテナー内で Buildah を実行して、分離された環境でイメージをビルドします。これにより、ホストシステムを変更することなくイメージを作成できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. registry.redhat.io レジストリーにログインします。

    $ podman login registry.redhat.io
    Username: myuser@mycompany.com
    Password: <password>
    Login Succeeded!
  2. registry.redhat.io/rhel10/buildah イメージをプルして実行します。

    # podman run --rm --device /dev/fuse -it \
      registry.redhat.io/rhel10/buildah /bin/bash
    • --rm オプションは、コンテナーの終了後に registry.redhat.io/rhel10/buildah イメージを削除します。
    • --device オプションは、ホストデバイスをコンテナーに追加します。
    • sys_chroot - 別のルートディレクトリーに変更する機能。コンテナーのデフォルト機能には含まれていません。
  3. registry.access.redhat.com/ubi10/ イメージを使用して、新しいコンテナーを作成します。

    # buildah from registry.access.redhat.com/ubi10/
    ...
    ubi10/-working-container
  4. ubi10/-working-container コンテナー内で ls / コマンドを実行します。

    # buildah run --isolation=chroot ubi10/-working-container ls /
    bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv
  5. 必要に応じて、ローカルストレージ内の全イメージをリスト表示します。

    # buildah images
    REPOSITORY                        TAG      IMAGE ID       CREATED       SIZE
    registry.access.redhat.com/ubi10/   latest   ecbc6f53bba0   5 weeks ago   211 MB
  6. 必要に応じて、作業用コンテナーとそのベースイメージをリスト表示します。

    # buildah containers
    CONTAINER ID  BUILDER  IMAGE ID     IMAGE NAME                       CONTAINER NAME
    0aaba7192762     *     ecbc6f53bba0 registry.access.redhat.com/ub... ubi10/-working-container
  7. オプション: registry.access.redhat.com/ubi10/ イメージを registry.example.com にあるローカルレジストリーにプッシュします。

    # buildah push ecbc6f53bba0 registry.example.com:5000/ubi10/ubi

19.7. 特権および非特権 Podman コンテナー

デフォルトでは、Podman コンテナーは権限がないため、たとえばホストオペレーティングシステムの一部を変更することはできません。これは、デフォルトでコンテナーによるデバイスへのアクセスは制限されているためです。

以下は、特権コンテナーの重要なプロパティーのリストです。特権コンテナーは、podman run --privileged <image_name> コマンドを使用して実行できます。

  • 特権コンテナーには、コンテナーを起動するユーザーと同じデバイスへのアクセス権限が付与されます。
  • 特権コンテナーは、コンテナーをホストから分離するセキュリティー機能を無効にします。削除された機能、制限されたデバイス、読み取り専用マウントポイント、Apparmor または SELinux の分離、および Seccomp フィルターは、すべて無効にされます。
  • 特権コンテナーには、それらを起動したアカウント以上の特権を割り当てることはできません。

19.8. 拡張された権限での Podman の実行

ルートレス運用が不可能な場合は、拡張された権限を使用してコンテナー内で Podman を実行できます。この方法はセキュリティーの分離を低下させるため、慎重に使用してください。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • Podman コンテナー内で Podman コンテナーを実行します。

    $ podman run --privileged --name=privileged_podman \
      registry.access.redhat.com//podman podman run ubi10 echo hello
    Resolved "ubi10" as an alias (/etc/containers/registries.conf.d/001-rhel-shortnames.conf)
    Trying to pull registry.access.redhat.com/ubi10:latest...
    ...
    Storing signatures
    hello
  • registry.access.redhat.com/ubi10/podman イメージに基づいて、privileged_podman という名前の外部コンテナーを実行します。
  • --privileged オプションは、コンテナーをホストから分離するセキュリティー機能を無効にします。
  • podman run ubi10 echo hello コマンドを実行して、ubi10 イメージに基づいて内部コンテナーを作成します。
  • ubi10 の短縮イメージ名がエイリアスとして解決されていることに注意してください。これにより、registry.access.redhat.com/ubi10:latest i イメージがプルされます。

検証

  • すべてのコンテナーをリスト表示します。

    $ podman ps -a
    CONTAINER ID  IMAGE                            COMMAND               CREATED            STATUS                          PORTS   NAMES
    52537876caf4  registry.access.redhat.com/ubi10/podman               podman run ubi10 e...  30 seconds ago     Exited (0) 13 seconds ago               privileged_podman

    詳細は、システム上の podman-run(1) man ページを参照してください。

19.9. 少ない権限での Podman の実行

--privileged オプションを指定せずに、ネストされた 2 つの Podman コンテナーを実行できます。--privileged オプションを指定せずにコンテナーを実行することは、よりセキュアなオプションです。これは、可能な限りセキュアな方法で異なるバージョンの Podman を試す場合に役立ちます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • ネストされた 2 つのコンテナーを実行します。

    $ podman run --name=unprivileged_podman --security-opt label=disable \
      --user podman --device /dev/fuse \
      registry.access.redhat.com/ubi10/podman \
      podman run ubi10 echo hello
  • registry.access.redhat.com/ubi10/podman イメージに基づいて、unprivileged_podman という名前の外部コンテナーを実行します。
  • --security-opt label=disable オプションは、ホスト Podman での SELinux の分離を無効にします。SELinux では、コンテナー化されたプロセスは、コンテナー内で実行するために必要なすべてのファイルシステムをマウントすることはできません。
  • --user podman オプションを指定すると、自動的に、外部コンテナー内の Podman がユーザーの namespace 内で実行されるようになります。
  • --device /dev/fuse オプションは、コンテナー内の fuse-overlayfs パッケージを使用します。このオプションは /dev/fuse を外部コンテナーに追加し、コンテナー内の Podman がこれを使用できるようにします。
  • podman run ubi10 echo hello コマンドを実行して、ubi10 イメージに基づいて内部コンテナーを作成します。
  • ubi10 の短縮イメージ名がエイリアスとして解決されていることに注意してください。これにより、registry.access.redhat.com/ubi10:latest i イメージがプルされます。

検証

  • すべてのコンテナーをリスト表示します。

    $ podman ps -a
    CONTAINER ID  IMAGE                            COMMAND               CREATED            STATUS                          PORTS   NAMES
    a47b26290f43               podman run ubi10 e...  30 seconds ago     Exited (0) 13 seconds ago               unprivileged_podman

19.10. Podman コンテナー内でのコンテナーのビルド

分離された開発環境を作成したり、CI/CD パイプラインにおけるイメージ構築を自動化したりするには、既存の Podman コンテナー内からコンテナーイメージを構築できます。ホストシステムの設定を変更することなく、イメージのテストや開発を行うこともできます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. registry.redhat.io レジストリーにログインしている。

    # podman login registry.redhat.io
  2. registry.redhat.io/rhel10/podman イメージをベースとするコンテナーを実行します。

    # podman run --privileged --name podman_container -it \
      registry.redhat.io/rhel10/podman /bin/bash

    registry.redhat.io/rhel10/podman イメージに基づいて、podman_container という名前の外部コンテナーを実行します。--it オプションは、コンテナー内で対話式 bash シェルを実行します。--privileged オプションは、コンテナーをホストから分離するセキュリティー機能を無効にします。

  3. podman_container コンテナー内に Containerfile を作成します。

    # vi Containerfile
    FROM registry.access.redhat.com/ubi10/ubi
    RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
    RUN dnf -y install moon-buggy && dnf clean all
    CMD ["/usr/bin/moon-buggy"]

    Containerfile のコマンドで以下の build コマンドが実行されます。

    • registry.access.redhat.com/ubi10/ubi イメージからコンテナーをビルドします。
    • epel-release-latest-8.noarch.rpm パッケージをインストールします。
    • moon-buggy パッケージをインストールします。
    • コンテナーコマンドを設定します。
  4. Containerfile を使用して moon-buggy という名前の新しいコンテナーイメージをビルドします。

    # podman build -t moon-buggy .
  5. 必要に応じて、すべてのイメージをリスト表示します。

    # podman images
    REPOSITORY                  TAG      IMAGE ID      CREATED        SIZE
    localhost/moon-buggy  latest  c97c58abb564  13 seconds ago  1.67 GB
    registry.access.redhat.com/ubi10/ubi latest 4199acc83c6a  132seconds ago 213 MB
  6. moon-buggy コンテナーをベースとする新しいコンテナーを実行します。

    # podman run -it --name moon moon-buggy
  7. 必要に応じて、moon-buggy イメージをタグ付けします。

    # podman tag moon-buggy registry.example.com/moon-buggy
  8. 必要に応じて、moon-buggy イメージをレジストリーにプッシュします。

    # podman push registry.example.com/moon-buggy

    この例は、Podman がこのコンテナー内から別のコンテナーを構築して実行する方法を示しています。このコンテナーは、シンプルなテキストベースのゲームである Moon-buggy を実行します。

第20章 コンテナーの監視

RHEL 上のコンテナーは、Podman や RHEL Web コンソールなどのツールを使用して監視できます。主な手法としては、コンテナーログの検査、リソース使用状況の監視、コンテナープロセスの健全性の確認などがあります。

20.1. コンテナーでヘルスチェックを使用する

コンテナー内で実行されているプロセスの健全性や準備状況を判断するには、ヘルスチェックを実行します。ヘルスチェックに成功すると、コンテナーは "healthy" とマークされます。そうでなければ、"unhealthy" とマークされます。

podman exec コマンドを実行して終了コードを調べることで、ヘルスチェックを比較できます。ゼロの終了値は、コンテナーが healthy であることを意味します。ContainerfileHEALTHCHECK 命令を使用してイメージをビルドするとき、またはコマンドラインでコンテナーを作成するときに、ヘルスチェックを設定できます。

podman inspect または podman ps コマンドを使用して、コンテナーのヘルスチェックのステータスを表示できます。ヘルスチェックは、次の 6 つの基本コンポーネントで構成されます。

  • コマンド
  • Retries
  • Interval
  • Start-period
  • Timeout
  • コンテナー回収

ヘルスチェックコンポーネントの説明は次のとおりです。

コマンド (--health-cmd オプション)
Podman は、ターゲットコンテナー内でコマンドを実行して終了コードを待ちます。

他の 5 つのコンポーネントは、ヘルスチェックのスケジューリングに関連しており、オプションです。

再試行 (--health-retries オプション)
"正常でない" とマークするまでに、ヘルスチェックで連続して不合格とならなければならないか、その回数を定義します。ヘルスチェックに成功すると、再試行数がリセットされます。
間隔 (--health-interval オプション)
次にヘルスチェックコマンドを実行するまでの時間を指定します。間隔が短いと、システムがヘルスチェックを実行するために多くの時間を費やすことになるので注意してください。この間隔が長いと、タイムアウトの発生を検知するのが困難になります。
開始期間 (--health-start-period オプション)
コンテナーを起動してからヘルスチェックの不合格を無視するまでの時間を指定します。
タイムアウト (--health-timeout オプション)
ヘルスチェックの完了前に不合格とみなされるまでの期間を指定します。
注記

Retries、Interval、および Start-period コンポーネントの値は、“30s” や “1h15m” などの期間です。有効な時間単位は、"ns"、"us" または "µs"、"ms"、"s"、"m"、および "h"。

コンテナーの復旧 (--health-on-failure オプション)

コンテナーのステータスが異常な場合に実行するアクションを決定します。アプリケーションに障害が発生すると、Podman は自動的にアプリケーションを再起動して堅牢性を提供します。--health-on-failure オプションは、次の 4 つのアクションをサポートします。

  • none: アクションを実行しません。これがデフォルトのアクションです。
  • kill: コンテナーを強制終了します。
  • restart: コンテナーを再起動します。
  • stop: コンテナーを停止します。

    注記

    --health-on-failure オプションは、Podman バージョン 4.2 以降で使用できます。

警告

restart アクションを --restart オプションと組み合わせないでください。systemd ユニット内で実行する場合は、代わりに kill または stop アクションを使用して、systemd 再起動ポリシーを利用することを検討してください。

コンテナー内でヘルスチェックが実行されます。ヘルスチェックは、サービスのヘルス状態がどのようなものかを把握しており、ヘルスチェックの成功と失敗を区別できる場合にのみ意味があります。

詳細は、システム上の podman-healthcheck(1) および podman-run(1) man ページを参照してください。

20.2. コマンドラインを使用してヘルスチェックを実行する

コマンドラインでコンテナーを作成するときに、ヘルスチェックを設定できます。これを使用して、コンテナーのアプリケーションステータスを監視するためのコマンドと間隔を指定できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. ヘルスチェックを定義します。

    $ podman run -dt --name=hc-container -p 8080:8080 --health-cmd='curl http://localhost:8080 || exit 1' --health-interval=0 registry.access.redhat.com/ubi10/httpd-24

    --health-cmd オプションはコンテナーのヘルスチェックコマンドを設定し、--health-interval=0 はヘルスチェックを手動で実行することを示します。

  2. hc-container コンテナーのヘルスステータスを確認します。

    • podman inspect コマンドの使用:

      $ podman inspect --format='{{json .State.Health.Status}}' hc-container
      healthy
    • podman ps コマンドの使用:

      $ podman ps
      CONTAINER ID  IMAGE                 COMMAND               CREATED      STATUS          PORTS       NAMES
      a680c6919fe  localhost/hc-container:latest  /usr/bin/run-http...  2 minutes ago  Up 2 minutes (healthy) hc-container
    • podman healthcheck run コマンドを使用します。

      $ podman healthcheck run hc-container
      healthy

      詳細は、システム上の podman-healthcheck(1) および podman-run(1) man ページを参照してください。

20.3. Containerfile を使用してヘルスチェックを実行する

ContainerfileHEALTHCHECK 命令を使用してヘルスチェックを設定できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. Containerfile を作成します。

    $ cat Containerfile
    FROM registry.access.redhat.com/ubi10/httpd-24
    EXPOSE 8080
    HEALTHCHECK CMD curl http://localhost:8080 || exit 1
    注記

    HEALTHCHECK 命令は、docker イメージ形式でのみサポートされています。oci イメージ形式の場合、命令は無視されます。

  2. コンテナーをビルドし、イメージ名を追加します。

    $ podman build --format=docker -t hc-container .
    STEP 1/3: FROM registry.access.redhat.com/ubi10/httpd-24
    STEP 2/3: EXPOSE 8080
    --> 5aea97430fd
    STEP 3/3: HEALTHCHECK CMD curl http://localhost:8080 || exit 1
    COMMIT health-check
    Successfully tagged localhost/health-check:latest
    a680c6919fe6bf1a79219a1b3d6216550d5a8f83570c36d0dadfee1bb74b924e
  3. コンテナーを実行します。

    $ podman run -dt --name=hc-container localhost/hc-container
  4. hc-container コンテナーのヘルスステータスを確認します。

    • podman inspect コマンドの使用:

      $ podman inspect --format='{{json .State.Health.Status}}' hc-container
      healthy
    • podman ps コマンドの使用:

      $ podman ps
      CONTAINER ID  IMAGE                 COMMAND               CREATED      STATUS          PORTS       NAMES
      a680c6919fe  localhost/hc-container:latest  /usr/bin/run-http...  2 minutes ago  Up 2 minutes (healthy) hc-container
    • podman healthcheck run コマンドを使用します。

      $ podman healthcheck run hc-container
      healthy

      詳細は、システム上の podman-healthcheck(1) および podman-run(1) man ページを参照してください。

20.4. Podman システム情報の表示

podman system コマンドを使用すると、Podman の包括的なシステム情報とディスク使用量を表示できます。これは、ストレージ使用量を監視し、環境の詳細を確認するために役立ちます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • Podman システム情報を表示します。

    • Podman のディスク使用量を表示するには、以下を入力します。

      $ podman system df
      TYPE           TOTAL       ACTIVE      SIZE        RECLAIMABLE
      Images         3           2           1.085GB     233.4MB (0%)
      Containers     2           0           28.17kB     28.17kB (100%)
      Local Volumes  3           0           0B          0B (0%)
    • 領域の使用状況に関する詳細情報を表示するには、次のコマンドを実行します。

      $ podman system df -v
      Images space usage:
      
      REPOSITORY                                TAG         IMAGE ID      CREATED     SIZE        SHARED SIZE  UNIQUE SIZE  CONTAINERS
      registry.access.redhat.com/ubi10           latest      b1e63aaae5cf  13 days     233.4MB     233.4MB      0B           0
      registry.access.redhat.com/ubi10/httpd-24  latest      0d04740850e8  13 days     461.5MB     0B           461.5MB      1
      registry.redhat.io/rhel8/podman           latest      dce10f591a2d  13 days     390.6MB     233.4MB      157.2MB      1
      
      Containers space usage:
      
      CONTAINER ID  IMAGE         COMMAND                     LOCAL VOLUMES  SIZE        CREATED     STATUS      NAMES
      311180ab99fb  0d04740850e8  /usr/bin/run-httpd          0              28.17kB     16 hours    exited      hc1
      bedb6c287ed6  dce10f591a2d  podman run ubi10 echo hello  0              0B          11 hours    configured  dazzling_tu
      
      Local Volumes space usage:
      
      VOLUME NAME                                                       LINKS       SIZE
      76de0efa83a3dae1a388b9e9e67161d28187e093955df185ea228ad0b3e435d0  0           0B
      8a1b4658aecc9ff38711a2c7f2da6de192c5b1e753bb7e3b25e9bf3bb7da8b13  0           0B
      d9cab4f6ccbcf2ac3cd750d2efff9d2b0f29411d430a119210dd242e8be20e26  0           0B
    • Podman のホスト、現在のストレージ統計、およびビルドに関する情報を表示するには、以下を入力します。

      $ podman system info
      host:
        arch: amd64
        buildahVersion: 1.22.3
        cgroupControllers: []
        cgroupManager: cgroupfs
        cgroupVersion: v2
        conmon:
          package: conmon-2.0.29-1.module+el8.5.0+12381+e822eb26.x86_64
          path: /usr/bin/conmon
          version: 'conmon version 2.0.29, commit: 7d0fa63455025991c2fc641da85922fde889c91b'
        cpus: 2
        distribution:
          distribution: '"rhel"'
          version: "8.5"
        eventLogger: file
        hostname: localhost.localdomain
        idMappings:
          gidmap:
          - container_id: 0
            host_id: 1000
            size: 1
          - container_id: 1
            host_id: 100000
            size: 65536
          uidmap:
          - container_id: 0
            host_id: 1000
            size: 1
          - container_id: 1
            host_id: 100000
            size: 65536
        kernel: 4.18.0-323.el8.x86_64
        linkmode: dynamic
        memFree: 352288768
        memTotal: 2819129344
        ociRuntime:
          name: runc
          package: runc-1.0.2-1.module+el8.5.0+12381+e822eb26.x86_64
          path: /usr/bin/runc
          version: |-
            runc version 1.0.2
            spec: 1.0.2-dev
            go: go1.16.7
            libseccomp: 2.5.1
        os: linux
        remoteSocket:
          path: /run/user/1000/podman/podman.sock
        security:
          apparmorEnabled: false
          capabilities: CAP_NET_RAW,CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_NET_BIND_SERVICE,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT
          rootless: true
          seccompEnabled: true
          seccompProfilePath: /usr/share/containers/seccomp.json
          selinuxEnabled: true
        serviceIsRemote: false
        slirp4netns:
          executable: /usr/bin/slirp4netns
          package: slirp4netns-1.1.8-1.module+el8.5.0+12381+e822eb26.x86_64
          version: |-
            slirp4netns version 1.1.8
            commit: d361001f495417b880f20329121e3aa431a8f90f
            libslirp: 4.4.0
            SLIRP_CONFIG_VERSION_MAX: 3
            libseccomp: 2.5.1
        swapFree: 3113668608
        swapTotal: 3124752384
        uptime: 11h 24m 12.52s (Approximately 0.46 days)
      registries:
        search:
        - registry.fedoraproject.org
        - registry.access.redhat.com
        - registry.centos.org
        - docker.io
      store:
        configFile: /home/user/.config/containers/storage.conf
        containerStore:
          number: 2
          paused: 0
          running: 0
          stopped: 2
        graphDriverName: overlay
        graphOptions:
          overlay.mount_program:
            Executable: /usr/bin/fuse-overlayfs
            Package: fuse-overlayfs-1.7.1-1.module+el8.5.0+12381+e822eb26.x86_64
            Version: |-
              fusermount3 version: 3.2.1
              fuse-overlayfs: version 1.7.1
              FUSE library version 3.2.1
              using FUSE kernel interface version 7.26
        graphRoot: /home/user/.local/share/containers/storage
        graphStatus:
          Backing Filesystem: xfs
          Native Overlay Diff: "false"
          Supports d_type: "true"
          Using metacopy: "false"
        imageStore:
          number: 3
        runRoot: /run/user/1000/containers
        volumePath: /home/user/.local/share/containers/storage/volumes
      version:
        APIVersion: 3.3.1
        Built: 1630360721
        BuiltTime: Mon Aug 30 23:58:41 2021
        GitCommit: ""
        GoVersion: go1.16.7
        OsArch: linux/amd64
        Version: 3.3.1
    • 未使用のコンテナー、イメージ、およびボリュームデータをすべて削除するには、次のコマンドを実行します。

      $ podman system prune
      WARNING! This will remove:
              - all stopped containers
              - all stopped pods
              - all dangling images
              - all build cache
      Are you sure you want to continue? [y/N] y

      podman system prune コマンドは、未使用のコンテナー (関連付けられていないコンテナーおよび参照されていないコンテナー両方)、Pod、ローカルストレージのボリューム (任意) をすべて削除します。--all オプションを使用すると、ダングリングイメージや、コンテナーのベースとして使用されていないすべてのイメージを含む、未使用のイメージを一括で削除できます。ボリュームをプルーニングするには、--volume オプションを使用します。デフォルトでは、コンテナーが現在ボリュームを使用していない場合、重要なデータが削除されるのを防ぐため、ボリュームは削除されません。

      詳細は、システム上の podman-system-dfpodman-system-info、および podman-system-prune man ページを参照してください。

20.5. Podman イベントタイプ

Podman が報告する様々なイベントのタイプ (コンテナーの作成、イメージのプル、Pod のライフサイクル変更など) について説明します。これらのイベントを監視することで、システムアクティビティーを追跡できます。

コンテナー イベントタイプは以下のステータスを報告します。

  • attach
  • checkpoint
  • cleanup
  • commit
  • create
  • exec
  • export
  • import
  • init
  • kill
  • mount
  • pause
  • prune
  • remove
  • restart
  • restore
  • start
  • stop
  • sync
  • unmount
  • unpause

Pod イベントタイプは以下のステータスを報告します。

  • create
  • kill
  • pause
  • remove
  • start
  • stop
  • unpause

image イベントタイプは以下のステータスを報告します。

  • prune
  • push
  • pull
  • save
  • remove
  • tag
  • untag

system タイプは、以下のステータスを報告します。

  • refresh
  • renumber

volume タイプは、以下のステータスを報告します。

  • create
  • prune
  • remove

    詳細は、システム上の podman-events(1) man ページを参照してください。

20.6. Podman イベントのモニタリング

podman events コマンドを使用して、システムのリアルタイムアクティビティーを追跡します。タイムスタンプと詳細情報を含むイベントのストリームが表示されるため、監査やトラブルシューティングに役立ちます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. myubi コンテナーを実行します。

    $ podman run -q --rm --name=myubi registry.access.redhat.com/ubi10/ubi:latest
  2. Podman イベントを表示します。

    • すべての Podman イベントを表示するには、次のように入力します。

      $ now=$(date --iso-8601=seconds)
      $ podman events --since=now --stream=false
      2023-03-08 14:27:20.696167362 +0100 CET container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.access.redhat.com/ubi10/ubi:latest, name=myubi,...)
      2023-03-08 14:27:20.652325082 +0100 CET image pull  registry.access.redhat.com/ubi10/ubi:latest
      2023-03-08 14:27:20.795695396 +0100 CET container init d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.access.redhat.com/ubi10/ubi:latest, name=myubi...)
      2023-03-08 14:27:20.809205161 +0100 CET container start d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.access.redhat.com/ubi10/ubi:latest, name=myubi...)
      2023-03-08 14:27:20.809903022 +0100 CET container attach d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.access.redhat.com/ubi10/ubi:latest, name=myubi...)
      2023-03-08 14:27:20.831710446 +0100 CET container died d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.access.redhat.com/ubi10/ubi:latest, name=myubi...)
      2023-03-08 14:27:20.913786892 +0100 CET container remove d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.access.redhat.com/ubi10/ubi:latest, name=myubi...)

      --stream=false オプションを使用すると、最後の既知のイベントを読み取るときに podman events コマンドが確実に終了します。

      podman run コマンドを入力すると、発生したいくつかのイベントが表示されます。

      • 新しいコンテナーを作成する際は、container create
      • コンテナーイメージがローカルストレージに存在しない場合、イメージをプルする際は、image pull
      • ランタイムでコンテナーを初期化し、ネットワークを設定する際は、container init
      • コンテナーを起動する際は、container start
      • コンテナーのターミナルにアタッチする際は、container attach。これは、コンテナーがフォアグラウンドで実行されるためです。
      • コンテナーが終了すると、container died が発行されます。
      • --rm フラグは、コンテナーの終了後、コンテナーの削除に使用されたため、container remove
    • また、journalctl コマンドを使用して Podman イベントを表示することもできます。

      $ journalctl --user -r SYSLOG_IDENTIFIER=podman
      Mar 08 14:27:20 fedora podman[129324]: 2023-03-08 14:27:20.913786892 +0100 CET m=+0.066920979 container remove
      ...
      Mar 08 14:27:20 fedora podman[129289]: 2023-03-08 14:27:20.696167362 +0100 CET m=+0.079089208 container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72f>
    • Podman の作成イベントのみを表示するには、以下を入力します。

      $ podman events --filter event=create
      2023-03-08 14:27:20.696167362 +0100 CET container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.access.redhat.com/ubi10/ubi:latest, name=myubi,...)
    • また、journalctl コマンドを使用して Podman 作成イベントを表示することもできます。

      $ journalctl --user -r PODMAN_EVENT=create
      Mar 08 14:27:20 fedora podman[129289]: 2023-03-08 14:27:20.696167362 +0100 CET m=+0.079089208 container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72f>

      詳細は、システム上の podman-events(1) man ページを参照してください。

20.7. Podman イベントを使用した監査

イベントログに検査データを含めるように Podman を設定することで、監査を強化できます。これにより、セキュリティー設定や設定など、イベントの詳細なコンテキストがログエントリーに直接表示されます。

以前は、イベントを正しく解釈するには、イベントをイベントに接続する必要がありました。たとえば、どのイメージが使用されたかを知るには、container-create イベントを image-pull イベントにリンクする必要がありました。また、container-create イベントには、セキュリティー設定、ボリューム、マウントなどのすべてのデータが含まれているわけではありません。

Podman v4.4 以降、コンテナーに関するすべての関連情報を 1 つのイベントと journald エントリーから直接収集できるようになりました。データは podman container inspect コマンドからのものと同じ JSON 形式であり、コンテナーのすべての設定とセキュリティー設定が含まれます。監査目的でコンテナー検査データを添付するように Podman を設定できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. ~/.config/containers/containers.conf ファイルを変更し、events_container_create_inspect_data=true オプションを [engine] セクションに追加します。

    $ cat ~/.config/containers/containers.conf
    [engine]
    events_container_create_inspect_data=true

    システム全体の設定の場合は、/etc/containers/containers.conf または /usr/share/container/containers.conf ファイルを変更します。

  2. コンテナーを作成します。

    $ podman create registry.access.redhat.com/ubi10/ubi:latest
    19524fe3c145df32d4f0c9af83e7964e4fb79fc4c397c514192d9d7620a36cd3
  3. Podman イベントを表示します。

    • podman events コマンドを使用します。

      $ now=$(date --iso-8601=seconds)
      $ podman events --since $now --stream=false --format "{{.ContainerInspectData}}" | jq ".Config.CreateCommand"
      [
        "/usr/bin/podman",
        "create",
        "registry.access.redhat.com/ubi10"
      ]
      • --format "{{.ContainerInspectData}}" オプションは検査データを表示します。
      • jq ".Config.CreateCommand" は、JSON データをより読みやすい形式に変換し、podman create コマンドのパラメーターを表示します。
    • journalctl コマンドを使用します。

      $ journalctl --user -r PODMAN_EVENT=create --all -o json | jq ".PODMAN_CONTAINER_INSPECT_DATA | fromjson" | jq ".Config.CreateCommand"
      [
        "/usr/bin/podman",
        "create",
        "registry.access.redhat.com/ubi10"
      ]

      podman eventsjournalctl コマンドの出力データは同じです。

      詳細は、システム上の podman-events(1) および containers.conf(5) man ページを参照してください。

第21章 開発とトラブルシューティングに Toolbx を使用する

Toolbx コンテナーを使用すると、ホストシステムを変更することなく開発ツールをインストールできます。Toolbx は、システムをクリーンに保ちながらホストリソースにアクセスできるシームレスな環境を提供します。

システムへのソフトウェアのインストールには、一定のリスクが伴います。これにより、システムの動作が変化する可能性や、不要になった後も望ましくないファイルやディレクトリーがシステム内に残されてしまう可能性があります。

開発ツール、デバッグツール、エディター、ソフトウェア開発キット (SDK) を、ベースとなるオペレーティングシステムに影響を与えることなく、完全に変更可能な Toolbx コンテナーにインストールすることで、これらのリスクを回避できます。lesslsofrsyncsshsudounzip などのコマンドを使用して、ホストシステム上で変更を加えることができます。

開発ツールや SDK を Toolbx コンテナーにインストールすることで、ベースとなるオペレーティングシステムへのシステム変更や不要なファイルのインストールを回避できます。lesslsofrsyncsshsudounzip などのコマンドを使用して、ホストシステム上で変更を実行することもできます。Toolbx ユーティリティーは次のアクションを実行します。

  1. registry.access.redhat.com/ubi10/toolbox:latest イメージをローカルシステムにプルする
  2. イメージからコンテナーを起動する
  3. コンテナー内でシェルを実行し、そこからホストシステムにアクセスできる
注記

Toolbx コンテナーがルートコンテナーとして実行されるか、ルートレスコンテナーとして実行されるかは、それを作成したユーザーの権限によって決まります。ホストシステム上で root 権限を必要とするユーティリティーは、root コンテナー内で実行する必要があります。

21.1. Toolbx コンテナーの起動

Toolbx コンテナーを起動することで、開発やトラブルシューティングのための分離環境に入ることができます。コンテナーに入ることで、基盤となるホストオペレーティングシステムを変更することなく、コマンドラインツールをインストールおよび実行できます。

手順

  1. Toolbx コンテナーを作成します。

    • ルートレスユーザーとして:

      $ toolbox create <mytoolbox>
      Created container: <mytoolbox>
      Enter with: toolbox enter <mytoolbox>
    • ルートユーザーとして:

      $ sudo toolbox create <mytoolbox>
      Created container: <mytoolbox>
      Enter with: toolbox enter <mytoolbox>
    • 正しいイメージを取得したことを確認します。

      [user@toolbox ~]$ toolbox list
      IMAGE ID      IMAGE NAME    CREATED
      fe0ae375f149   registry.access.redhat.com/ubi10/toolbox:latest 5 weeks ago
      
      CONTAINER ID  CONTAINER NAME  CREATED         STATUS   IMAGE NAME
      5245b924c2cb  <mytoolbox>       7 minutes ago   created  registry.access.redhat.com/ubi10/toolbox:latest
  2. Toolbx コンテナーに入ります。

    [user@toolbox ~]$ toolbox enter <mytoolbox>

検証

  • <mytoolbox> コンテナー内でコマンドを実行し、コンテナーの名前とイメージを表示します。

    ⬢ [user@toolbox ~]$ cat /run/.containerenv
    engine="podman-4.8.2"
    name="<mytoolbox>"
    id="5245b924c2cb..."
    image="registry.access.redhat.com/ubi10/toolbox:latest"
    imageid="fe0ae375f14919cbc0596142e3aff22a70973a36e5a165c75a86ea7ec5d8d65c"

21.2. 開発に Toolbx を使用する

エディター、コンパイラー、ソフトウェア開発キット (SDK) などの開発ツールをインストールするために、Toolbx コンテナーをルートレスユーザーとして使用できます。インストール後は、それらのツールをルートレスユーザーとして使用して進めることができます。

前提条件

  • Toolbx コンテナーを作成し、実行している。Toolbx コンテナーに入っている。Toolbx コンテナーをルート権限で作成する必要はありません。Toolbx コンテナーの起動 を参照してください。

手順

  • Emacs テキストエディター、GCC コンパイラー、GNU デバッガー (GDB) など、選択したツールをインストールします。

    ⬢[user@toolbox ~]$ sudo dnf install emacs gcc gdb

検証

  • ツールがインストールされていることを確認します。

    ⬢[user@toolbox ~]$  dnf repoquery --info --installed <package_name>

21.3. ホストシステムのトラブルシューティングに Toolbx を使用する

ルート権限を持つ Toolbx コンテナーを使用すると、systemctljournalctlnmap などのツールをホストシステムにインストールせずに使用して、ホストシステムのさまざまな問題の根本原因を見つけることができます。

前提条件

  • Toolbx コンテナーを作成し、実行している。Toolbx コンテナーに入っている。Toolbx コンテナーはルート権限で作成する必要があります。Toolbx コンテナーの起動 を参照してください。

手順

  1. journalctl コマンドを実行できるようにするには、systemd パッケージをインストールします。

    ⬢[root@toolbox ~]# dnf install systemd
  2. ホスト上で実行しているすべてのプロセスのログメッセージを表示します。

    ⬢[root@toolbox ~]# journalctl --boot -0
    Jan 02 09:06:48 user-thinkpadp1gen4i.brq.csb kernel: microcode: updated ear>
    Jan 02 09:06:48 user-thinkpadp1gen4i.brq.csb kernel: Linux version 6.6.8-10>
    Jan 02 09:06:48 user-thinkpadp1gen4i.brq.csb kernel: Command line: BOOT_IMA>
    Jan 02 09:06:48 user-thinkpadp1gen4i.brq.csb kernel: x86/split lock detecti>
    Jan 02 09:06:48 user-thinkpadp1gen4i.brq.csb kernel: BIOS-provided physical>
  3. カーネルのログメッセージを表示します。

    ⬢[root@toolbox ~]# journalctl --boot -0 --dmesg
    Jan 02 09:06:48 user-thinkpadp1gen4i.brq.csb kernel: microcode: updated ear>
    Jan 02 09:06:48 user-thinkpadp1gen4i.brq.csb kernel: Linux version 6.6.8-10>
    Jan 02 09:06:48 user-thinkpadp1gen4i.brq.csb kernel: Command line: BOOT_IMA>
    Jan 02 09:06:48 user-thinkpadp1gen4i.brq.csb kernel: x86/split lock detecti>
    Jan 02 09:06:48 user-thinkpadp1gen4i.brq.csb kernel: BIOS-provided physical>
    Jan 02 09:06:48 user-thinkpadp1gen4i.brq.csb kernel: BIOS-e820: [mem 0x0000>
  4. nmap ネットワークスキャンツールをインストールします。

    ⬢[root@toolbox ~]# dnf install nmap
  5. ネットワーク内の IP アドレスとポートをスキャンします。

    ⬢[root@toolbox ~]# nmap -sS scanme.nmap.org
    Starting Nmap 7.93 ( https://nmap.org ) at 2024-01-02 10:39 CET
    Stats: 0:01:01 elapsed; 0 hosts completed (0 up), 256 undergoing Ping Scan
    Ping Scan Timing: About 29.79% done; ETC: 10:43 (0:02:24 remaining)
    Nmap done: 256 IP addresses (0 hosts up) scanned in 206.45 seconds
    • -sS オプションは TCP SYN スキャンを実行します。Nmap のスキャンタイプのほとんどは、生のパケットを送受信するため、特権ユーザーのみが使用できます。UNIX システムではルートアクセスが必要です。

21.4. Toolbx コンテナーの停止

アクティブな Toolbx コンテナーを停止すると、システムリソースを解放し、開発セッションを終了できます。コンテナープロセスを終了することで、バックグラウンドタスクが確実に終了し、後続のワークロードのためにクリーンで効率的な環境を維持できます。

手順

  1. コンテナーを離れてホストに戻ります。

    ⬢ [user@toolbox ~]$ exit
  2. ツールボックスコンテナーを停止します。

    ⬢ [user@toolbox ~]$ podman stop <mytoolbox>
  3. オプション: toolbx コンテナーを削除します。

    ⬢ [user@toolbox ~]$ toolbox rm <mytoolbox>

    あるいは、podman rm コマンドを使用してコンテナーを削除することもできます。

第22章 特殊なコンテナーイメージの実行

runlabels と呼ばれる組み込みラベルを使用する定義済みコマンドでコンテナーを実行します。これらのラベルを使用すると、インストール、実行、アンインストールなどの特定のアクションを、イメージのメタデータから直接トリガーできます。

22.1. ホストへの特権の付与

ホストのリソースにアクセスできる特権付きコンテナーの機能について説明します。Toolbx などの特権付きコンテナーは、標準的な分離を回避してホストシステムとやり取りします。

  • 特権: 特権コンテナーは、コンテナーをホストから分離するセキュリティー機能を無効にします。特権コンテナーは、podman run --privileged <image_name> コマンドを使用して実行できます。たとえば、root ユーザーが所有するホストからマウントされたファイルおよびディレクトリーを削除できます。
  • プロセステーブル: podman run --privileged --pid=host <image_name> コマンドを使用して、コンテナーでホストの PID namespace を使用できます。特権コンテナー内で ps -e コマンドを使用して、ホストで実行しているすべてのプロセスをリスト表示できます。ホストから特権コンテナーで実行するコマンドにプロセス ID を渡すことができます (例: kill <PID>)。
  • ネットワークインターフェイス - デフォルトでは、コンテナーには外部のネットワークインターフェイスとループバックネットワークインターフェイスが 1 つずつだけあります。podman run --net=host <image_name> コマンドを使用して、コンテナー内からホストのネットワークインターフェイスに直接アクセスできます。
  • プロセス間のコミュニケーション - ホストの IPC 機能は、特権コンテナーからアクセスできます。ipcs などのコマンドを実行して、ホスト上のアクティブなメッセージキュー、共有メモリーセグメント、およびセマフォセットに関する情報を表示できます。

22.2. runlabel が組み込まれたコンテナーイメージ

runlabels を使用して、コンテナーイメージ内に保存されている定義済みのコマンドを入力できます。インストールや実行といった一般的なラベルは、複雑なコンテナーのデプロイメントや管理を単純化します。

既存の runlabel には次のものが含まれます。

  • install: イメージを実行する前にホストシステムをセットアップします。通常、これにより、後で実行するときにコンテナーがアクセスできるホストにファイルとディレクトリーが作成されます。
  • run - コンテナーの実行時に使用する Podman コマンドラインオプションを特定します。通常、オプションはホストで権限を開き、コンテナーがホストで永続的に維持する必要があるホストのコンテンツをマウントします。
  • uninstall - コンテナーの実行を終了した後にホストシステムをクリーンアップします。

22.3. runlabel を使用した support-tools の実行

組み込みの runlabel を使用して、support-tools コンテナーをデプロイします。この方法は、定義済みコマンドをイメージに直接使用することで、インストール、実行、削除を単純化します。

rhel10/support-tools コンテナーイメージは、support-toolsd デーモンのコンテナー化されたバージョンを実行するために作成されます。support-tools イメージには、installrununinstall という runlabel が含まれています。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. support-tools イメージをプルします。

    # podman pull registry.redhat.io/rhel10/support-tools
  2. support-toolsinstall runlabel を表示します。

    # podman container runlabel install --display rhel10/support-tools
    command: podman run --rm --privileged -v /:/host -e HOST=/host -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools registry.redhat.io/rhel10/support-tools:latest /bin/install.sh

    これは、このコマンドがホストに特権を付与し、コンテナー内の /host にホストの root ファイルシステムをマウントして、install.sh スクリプトを実行することを示しています。

  3. support-toolsinstall runlabel を実行します。

    # podman container runlabel install rhel10/support-tools
    command: podman run --rm --privileged -v /:/host -e HOST=/host -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools registry.redhat.io/rhel10/support-tools:latest /bin/install.sh
    Creating directory at /host//etc/pki/support-tools
    Creating directory at /host//etc/support-tools.d
    Installing file at /host//etc/support-tools.conf
    Installing file at /host//etc/sysconfig/support-tools
    Installing file at /host//etc/logrotate.d/syslog

    これにより、support-tools イメージが後で使用するファイルがホストシステム上に作成されます。

  4. support-toolsrun runlabel を表示します。

    # podman container runlabel run --display rhel10/support-tools
    command: podman run -d --privileged --name support-tools --net=host --pid=host -v /etc/pki/support-tools:/etc/pki/support-tools -v /etc/support-tools.conf:/etc/support-tools.conf -v /etc/sysconfig/support-tools:/etc/sysconfig/support-tools -v /etc/support-tools.d:/etc/support-tools.d -v /var/log:/var/log -v /var/lib/support-tools:/var/lib/support-tools -v /run:/run -v /etc/machine-id:/etc/machine-id -v /etc/localtime:/etc/localtime -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools --restart=always registry.redhat.io/rhel10/support-tools:latest /bin/support-tools.sh

    このコマンドは、ホストに特権を提供し、support-toolsd デーモンを実行するために support-tools コンテナーを起動する際に、ホストから特定のファイルとディレクトリーをコンテナー内にマウントします。

  5. support-toolsrun runlabel を実行します。

    # podman container runlabel run rhel10/support-tools
    command: podman run -d --privileged --name support-tools --net=host --pid=host -v /etc/pki/support-tools:/etc/pki/support-tools -v /etc/support-tools.conf:/etc/support-tools.conf -v /etc/sysconfig/support-tools:/etc/sysconfig/support-tools -v /etc/support-tools.d:/etc/support-tools.d -v /var/log:/var/log -v /var/lib/support-tools:/var/lib/support-tools -v /run:/run -v /etc/machine-id:/etc/machine-id -v /etc/localtime:/etc/localtime -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools --restart=always registry.redhat.io/rhel10/support-tools:latest /bin/support-tools.sh
    28a0d719ff179adcea81eb63cc90fcd09f1755d5edb121399068a4ea59bd0f53

    support-tools コンテナーは権限を開き、ホストから必要なものをマウントし、support-toolsd デーモンをバックグラウンドで実行します (-d)。support-toolsd デーモンはログメッセージの収集を開始し、メッセージを /var/log ディレクトリー内のファイルに送信します。

  6. support-toolsuninstall runlabel を表示します。

    # podman container runlabel uninstall --display rhel10/support-tools
    command: podman run --rm --privileged -v /:/host -e HOST=/host -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools registry.redhat.io/rhel10/support-tools:latest /bin/uninstall.sh
  7. support-toolsuninstall runlabel を実行します。

    # podman container runlabel uninstall rhel10/support-tools
    command: podman run --rm --privileged -v /:/host -e HOST=/host -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools registry.redhat.io/rhel10/support-tools:latest /bin/uninstall.sh
    注記

    この場合、uninstall.sh スクリプトは、/etc/logrotate.d/syslog ファイルを削除します。設定ファイルはクリーンアップされません。

第23章 container-tools API の使用

REST ベースの API を使用することで、Podman とプログラムでやり取りできます。この API は Libpod と Docker 互換のエンドポイントの両方をサポートしており、外部ツールやクライアントとの統合を可能にします。

Podman 2.0 の新しい REST ベースの API は、従来の varlink リモート API を置き換えるもので、ルートフルおよびルートレスの両方をサポートします。これには、Podman 用の Libpod API と、cURL、Postman、Google の Advanced REST client などのプラットフォームから Podman を呼び出すための Docker 互換 API が含まれています。

注記

Podman サービスはソケットのアクティベーションに依存しているため、接続がアクティブでないと実行できません。この機能を有効にするには、podman.socket サービスを手動で起動する必要があります。接続が確立されると、Podman サービスが起動して要求された API アクションを実行し、その後終了して休止状態に戻ります。

23.1. root モードで systemd を使用した Podman API の有効化

RHEL 上で Podman API を有効にするには、systemd ソケットユニットを root モードで起動して有効にします。この設定により、システム全体のコンテナー管理が容易になり、Podman が既存のインフラストラクチャーとシームレスに統合され、さらに外部管理ツール向けの安定したエンドポイントも提供されます。

前提条件

  • podman-remote パッケージがインストールされている。

手順

  1. サービスをすぐに起動します。

    # systemctl enable --now podman.socket
  2. docker-podman パッケージを使用して var/lib/docker.sock へのリンクを有効にするには以下を実行します。

    # dnf install podman-docker

検証

  1. Podman のシステム情報を表示します。

    # podman-remote info
  2. リンクを確認します。

    # ls -al /var/run/docker.sock
    lrwxrwxrwx. 1 root root 23 Nov  4 10:19 /var/run/docker.sock -> /run/podman/podman.sock

23.2. ルートレスモードで systemd を使用した Podman API の有効化

systemd を使用して、Podman API ソケットと Podman API サービスをアクティブ化できます。

前提条件

  • podman-remote パッケージがインストールされている。

手順

  1. サービスをすぐに有効にして起動します。

    $ systemctl --user enable --now podman.socket
  2. オプション: Docker を使用してプログラムがルートレス Podman ソケットと対話できるようにするには、以下を実行します。

    $ export DOCKER_HOST=unix:///run/user/<uid>/podman//podman.sock

検証

  1. ソケットのステータスを確認します。

    $ systemctl --user status podman.socket
    ● podman.socket - Podman API Socket
     Loaded: loaded (/usr/lib/systemd/user/podman.socket; enabled; vendor preset: enabled)
    Active: active (listening) since Mon 2021-08-23 10:37:25 CEST; 9min ago
    Docs: man:podman-system-service(1)
    Listen: /run/user/1000/podman/podman.sock (Stream)
    CGroup: /user.slice/user-1000.slice/user@1000.service/podman.socket

    podman.socket はアクティブで、/run/user/<uid>/podman.podman.sock をリッスンしています。<uid> はユーザーの ID です。

  2. Podman のシステム情報を表示します。

    $ podman-remote info

23.3. Podman API の手動実行

Podman API を実行できます。手動での実行は、特に Docker の互換性レイヤーを使用する場合など、API 呼び出しのデバッグに便利です。

前提条件

  • podman-remote パッケージがインストールされている。

手順

  1. REST API のサービスを実行します。

    # podman system service -t 0 --log-level=debug
    • 値が 0 の場合はタイムアウトなしを意味します。ルートフルサービスのデフォルトのエンドポイントは unix:/run/podman/podman.sock です。
    • --log-level <level> オプションは、ロギングレベルを設定します。標準のロギングレベルは debuginfowarnerrorfatal、および panic です。
  2. 別のコマンドラインウィンドウに、Podman のシステム情報を表示します。podman-remote コマンドは、通常の podman コマンドとは異なり、Podman ソケットを介して通信します。

    # podman-remote info
  3. Podman API をトラブルシューティングし、要求および応答を表示するには、curl コマンドを使用します。JSON 形式で Linux サーバーの Podman インストールの情報を取得するには、以下を実行します。

    # curl -s --unix-socket /run/podman/podman.sock http://d/v1.0.0/libpod/info | jq
        {
      "host": {
        "arch": "amd64",
        "buildahVersion": "1.15.0",
        "cgroupVersion": "v2",
        "conmon": {
          "package": "conmon-2.0.18-1.module+el8.3.0+7084+c16098dd.x86_64",
          "path": "/usr/bin/conmon",
          "version": "conmon version 2.0.18, commit: 7fd3f71a218f8d3a7202e464252aeb1e942d17eb"
        },
        …
      "version": {
        "APIVersion": 1,
        "Version": "2.0.0",
        "GoVersion": "go1.14.2",
        "GitCommit": "",
        "BuiltTime": "Thu Jan  1 01:00:00 1970",
        "Built": 0,
        "OsArch": "linux/amd64"
      }
    }

    jq ユーティリティーは、コマンドライン JSON プロセッサーです。

  4. registry.access.redhat.com/ubi10/ubi コンテナーイメージをプルします。

    # curl -XPOST --unix-socket /run/podman/podman.sock -v 'http://d/v1.0.0/images/create?fromImage=registry.access.redhat.com%2Fubi10%2Fubi'
    *   Trying /run/podman/podman.sock...
    * Connected to d (/run/podman/podman.sock) port 80 (#0)
    > POST /v1.0.0/images/create?fromImage=registry.access.redhat.com%2Fubi10%2Fubi HTTP/1.1
    > Host: d
    > User-Agent: curl/7.61.1
    > Accept: /
    >
    < HTTP/1.1 200 OK
    < Content-Type: application/json
    < Date: Tue, 20 Oct 2020 13:58:37 GMT
    < Content-Length: 231
    <
    {"status":"pulling image () from registry.access.redhat.com/ubi10/ubi:latest, registry.redhat.io/ubi10/ubi:latest","error":"","progress":"","progressDetail":{},"id":"ecbc6f53bba0d1923ca9e92b3f747da8353a070fccbae93625bd8b47dbee772e"}
    * Connection #0 to host d left intact
  5. プルしたイメージを表示します。

    # curl --unix-socket /run/podman/podman.sock -v 'http://d/v1.0.0/libpod/images/json' | jq
    *   Trying /run/podman/podman.sock...
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to d (/run/podman/podman.sock) port 80 (0) > GET /v1.0.0/libpod/images/json HTTP/1.1 > Host: d > User-Agent: curl/7.61.1 > Accept: / > < HTTP/1.1 200 OK < Content-Type: application/json < Date: Tue, 20 Oct 2020 13:59:55 GMT < Transfer-Encoding: chunked < { [12498 bytes data] 100 12485 0 12485 0 0 2032k 0 --:--:-- --:--:-- --:--:-- 2438k * Connection #0 to host d left intact [ { "Id": "ecbc6f53bba0d1923ca9e92b3f747da8353a070fccbae93625bd8b47dbee772e", "RepoTags": [ "registry.access.redhat.com/ubi10/ubi:latest", "registry.redhat.io/ubi10/ubi:latest" ], "Created": "2020-09-01T19:44:12.470032Z", "Size": 210838671, "Labels": { "architecture": "x86_64", "build-date": "2020-09-01T19:43:46.041620", "com.redhat.build-host": "cpt-1008.osbs.prod.upshift.rdu2.redhat.com", ... "maintainer": "Red Hat, Inc.", "name": "ubi10", ... "summary": "Provides the latest release of Red Hat Universal Base Image 8.", "url": "https://access.redhat.com/containers//registry.access.redhat.com/ubi10/images/8.2-347",
          ...
        },
        "Names": [
          "registry.access.redhat.com/ubi10/ubi:latest",
          "registry.redhat.io/ubi10/ubi:latest"
        ],
        ...
        ]
      }
    ]
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

Red Hat ドキュメントについて

Legal Notice

Theme

© 2026 Red Hat
トップに戻る