コンテナーの構築、実行、および管理
Red Hat Enterprise Linux で Podman、Buildah、Skopeo を使用する
概要
Red Hat ドキュメントへのフィードバック (英語のみ) リンクのコピーリンクがクリップボードにコピーされました!
Red Hat は質の高いドキュメントを提供することに尽力しており、皆様からのフィードバックを大切にしています。改善にご協力いただくため、Red Hat Jira トラッキングシステムを通じてご提案やエラー報告をお寄せください。
手順
Jira の Web サイトにログインします。
アカウントがない場合、アカウント作成オプションを選択します。
- 上部のナビゲーションバーで Create をクリックします。
- Summary フィールドにわかりやすいタイトルを入力します。
- Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
- ウィンドウ下部の 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 およびコンテナーイメージの直接管理 (
run、stop、start、ps、attach、execなど) - 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 およびコンテナーイメージの直接管理 (
run、stop、start、ps、attach、execなど) - 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-pyとdocker-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 サブスクリプションを使用します。
手順
- RHEL をインストールします。
RHEL の登録: ユーザー名とパスワードを入力します。ユーザー名とパスワードは、Red Hat カスタマーポータルのログイン認証情報と同じです。
# subscription-manager register Registering to: subscription.rhsm.redhat.com:443/subscription Username: <username> Password: <password>container-toolsメタパッケージをインストールします。# dnf install container-tools必要に応じて、
podman、buildah、skopeoを個別にインストールすることもできます。オプション:
podman-dockerパッケージをインストールします。# dnf install podman-dockerpodman-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に登録した。
手順
コマンドラインを開き、RHEL 拡張機能リポジトリーを有効にします。
# subscription-manager repos --enable rhel-10-for-$(arch)-extensions-rpms- プロンプトが表示されたらパスワードを入力します。
Podman Desktop をインストールします。
# dnf install podman-desktop-
インストールされたサイズを確認するには、
yと入力します。 -
GPG キーをインポートしてインストールを完了するには、
yと入力します。
検証
- ホーム画面の上部にある検索ボックスに Podman Desktop と入力し、Podman Desktop アプリケーションをクリックして開きます。
- 指示に従って、アプリケーションの簡単なオンボーディングプロセスを完了します。
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コマンドの標準セット (dnf、dnf-config-manager、dnfdownloaderなど) を使用できます。 -
utilities: ユーティリティーには
tar、dmidecode、gzip、getfaclなどの各種 ACL コマンド、dmsetupなどの各種デバイスマッパーコマンドのほか、ここに記載されていないその他のユーティリティーが含まれます。
2.4. UBI init イメージの概要 リンクのコピーリンクがクリップボードにコピーされました!
UBI init イメージ (名称 ubi-init) には、systemd 初期化システムが含まれているため、Web サーバーやファイルサーバーなどの systemd サービスを実行するイメージを構築するのに役立ちます。init イメージには、最小イメージよりも多く、標準イメージよりも少ないコンテンツが含まれます。
ubi10-init イメージは ubi10 イメージの上にビルドされるため、その内容はほぼ同じです。ただし、重要な相違点がいくつかあります。
ubi10-init:-
CMD は
/sbin/initに設定され、デフォルトでsystemdInit サービスを開始します。 -
psおよびプロセス関連のコマンド (procps-ngパッケージ) が含まれます。 -
また、
SIGRTMIN+3をStopSignalとして設定しています。これは、ubi10-initのsystemdが通常の終了信号 (SIGTERMおよびSIGKILL) を無視しているためですが、SIGRTMIN+3を受け取った場合は終了します。
-
CMD は
ubi10:-
CMD は
/bin/bashに設定されます。 -
psおよびプロセス関連のコマンド (procps-ngパッケージ) は含まれません。 -
通常の終了シグナルを無視しません (
SIGTERMおよびSIGKILL)。
-
CMD は
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 enable、microdnf module disable、microdnf 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> のイメージを区別します。以下に例を示します。
| namespace | (<namespace>/<name>) の例 |
|---|---|
| organization |
|
| login (ユーザー名) |
|
| role |
|
レジストリー、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メタパッケージがインストールされている。 - レジストリーが設定されている。
手順
レジストリーに対して認証します。
# podman login quay.ioイメージを検索します。
特定のレジストリーで特定のイメージを検索するには、以下を入力します。
# 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 ファイルに適用できます。
transport、registry、および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メタパッケージがインストールされている。
手順
registry.redhat.ioレジストリーにログインします。$ podman login registry.redhat.io Username: <username> Password: <password> Login Succeeded!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メタパッケージがインストールされている。
手順
/var/lib/images/nginxディレクトリーを作成します。$ mkdir -p /var/lib/images/nginxdocker://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メタパッケージがインストールされている。 - プルしたイメージがローカルシステムで利用できる。
手順
すべてのイメージをリスト表示します。
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/ubi10/ubi latest 3269c37eae33 7 weeks ago 208 MB以下のいずれかのオプションを使用して、
myubi名をregistry.redhat.io/ubi10/ubiイメージに割り当てます。イメージ名:
$ podman tag registry.redhat.io/ubi10/ubi myubiイメージ ID:
$ podman tag 3269c37eae33 myubiどちらのコマンドも、同じ結果になります。
すべてのイメージをリスト表示します。
$ 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 に割り当てられていることを確認できます。以下のいずれかを使用して、
10タグをregistry.redhat.io/ubi10/ubiイメージに追加します。イメージ名:
$ podman tag registry.redhat.io/ubi10/ubi myubi:10イメージ ID:
$ podman tag 3269c37eae33 myubi:10どちらのコマンドも、同じ結果になります。
検証
すべてのイメージをリスト表示します。
$ 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 に割り当てられていることを確認できます。registry.redhat.io/ubi10/ubiイメージにタグ付けした後に、コンテナーを実行するオプションが 3 つあります。-
ID (
3269c37eae33) -
名前 (
localhost/myubi:latest) 名前 (
localhost/myubi:10)詳細は、システム上の
podman-tag(1)man ページを参照してください。
-
ID (
4.9. マルチアーキテクチャーイメージのビルド リンクのコピーリンクがクリップボードにコピーされました!
RHEL 上で Podman を使用してマルチアーキテクチャーコンテナーイメージをビルドすることで、多様なハードウェアプラットフォーム間でアプリケーションの動作の整合性を保つことができます。環境ごとに個別のビルドを必要とせずに、単一のイメージマニフェストで複数のアーキテクチャーをサポートできます。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
-
サポートする必要がある各アーキテクチャーの
Containerfilesを作成します。 各アーキテクチャー用のイメージをビルドします。以下に例を示します。
$ podman build --platform linux/arm64,linux/amd64 --manifest <registry>/<image> .-
--platform linux/arm64,linux/amd64オプションは、コンテナーイメージのビルド対象のターゲットプラットフォームを指定します。 -
--manifest <registry>/<image>オプションは、指定の名前 (<registry>/<image>) を含むマニフェストリストを作成し、新しくビルドされたイメージをそのリストに追加します。マニフェストリストは、それぞれ異なるアーキテクチャーをターゲットとするイメージマニフェストのコレクションです。
-
マニフェストリストをレジストリーにプッシュします。
$ 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メタパッケージがインストールされている。 - プルしたイメージがローカルシステムで利用できる。
手順
registry.redhat.io/rhel10/support-toolsイメージを tarball として保存します。デフォルトの
docker-archive形式の場合:$ podman save -o mysupport-tools.tar registry.redhat.io/rhel10/support-tools:latestoci-archive形式で、--formatオプションを使用します。$ podman save -o mysupport-tools-oci.tar --format=oci-archive registry.redhat.io/rhel10/support-toolsmysupport-tools.tarおよびmysupport-tools-oci.tarアーカイブはカレントディレクトリーに保存されます。次の手順は、mysupport-tools.tartarball を使用して実行されます。
mysupport-tools.tarのファイルタイプを確認します。$ file mysupport-tools.tar mysupport-tools.tar: POSIX tar archivemysupport-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メタパッケージがインストールされている。 - プルしたイメージがローカルシステムで利用できる。
手順
必要に応じて、
ubiイメージに別の名前を追加します。# podman tag registry.redhat.io/ubi10/ubi registry.example.com:5000/ubi10/ubiregistry.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メタパッケージがインストールされている。
手順
ローカルシステムにある全イメージのリストを表示します。
$ 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すべてのコンテナーをリスト表示します。
$ 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-toolsregistry.redhat.io/rhel10/support-toolsイメージを削除するには、podman stopコマンドを使用して、このイメージから実行されているすべてのコンテナーを停止する必要があります。コンテナーを ID または名前を使用して停止できます。my-support-toolsコンテナーを停止します。$ podman stop my-support-tools 7ccd6001166e9720c47fbeb077e0afd0bb635e74a1b0ede3fd34d09eaf5a52e9registry.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メタパッケージがインストールされている。
手順
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" ...オプション: すべてのコンテナーをリスト表示します。
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES--rmオプションがあるのでコンテナーは表示されません。コンテナーが削除されました。
5.3. コンテナー内でのコマンドの実行 リンクのコピーリンクがクリップボードにコピーされました!
podman run -it を使用して、コンテナー内で対話型セッションを開始します。このコマンドを使用すると、コンテナーのシェル内でコマンドを入力したり、トラブルシューティングしたりできます。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
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オプションを指定しないと、シェルが開き、終了します。
-
システムユーティリティーのセットが含まれる
procps-ngパッケージをインストールします (例:ps、top、uptimeなど)。[root@6ccffd0f6421 /]# dnf install procps-ngps -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 -efexitを実行してコンテナーを終了し、ホストに戻ります。# exit必要に応じて、すべてのコンテナーをリスト表示します。
$ 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 内でイメージに関する指示を定義し、ソフトウェアのインストールと設定を自動化します。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
コンテナーツールのインストール: ご使用の RHEL システムに必要なコンテナーツールがインストールされていることを確認します。container-tools モジュールは、Buildah、Podman、Skopeo を提供します。
$ sudo dnf install container-toolsContainerfile の作成: 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"]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 がカレントディレクトリーにあることを示します。
-
コンテナーの実行: イメージをビルドした後、
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 内のRUNやCOPYなどの命令内に複数行の文字列を直接埋め込むことができます。これは 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メタパッケージがインストールされている。
手順
registry.redhat.io/rhel10/support-toolsイメージをベースとするコンテナーを実行します。$ podman run -dt registry.redhat.io/rhel10/support-toolsすべてのコンテナーをリスト表示します。
実行中のコンテナーのリストを表示するには、以下のコマンドを実行します。
$ 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 つ以上のコンテナーが停止されている。
手順
myubiコンテナーを起動します。非対話モードで以下を行います。
$ podman start myubiインタラクティブモードで
-a(--attach) および-i(--interactive) オプションを使用して、コンテナーの bash シェルと連携します。$ podman start -a -i myubi
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タイムスタンプ (StartedAtはStateの配下にある) を確認するには、--formatオプションとコンテナー ID または名前を使用します。検証する他の項目の例には、以下が含まれます。
-
.Path: コンテナーとともに実行するコマンドを表示します。 -
.Args: コマンドに指定する引数 -
.Config.ExposedPorts: コンテナーから公開する TCP または UDP ポート -
.State.Pid: コンテナーのプロセス ID を表示します。 .HostConfig.PortBindings: コンテナーからホストへのポートマッピング詳細は、システム上の
podman-inspect(1)man ページを参照してください。
5.8. localhost のディレクトリーのコンテナーへのマウント リンクのコピーリンクがクリップボードにコピーされました!
コンテナーでホストの /dev/log デバイスをマウントして、コンテナー内のログメッセージをホストシステムに公開できます。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
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"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メタパッケージがインストールされている。
手順
mysyslogという名前のコンテナーを実行します。# podman run -dt --name=mysyslog registry.redhat.io/rhel10/support-toolspodman mountコマンドを実行して、ホストからアクセス可能な場所に、作業コンテナーの root ファイルシステムをマウントします。たとえば、mysyslogコンテナーをマウントします。# podman mount mysyslog /var/lib/containers/storage/overlay/990b5c6ddcdeed4bde7b245885ce4544c553d108310e2b797d7be46750894719/mergedlsコマンドを使用して、マウントポイントのコンテンツを表示します。# 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 varOS バージョンを表示します。
# 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メタパッケージがインストールされている。
手順
コンテナーのネットワークインターフェイスを IP アドレス 10.88.0.44 に設定します。
# podman run -d --ip=10.88.0.44 registry.redhat.io/rhel10/support-tools efde5f0a8c723f70dd5cb5dc3d5039df3b962fae65575b08662e0d5b5f9fbe85IP アドレスが正しく設定されていることを確認します。
# 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メタパッケージがインストールされている。 - コンテナーが実行されている。
手順
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 ...my-support-toolsコンテナーで/bin/bashコマンドを入力します。$ podman exec -it my-support-tools /bin/bashシステムユーティリティーのセットが含まれる
procps-ngパッケージをインストールします (例:ps、top、uptimeなど)。# dnf install procps-ngコンテナーを検査します。
システムにある全プロセスをリスト表示するには、以下のコマンドを実行します。
# 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_64MB 単位でメモリーの空き容量を表示するには、次のコマンドを実行します。
# 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メタパッケージがインストールされている。
手順
ボリュームを作成します。
$ podman volume create hostvolumeボリュームに関する情報を表示します。
$ 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に変わります。mntPoint変数に保管されたパスを使用して、ディレクトリー内にテキストファイルを作成します。$ echo "Hello from host" >> $mntPoint/host.txtmntPoint変数で定義されたディレクトリー内の全ファイルをリスト表示します。$ ls $mntPoint/ host.txtmyubi1という名前のコンテナーを実行し、ホストのボリューム名hostvolumeで定義したディレクトリーをコンテナーの/containervolume1ディレクトリーにマッピングします。$ podman run -it --name myubi1 -v hostvolume:/containervolume1 registry.access.redhat.com/ubi10/ubi /bin/bashmntPoint変数 (-v $mntPoint:/containervolume1) で定義したボリュームパスを使用する場合には、podman volume pruneコマンドを実行すると未使用のボリュームが削除され、データが失われる場合がある点に注意してください。常に-v hostvolume_name:/containervolume_nameを使用します。コンテナー上にある共有ボリューム内のファイルをリスト表示します。
# ls /containervolume1 host.txtホスト上で作成した
host.txtファイルが表示されます。/containervolume1ディレクトリーにテキストファイルを作成します。# echo "Hello from container 1" >> /containervolume1/container1.txt-
CTRL+pおよびCTRL+qを使用してコンテナーからデタッチします。 ホスト上にある共有ボリューム内のファイルをリスト表示します。以下の 2 つのファイルが表示されるはずです。
$ ls $mntPoint container1.rxt host.txtこの時点で、コンテナーとホスト間でファイルを共有しています。2 つのコンテナー間でファイルを共有するには、
myubi2という名前の別のコンテナーを実行します。myubi2という名前のコンテナーを実行し、ホストのボリューム名hostvolumeで定義したディレクトリーをコンテナーの/containervolume2ディレクトリーにマッピングします。$ podman run -it --name myubi2 -v hostvolume:/containervolume2 registry.access.redhat.com/ubi10/ubi /bin/bashコンテナー上にある共有ボリューム内のファイルをリスト表示します。
# ls /containervolume2 container1.txt host.txtホストで作成した
host.txtファイルと、myubi1コンテナー内に作成したcontainer1.txtファイルが表示されます。/containervolume2ディレクトリーにテキストファイルを作成します。# echo "Hello from container 2" >> /containervolume2/container2.txt-
CTRL+pおよびCTRL+qを使用してコンテナーからデタッチします。 ホスト上にある共有ボリューム内のファイルをリスト表示します。以下の 3 つのファイルが表示されるはずです。
$ ls $mntPoint container1.rxt container2.txt host.txt詳細は、システム上の
podman-volume(1)man ページを参照してください。
5.13. コンテナーのエクスポートおよびインポート リンクのコピーリンクがクリップボードにコピーされました!
異なるホスト環境間でファイルシステムを簡単に転送するには、Red Hat Enterprise Linux コンテナーをエクスポートおよびインポートします。コンテナーをアーカイブ (tar ファイル) にパッケージ化することで、重要なデータのバックアップ、チームとの設定情報の共有、および分離されたワークロードのシームレスな移行が可能になります。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
registry.access.redhat.com/ubi10/ubiイメージをベースとするmyubiコンテナーを実行します。$ podman run -dt --name=myubi registry.access.redhat.com/10/ubi必要に応じて、すべてのコンテナーをリスト表示します。
$ 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 myubimyubiコンテナーに割り当てます。$ podman attach myubitestfileという名前のファイルを作成します。[root@a6a6d4896142 /]# echo "hello" > testfile-
CTRL+pおよびCTRL+qを使用してコンテナーからデタッチします。 ローカルマシンで、
myubiのファイルシステムをmyubi-container.tarとしてエクスポートします。$ podman export -o myubi.tar a6a6d4896142必要に応じて、現在のディレクトリーの内容をリスト表示します。
$ ls -l -rw-r--r--. 1 user user 210885120 Apr 6 10:50 myubi-container.tar ...必要に応じて、
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 filemyubi-container.tarにコンテナーのファイルシステムが含まれていることを確認できます。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すべてのイメージをリスト表示します。
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/myubi-imported latest c296689a17da 51 seconds ago 211 MBtestfileファイルの内容を表示します。$ podman run -it --name=myubi-imported myubi-imported cat testfile hellopodman 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 つ以上のコンテナーが停止されている。
手順
(実行中または停止中の) すべてのコンテナーを一覧表示するには、以下を実行します。
$ 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コンテナーを削除します。
peaceful_hopperを削除するには以下を実行します。$ podman rm peaceful_hopperpeaceful_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- スクリプトは、ユーザーが指定されたグループに属しているかどうかを確認します。
-
USERとGROUPは、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メタパッケージがインストールされている。
手順
新しいディレクトリーに以下の内容を含む
Containerfileを作成します。FROM registry.access.redhat.com/ubi10/ubi-init RUN dnf -y install httpd; dnf clean all; systemctl enable httpd; RUN echo "Successful Web Server Test" > /var/www/html/index.html RUN mkdir /etc/systemd/system/httpd.service.d/; echo -e '[Service]\nRestart=always' > /etc/systemd/system/httpd.service.d/httpd.conf EXPOSE 80 CMD [ "/sbin/init" ]Containerfileは、httpdパッケージをインストールし、ブート時にhttpdサービスが開始できるようにし、テストファイル (index.html) を作成し、Web サーバーをホスト (ポート 80) に公開し、コンテナーの起動時、systemdinit サービス (/sbin/init) を開始します。コンテナーをビルドします。
# podman build --format=docker -t mysysd .オプション: お使いのシステムで
systemdを使用してコンテナーを実行し、SELinux を有効にする場合は、container_manage_cgroupブール値変数を設定する必要があります。# setsebool -P container_manage_cgroup 1mysysd_runという名前のコンテナーを実行します。# podman run -d --name=mysysd_run -p 80:80 mysysdmysysdイメージがmysysd_runコンテナーをデーモンプロセスとして実行し、コンテナーのポート 80 がホストシステムのポート 80 に公開されます。注記ルートレスモードでは、1024 以上のホストのポート番号を選択する必要があります。以下に例を示します。
$ podman run -d --name=mysysd -p 8081:80 mysysd1024 未満のポート番号を使用するには、
net.ipv4.ip_unprivileged_port_start変数を変更する必要があります。# sysctl net.ipv4.ip_unprivileged_port_start=80コンテナーが実行されていることを確認します。
# podman ps a282b0c2ad3d localhost/mysysd:latest /sbin/init 15 seconds ago Up 14 seconds ago 0.0.0.0:80->80/tcp mysysd_runWeb サーバーをテストします。
# curl localhost/index.html Successful Web Server Test
7.2. UBI マイクロイメージの使用 リンクのコピーリンクがクリップボードにコピーされました!
UBI マイクロイメージと Buildah を使用して、超軽量コンテナーを構築します。イメージにはパッケージマネージャーが含まれていないため、このプロセスではイメージをマウントし、ホストからイメージにソフトウェアをインストールする必要があります。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
registry.access.redhat.com/ubi10/ubi-microイメージをプルしてビルドします。# microcontainer=$(buildah from registry.access.redhat.com/ubi10/ubi-micro)作業中のコンテナーの root ファイルシステムをマウントします。
# micromount=$(buildah mount $microcontainer)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作業コンテナーで root ファイルシステムをアンマウントします。
# buildah umount $microcontainer作業コンテナーから
ubi-micro-httpdイメージを作成します。# buildah commit $microcontainer ubi-micro-httpd
検証
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メタパッケージがインストールされている。
手順
registry.access.redhat.com/ubi10/ubiイメージをプルして実行します。$ podman run -it --name myubi registry.access.redhat.com/ubi10/ubimyubiコンテナーにパッケージを追加します。UBI リポジトリーにあるパッケージを追加するには、UBI リポジトリー以外の dnf リポジトリーをすべて無効にします。たとえば、
bzip2パッケージを追加するには、次のコマンドを実行します。# dnf install --disablerepo==* --enablerepo=ubi-10-for-x86_64-appstream-rpms --enablerepo=ubi-10-for-x86_64-baseos-rpms bzip2UBI リポジトリーにないパッケージを追加するには、リポジトリーを無効にしないでください。たとえば、
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
検証
コンテナー内で有効なリポジトリーのリストを表示します。
# dnf repolist- 必要なリポジトリーがリスト表示されていることを確認します。
インストール済みパッケージのリストを表示します。
# rpm -qa- 必要なパッケージがリスト表示されていることを確認します。
Red Hat UBI リポジトリーに含まれていない Red Hat パッケージをインストールすると、サブスクライブしている RHEL システム以外でコンテナーを配布する機能が限定される可能性があります。
7.5. UBI minimal コンテナーへのソフトウェアの追加 リンクのコピーリンクがクリップボードにコピーされました!
microdnf コマンドを使用して、UBI minimal コンテナーにソフトウェアをインストールします。このコマンドは、コンテナーサイズを小さく保ちながら、基本的なパッケージ管理機能を提供します。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
registry.access.redhat.com/ubi10/ubi-minimalイメージをプルして実行します。$ podman run -it --name myubimin registry.access.redhat.com/ubi10/ubi-minimalmyubiminコンテナーにパッケージを追加します。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 依存関係には、厳密には必要ではないが、デフォルトでインストールされることが多い推奨パッケージや提案パッケージが含まれます。
検証
コンテナー内で有効なリポジトリーのリストを表示します。
# microdnf repolist- 必要なリポジトリーがリスト表示されていることを確認します。
インストール済みパッケージのリストを表示します。
# rpm -qa- 必要なパッケージがリスト表示されていることを確認します。
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
検証
有効なリポジトリーをリスト表示します。
UBI standard イメージまたは UBI init イメージをベースとするコンテナー内で、有効なリポジトリーをすべてリスト表示する場合は、以下を実行します。
# dnf repolistUBI minimal コンテナーをベースとするコンテナー内で、有効なリポジトリーをすべてリスト表示する場合は、以下を実行します。
# microdnf repolist
- 必要なリポジトリーがリスト表示されていることを確認します。
インストール済みパッケージのリストを表示します。
# rpm -qa- 必要なパッケージがリスト表示されていることを確認します。
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メタパッケージがインストールされている。
手順
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"]コンテナーイメージをビルドします。
# 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
検証
Web サーバーを実行します。
# podman run -d --name=myweb -p 80:80 johndoe/webserver bbe98c71d18720d966e4567949888dc4fb86eec7d304e785d5177168a5965f64Web サーバーをテストします。
# 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メタパッケージがインストールされている。
手順
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 signaturesskopeo 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 }すべてのコンテンツを展開します。
$ cd $HOME/TEST $ for f in $(ls); do tar xvf $f; done結果を確認します。
$ 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メタパッケージがインストールされている。
手順
sigstore の公開鍵または秘密鍵のペアを生成します。
$ skopeo generate-sigstore-key --output-prefix myKey.private次の内容を
/etc/containers/registries.d/default.yamlファイルに追加します。docker: <registry>: use-sigstore-attachments: trueuse-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 つのファイルにのみ存在できます。カレントディレクトリーの
Containerfileを使用して、コンテナーイメージをビルドします。$ podman build -t <registry>/<namespace>/<image>イメージに署名し、レジストリーにプッシュします。
$ 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 がインストールされている。
手順
次の内容を
/etc/containers/registries.conf.d/default.yamlファイルに追加します。docker: <registry>: use-sigstore-attachments: trueuse-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 ファイルが読み取られ、ファイル名は任意であることに注意してください。/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 ファイルです。イメージに署名し、レジストリーにプッシュします。
$ podman push --sign-by-sigstore=file.yml <registry>/<namespace>/<image>あるいは、同様の
--sign-by-sigstoreオプションを指定してskopeo copyコマンドを使用して、既存のイメージをコンテナーレジストリー間で移動しながら署名することもできます。警告パブリックサーバーへの送信には、公開鍵、証明書、および署名メタデータが含まれる点に注意してください。
詳細は、システム上の
containers-sigstore-signing-params.yaml、podman-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メタパッケージがインストールされている。
手順
sigstore の公開鍵または秘密鍵のペアを生成します。
$ skopeo generate-sigstore-key --output-prefix myKey.private公開鍵と秘密鍵
myKey.pubとmyKey.privateが生成されます。以下を
/etc/containers/registries.conf.d/default.yamlファイルに追加します。docker: <registry>: use-sigstore-attachments: trueuse-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 ファイルが読み取られ、ファイル名は任意であることに注意してください。カレントディレクトリーの
Containerfileを使用して、コンテナーイメージをビルドします。$ podman build -t <registry>/<namespace>/<image>/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 ファイルです。イメージに署名し、レジストリーにプッシュします。
$ 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
手順
GPG キーを生成します。
# gpg --full-gen-key公開鍵をエクスポートします。
# gpg --output <path>/key.gpg --armor --export <username@example.com>カレントディレクトリーの
Containerfileを使用して、コンテナーイメージをビルドします。$ podman build -t <registry>/<namespace>/<image><registry>、<namespace>、および<image>をコンテナーイメージ識別子に置き換えます。イメージに署名し、レジストリーにプッシュします。
$ podman push \ --sign-by <username@example.com> \ <registry>/<namespace>/<image>注記既存のイメージをコンテナーレジストリー間で移動するときに署名する必要がある場合は、
skopeo copyコマンドを使用できます。オプション: 新しいイメージ署名を表示します。
# (cd /var/lib/containers/sigstore/; find . -type f) ./<image>@sha256=<digest>/signature-1ローカル署名をルックアサイド 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-sequoia、sequoia-sq、およびsequoia-sqvパッケージがインストールされている。
手順
現在のディレクトリーで
Containerfileを使用してコンテナーイメージをビルドします。$ podman build -t <registry>/<namespace>/<image>キーを生成します。
# sq key generate --own-key --email <test@example.com> --name <namspace>証明書をエクスポートします。
# sq cert export --cert=<fingerprint_or_key_ID> --output mycerts/sequoia-key.pub-
policy.jsonファイルを有効なキーを指すように設定します。 キーを使用してイメージに署名してプッシュします。
$ 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メタパッケージがインストールされている。
手順
空の Pod を作成します。
$ podman pod create --name mypod 223df6b390b4ea87a090a4b5207f7b9b003187a6960bd37631ae9bc12c433aff The pod is in the initial state Created.Pod の初期状態は Created です。
必要に応じて、すべての Pod をリスト表示します。
$ podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 223df6b390b4 mypod Created Less than a second ago 1 3afdcd93de3ePod にはコンテナーが 1 つあることに注意してください。
必要に応じて、関連付けられている全 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 223df6b390b4podman psコマンドからの Pod ID とpodman pod psコマンドの Pod ID が一致することが確認できます。デフォルトの infra コンテナーはregistry.access.redhat.com/ubi10/pauseイメージをベースとしています。mypodという名前の既存 Pod 内で、名前がmyubiのコンテナーを実行します。$ podman run -dt --name myubi --pod mypod registry.access.redhat.com/ubi10/ubi /bin/bash 5df5c48fea87860cf75822ceab8370548b04c78be9fc156570949013863ccf71必要に応じて、すべての Pod をリスト表示します。
$ podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 223df6b390b4 mypod Running Less than a second ago 2 3afdcd93de3ePod にはコンテナーが 2 つあることが分かります。
必要に応じて、関連付けられている全 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/bash1 つ以上の 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 の作成 セクションを参照してください。
手順
Pod
mypodを停止します。$ podman pod stop mypod必要に応じて、関連付けられている全 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 mypodPod
mypodおよびコンテナーmyubiのステータスが "Exited" であることが分かります。
9.4. Pod の削除 リンクのコピーリンクがクリップボードにコピーされました!
停止した Pod は、podman pod rm コマンドを使用して削除します。これにより、システムから Pod 定義とそれに関連するすべてのコンテナーが削除されます。
前提条件
-
container-toolsメタパッケージがインストールされている。 - Pod が停止されている。詳細は、Pod の停止 を参照してください。
手順
以下を入力して、Pod
mypodを削除します。$ podman pod rm mypod 223df6b390b4ea87a090a4b5207f7b9b003187a6960bd37631ae9bc12c433affPod を削除すると、その 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
検証
mycontainerがmynetネットワークに接続されていることを確認します。# podman inspect --format='{{.NetworkSettings.Networks}}' mycontainer map[podman:0xc00042ab40 mynet:0xc00042ac60]mycontainerがmynetとpodmanのネットワークに接続されていることがわかります。
10.5. コンテナーのネットワークからの切断 リンクのコピーリンクがクリップボードにコピーされました!
podman network disconnect コマンドを使用して、コンテナーを特定のネットワークからデタッチします。これにより、コンテナー自体を停止することなく、コンテナーがそのネットワーク上で通信することを阻止できます。
前提条件
-
container-toolsメタパッケージがインストールされている。 -
podman network createコマンドを使用してネットワークが作成さている。 - コンテナーがネットワークに接続されている。
手順
mycontainerというコンテナーをmynetというネットワークから切り離します。# podman network disconnect mynet mycontainer
検証
mycontainerがmynetネットワークから切断されていることを確認します。# podman inspect --format='{{.NetworkSettings.Networks}}' mycontainer map[podman:0xc000537440]mycontainerがmynetネットワークから切断され、mycontainerがデフォルトのpodmanネットワークにのみ接続されていることがわかります。詳細は、システム上の
podman-network-disconnect(1)man ページを参照してください。
10.6. ネットワークの削除 リンクのコピーリンクがクリップボードにコピーされました!
podman network rm コマンドを使用して、使用されていないネットワークを削除します。いずれかのコンテナーによって使用されているネットワークは削除できないことに注意してください。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
すべてのネットワークをリストアップします。
# 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,dnsnamemynetネットワークを削除します。# 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:podmannetwork create コマンドで作成されたユーザー定義のネットワークを使用します。 -
private: コンテナーの新しいネットワークを作成します。 -
slirp4netns: ルートレスコンテナーのデフォルトオプションであるslirp4netnsを使用してユーザーネットワークスタックを作成します。 -
pasta:slirp4netnsの高性能な代替品。Podman v4.4.1 以降ではpastaを使用できます。 -
none: コンテナーのネットワークの namespace を作成しますが、ネットワークインターフェイスは設定しません。コンテナーにはネットワーク接続がありません。 ns:<path>: 参加するネットワーク namespace へのパス注記ホストモードでは、D-bus (コンテナーはプロセス間通信 (IPC) システム) などのローカルシステムサービスにフルアクセスできるため、セキュアでないと考えられています。
11.2. slirp4netns と pasta の違い リンクのコピーリンクがクリップボードにコピーされました!
pasta と slirp4netns のネットワークモードの主な違いについて説明します。
slirp4netns と比較した pasta ネットワークモードの顕著な違いは次のとおりです。
-
pastaは、IPv6 ポート転送をサポートしています。 -
pastaは、slirp4netnsよりも効率的です。 -
pastaは、ホストから IP アドレスをコピーしますが、slirp4netns は定義済みの IPv4 アドレスを使用します。 -
pastaは、ホストからのインターフェイス名を使用しますが、slirp4netns はインターフェイス名として tap0 を使用します。 -
pastaは、ホストからのゲートウェイアドレスを使用しますが、slirp4netnsは、独自のゲートウェイアドレスを定義して NAT を使用します。
ルートレスコンテナーのデフォルトのネットワークモードは pasta です。
11.3. ネットワークモードの設定 リンクのコピーリンクがクリップボードにコピーされました!
コンテナーの起動時に、podman run コマンドに --network オプションを指定して、コンテナーのネットワーク設定を指定します。ホストネットワークなどのモードを選択したり、カスタムブリッジにアタッチしたりできます。
前提条件
-
container-toolsモジュールがインストールされている。
手順
オプション:
pastaネットワークモードを使用する場合は、passtパッケージをインストールします。$ {PackageManager} install passtregistry.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メタパッケージがインストールされている。
手順
コンテナーの IP アドレスを表示します。
# podman inspect --format='{{.NetworkSettings.IPAddress}}' <containerName>コンテナーが接続されている全ネットワークを表示します。
# podman inspect --format='{{.NetworkSettings.Networks}}' <containerName>ポートマッピングを表示します。
# podman inspect --format='{{.NetworkSettings.Ports}}' <containerName>
11.5. コンテナーとアプリケーション間の通信 リンクのコピーリンクがクリップボードにコピーされました!
コンテナーとアプリケーションの間で通信を行うことができます。アプリケーションのポートは、リスニング状態かオープン状態のどちらかです。これらのポートは自動的にコンテナーネットワークに公開されるため、このようなネットワークを使用してコンテナーに到達できます。デフォルトでは、Web サーバーはポート 80 でリッスンします。この手順例では、myubi コンテナーは web-container アプリケーションと通信を行います。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
web-containerという名前のコンテナーを起動します。# podman run -dt --name=web-container docker.io/library/httpdすべてのコンテナーをリスト表示します。
# 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コンテナーを点検し、IP アドレスを表示します。
# podman inspect --format='{{.NetworkSettings.IPAddress}}' web-container 10.88.0.2myubiコンテナーを実行し、Web サーバーが動作していることを確認します。# podman run -it --name=myubi ubi10/ubi curl 10.88.0.2:80
11.6. コンテナーとホスト間の通信 リンクのコピーリンクがクリップボードにコピーされました!
ブリッジネットワーク上でコンテナーの IP アドレスを使用して、ホストからコンテナーに通信します。コンテナー内で実行されているサービスには、ホストから直接アクセスできます。
デフォルトでは、podman ネットワークはブリッジネットワークです。つまり、ネットワークデバイスがコンテナーネットワークとホストネットワークをつなぎます。
前提条件
-
container-toolsメタパッケージがインストールされている。 -
web-containerが動作している。詳細は、コンテナーとアプリケーション間の通信 を参照してください。
手順
ブリッジが設定されていることを確認します。
# podman network inspect podman | grep bridge "type": "bridge"ホストネットワークの設定を表示します。
# 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 foreverweb-containerにpodman0サブネットの IP が指定されており、ネットワークがホストにブリッジされていることがわかります。web-containerをチェックし、その IP アドレスを表示します。# podman inspect --format='{{.NetworkSettings.IPAddress}}' web-container 10.88.0.2ホストから直接
web-containerにアクセスします。$ curl 10.88.0.2:80
11.7. ポートマッピングを使用したコンテナー間の通信 リンクのコピーリンクがクリップボードにコピーされました!
分離されたサービスと外部クライアント間の通信を有効化するには、ネットワークポートを Red Hat Enterprise Linux コンテナーにマッピングします。ポートマッピングを設定することで、特定のコンテナー化されたアプリケーションをセキュアに公開し、環境への受信トラフィックの流れを正確に制御できます。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
未公開のコンテナーを実行します。
# podman run -dt --name=web1 ubi10/httpd-24自動的に公開されたコンテナーを実行します。
# podman run -dt --name=web2 -P ubi10/httpd-24手動で公開したコンテナーを実行し、コンテナーポート 8080 を公開します。
# podman run -dt --name=web3 -p 8888:8080 ubi10/httpd-24すべてのコンテナーをリスト表示します。
# 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イメージの Containerfile にEXPOSE 8080とEXPOSE 8443コマンドがあるため、自動ポートマッピングが可能です。-
コンテナー
web3は手動でポートを公開しています。ホストポート 8888 はコンテナーポート 8080 にマッピングされています。
-
コンテナー
web1、web3コンテナーの IP アドレスを表示します。# podman inspect --format='{{.NetworkSettings.IPAddress}}' web1 # podman inspect --format='{{.NetworkSettings.IPAddress}}' web3<IP>:<port> 表記を使用して
web1コンテナーに到達します。# curl 10.88.0.2:8080 ... <title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title> ...localhost:<port> 表記を使用して
web2コンテナーに到達します。# curl localhost:43595 ... <title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title> ...<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コマンドで作成されている。
手順
mynetネットワークに接続されたreceiverコンテナーを実行します。# podman run -d --net mynet --name receiver ubi10 sleep 3000senderコンテナーを実行し、その名前で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 msCTRL+Cで終了します。senderコンテナーは、receiverコンテナーの名前を使用して ping を送信できることがわかります。
11.9. Pod 内の 2 つのコンテナー間での通信 リンクのコピーリンクがクリップボードにコピーされました!
同じ Pod 内のコンテナーはすべて、IP アドレス、MAC アドレス、およびポートマッピングを共有します。同じ Pod 内のコンテナー間では、localhost:port の表記で通信が可能です。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
web-podという名前の Pod を作成します。$ podman pod create --name=web-podweb-containerという名前の Web コンテナーを Pod で実行します。$ podman container run -d --pod web-pod --name=web-container docker.io/library/httpd関連付けられている全 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-poddocker.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メタパッケージがインストールされている。
手順
web-podという名前の Pod を作成します。# podman pod create --name=web-pod-publish -p 80:80すべての Pod をリスト表示します。
# podman pod ls POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS 26fe5de43ab3 web-pod-publish Created 5 seconds ago 7de09076d2b3 1web-podでweb-containerという名前の Web コンテナーを実行します。# podman container run -d --pod web-pod-publish --name=web-container docker.io/library/httpdコンテナーの一覧を表示します。
# 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-containerweb-containerに到達できることを確認します。$ curl localhost:80
11.11. コンテナーネットワークへの Pod のアタッチ リンクのコピーリンクがクリップボードにコピーされました!
Pod を作成する際に、特定のネットワークに接続します。その後 Pod に追加されたすべてのコンテナーは、自動的にそのネットワークに参加します。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
pod-netという名前のネットワークを作成します。# podman network create pod-net /etc/cni/net.d/pod-net.conflistPod
web-podを作成します。# podman pod create --net pod-net --name web-podweb-podでweb-containerという名前のコンテナーを実行します。# podman run -d --pod web-pod --name=web-container docker.io/library/httpdオプション: コンテナーが関連付けられている 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メタパッケージがインストールされている。
手順
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.オプション: ソケットユニットファイルを表示します。
# 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.targetmacvlan ネットワークを作成し、それを使用してホストインターフェイスを指定します。通常、これは外部インターフェイスです。
# podman network create -d macvlan --interface-name <LAN_INTERFACE> mv1 mv1新しく作成したネットワークを使用してコンテナーを実行します。
# podman run --rm --network mv1 -d --name test alpine top 894ae3b6b1081aca2a5d90a9855568eaa533c08a174874be59569d4656f9bc45
検証
コンテナーにローカルサブネット上の 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コンテナーを検査して、正しい 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メタパッケージがインストールされている。
手順
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ユニットファイルで指定されているその他のフィールドはすべて使用できます。
-
mysleep.containerファイルに基づいてmysleep.serviceを作成します。$ systemctl --user daemon-reloadオプション:
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)mysleep.serviceを起動します。$ systemctl --user start mysleep.service注記Quadlet は Podman v4.6 以降で利用可能です。
検証
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: ...すべてのコンテナーをリスト表示します。
$ 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メタパッケージがインストールされている。
手順
systemd マネージャーの設定を再読み込みするには、次のコマンドを実行します。
# systemctl --user daemon-reloadサービス
container.serviceを有効にし、起動時に開始します。# systemctl --user enable container.serviceサービスをすぐに起動します。
# systemctl --user start container.serviceサービスのステータスを確認します。
$ 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 1dsystemctl is-enabled container.serviceコマンドを使用して、サービスが有効化されているか確認できます。オプション:
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メタパッケージがインストールされている。
手順
コンテナー (例:
myubi) を作成します。$ podman create --name myubi registry.access.redhat.com/ubi10:latest sleep infinity 0280afe98bb75a5c5e713b28de4b7c5cb49f156f1cce4a208f13fee2f75cb453コンテナー名または 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メタパッケージがインストールされている。
手順
システムで使用するイメージをプルします。たとえば、
httpd-24イメージをプルするには、以下を実行します。# podman pull registry.access.redhat.com/ubi10/httpd-24オプション: システムで使用可能なすべてのイメージをリストします。
# podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi10/httpd-24 latest 8594be0a0b57 2 weeks ago 462 MBhttpdコンテナーを作成します。# podman create --name httpd -p 8080:8080 registry.access.redhat.com/ubi10/httpd-24 cdb9f981cf143021b1679599d860026b13a77187f75e46cc0eac85293710a4b1オプション: コンテナーが作成されたことを確認します。
# 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 httpdhttpdコンテナーのsystemdユニットファイルを生成します。# podman generate systemd --new --files --name httpd /root/container-httpd.service生成された
container-httpd.servicesystemdユニットファイルの内容を表示します。# 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は、サービスの完全な名前です。
-
/etc/systemd/systemにユニットファイルをコピーして root ユーザーとしてインストールします。# cp -Z container-httpd.service /etc/systemd/systemcontainer-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メタパッケージがインストールされている。
手順
たとえば、
systemd-podなどの空の Pod を作成します。$ podman pod create --name systemd-pod 11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577必要に応じて、すべての Pod をリスト表示します。
$ podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 11d4646ba41b systemd-pod Created 40 seconds ago 1 8a428b257111 11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577空の Pod に 2 つのコンテナーを作成します。たとえば、
container0とcontainer1をsystemd-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必要に応じて、関連付けられている全 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新しい Pod の
systemdユニットファイルを生成します。$ podman generate systemd --files --name systemd-pod /home/user1/pod-systemd-pod.service /home/user1/container-container0.service /home/user1/container-container1.service3 つの
systemdユニットファイルが生成されることに注意してください。1 つはsystemd-podPod 用、2 つはコンテナーcontainer0およびcontainer1用です。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.serviceとcontainer-container1.serviceユニットファイルの依存関係を定義します。両方のユニットファイルがアクティベートされます。 -
[Service]セクションのExecStart行およびExecStop行はそれぞれ infra-container を開始して停止します。
-
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]セクションのBindsTol 行は、pod-systemd-pod.serviceユニットファイルの依存関係を定義します。 -
[Service]セクションのExecStart行およびExecStop行では、それぞれcontainer0を起動および停止します。
-
container-container1.serviceユニットファイルを表示します。$ cat container-container1.service生成されたファイルをすべて
$HOME/.config/systemd/userにコピーして、root 以外のユーザーとしてインストールします。$ cp pod-systemd-pod.service container-container0.service container-container1.service $HOME/.config/systemd/userユーザーのログイン時に、サービスを有効にして開始します。
$ 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メタパッケージがインストールされている。
手順
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必要に応じて、実行中または終了したコンテナーをリスト表示します。
# 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 myubimyubiコンテナーのsystemdユニットファイルを生成します。# podman generate systemd --new --files --name myubi /root/container-myubi.service/usr/lib/systemd/systemにユニットファイルをコピーして root ユーザーとしてインストールします。# cp -Z ~/container-myubi.service /usr/lib/systemd/systemsystemdマネージャー設定をリロードします。# systemctl daemon-reloadコンテナーを起動して、ステータスを確認します。
# systemctl start container-myubi.service # systemctl status container-myubi.serviceコンテナーを自動更新します。
# 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メタパッケージがインストールされている。
手順
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.targetpodman-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コマンドは、毎日、深夜に起動します。システム起動時に
podman-auto-update.timerサービスを有効にします。# systemctl enable podman-auto-update.timersystemdサービスを開始します。# systemctl start podman-auto-update.timer必要に応じて、すべてのタイマーをリスト表示します。
# 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.servicepodman-auto-update.timerがpodman-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 の作成 セクションを参照してください。
手順
関連付けられている全 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 223df6b390b4Pod 名または ID を使用して Kubernetes YAML ファイルを生成します。
$ podman generate kube mypod > mypod.yamlpodman generateコマンドは、コンテナーに接続されている論理ボリュームマネージャー (LVM) の論理ボリュームまたは物理ボリュームを反映しません。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.yamloc createコマンドはmyappイメージを作成して実行します。オブジェクトは--dry-runオプションを使用して出力され、myapp.yaml出力ファイルにリダイレクトされます。
14.3. Podman でのコンテナーおよび Pod の起動 リンクのコピーリンクがクリップボードにコピーされました!
生成された YAML ファイルを使用すると、任意の環境でコンテナーおよび Pod を自動的に起動できます。YAML ファイルは、Kubernetes や OpenShift など、Podman 以外のツールを使用して生成できます。
podman play kube コマンドを使用すると、YAML 入力ファイルに基づいて Pod とコンテナーを再作成できます。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
mypod.yamlファイルから Pod およびコンテナーを作成します。$ podman play kube mypod.yaml Pod: b8c5b99ba846ccff76c3ef257e5761c2d8a5ca4d7ffa3880531aec79c0dacb22 Container: 848179395ebd33dd91d14ffbde7ae273158d9695a081468f487af4e356888eceすべての Pod をリスト表示します。
$ podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID b8c5b99ba846 mypod Running 19 seconds ago 2 aa4220eaf4bb関連付けられている全 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 b8c5b99ba846podman 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メタパッケージがインストールされている。
手順
mariadb-conf/Containerfileファイルを表示します。$ cat mariadb-conf/Containerfile FROM docker.io/library/mariadb COPY my.cnf /etc/mysql/my.cnfmariadb-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/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必要に応じて、すべてのイメージをリスト表示します。
$ podman images LIST IMAGES REPOSITORY TAG IMAGE ID CREATED SIZE localhost/mariadb-conf latest b66fa0fa0ef2 57 seconds ago 416 MBwordpresspodという名前の pod を作成し、コンテナーとホストシステム間のポートマッピングを設定します。$ podman pod create --name wordpresspod -p 8080:80wordpresspodpod の中に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-confwordpresspodpod の中に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必要に応じて、関連付けられている全 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 の作成 セクションを参照してください。
手順
関連付けられている全 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 wordpresspodPod 名または 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 コマンドと類似した動作です。以下の条件が該当する場合には、自動的にイメージが構築されます。
- YAML ファイルで使用されているイメージと同じ名前のディレクトリーが存在する
- そのディレクトリーには Containerfile が含まれている
前提条件
-
container-toolsメタパッケージがインストールされている。 -
wordpresspodという名前の Pod が作成されている。詳細は、Podman を使用したコンテナーと Pod の手動実行 を参照してください。 - YAML ファイルが生成されている。詳細は、Podman を使用した YAML ファイルの生成 のセクションをご覧ください。
手順
最初からやり直す場合は、ローカルに保存されているイメージを削除してください。
$ podman rmi localhost/mariadb-conf $ podman rmi docker.io/library/wordpress $ podman rmi docker.io/library/mysqlwordpress.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 29717878452ff56299531f79832723d3a620a403f4a996090ea987233df0bc3dpodman play kubeコマンド:-
docker.io/library/mariadbイメージを元にlocalhost/mariadb-conf:latestイメージを自動構築します。 -
docker.io/library/wordpress:latestのイメージをプルします。 -
wordpresspod-mydbとwordpresspod-mywebの 2 つのコンテナーが含まれる、wordpresspodという名前の Pod を作成します。
-
すべてのコンテナーと 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 とそのコンテナーを停止して削除します。
前提条件
-
container-toolsメタパッケージがインストールされている。 -
wordpresspodという名前の Pod が作成されている。詳細は、Podman を使用したコンテナーと Pod の手動実行 を参照してください。 - YAML ファイルが生成されている。詳細は、Podman を使用した YAML ファイルの生成 を参照してください。
- Pod が実行中である。詳細は、Podman を使用したコンテナーや 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/ にドロップインファイルを作成し、設定を適用します。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む 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-
Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
ホスト上で
podman infoコマンドを実行します。$ ansible managed-node-01.example.com -m command -a 'podman info'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
15.3. podman RHEL システムロールを使用したバインドマウントによるルートレスコンテナーの作成 リンクのコピーリンクがクリップボードにコピーされました!
podman RHEL システムロールを使用すると、Ansible Playbook を実行してバインドマウントによりルートレスコンテナーを作成し、アプリケーション設定を管理できます。
この Ansible Playbook の例では、データベース用と Web アプリケーション用の 2 つの Kubernetes Pod を起動します。データベース Pod の設定は Playbook で指定します。Web アプリケーション Pod は外部 YAML ファイルで定義します。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。 -
ユーザーとグループ
webappが存在し、ホスト上の/etc/subuidおよび/etc/subgidファイルにリストされている。 -
dbuserという名前のユーザーとdbgroupという名前のグループが、すでに作成されている必要がある。
手順
次の内容を含む 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_userandrun_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ファイルを参照してください。
-
-
Playbook の構文を検証します。
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook --ask-vault-pass ~/playbook.yml
15.4. podman RHEL システムロールを使用した Podman ボリュームを持つルートフルコンテナーの作成 リンクのコピーリンクがクリップボードにコピーされました!
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 ロールはルートフルコンテナーを作成します。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む 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_contentubi10-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ファイルを参照してください。
-
Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文のみを検証するものであり、誤っているが有効な設定に対する保護機能はありません。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
15.5. podman RHEL システムロールを使用したシークレットを含む Quadlet アプリケーションの作成 リンクのコピーリンクがクリップボードにコピーされました!
podman RHEL システムロールを使用して、Ansible Playbook を実行することで、シークレットを含む Quadlet アプリケーションを作成できます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。 -
コンテナー内の Web サーバーの証明書とそれに対応する秘密鍵が、
~/certificate.pemおよび~/key.pemファイルに保存されている。
手順
証明書と秘密鍵ファイルの内容を表示します。
$ cat ~/certificate.pem -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- $ cat ~/key.pem -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----この情報は後の手順で必要になります。
機密性の高い変数を暗号化されたファイルに保存します。
vault を作成します。
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>ansible-vault createコマンドでエディターが開いたら、機密データを<key>: <value>形式で入力します。root_password: <root_password> certificate: |- -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- key: |- -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----certificate変数およびkey変数のすべての行が 2 つのスペースで始まるようにします。- 変更を保存して、エディターを閉じます。Ansible は vault 内のデータを暗号化します。
次の内容を含む 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ファイルを参照してください。
-
Wordpress ネットワークを、
Playbook の構文を検証します。
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.ymlこのコマンドは構文のみを検証するものであり、誤っているが有効な設定に対する保護機能はありません。
Playbook を実行します。
$ ansible-playbook --ask-vault-pass ~/playbook.yml
関連情報
第16章 RHEL Web コンソールを使用したコンテナーイメージの管理 リンクのコピーリンクがクリップボードにコピーされました!
RHEL Web コンソールを使用してコンテナーイメージを管理できます。Web コンソールはグラフィカルインターフェイスを提供し、Podman containers セクションでコンテナーイメージの取得、整理、削除を実行できます。
16.1. Web コンソールでのコンテナーイメージの取得 リンクのコピーリンクがクリップボードにコピーされました!
コンテナーイメージをローカルシステムにダウンロードし、それを使用してコンテナーを作成できます。
前提条件
RHEL 10 Web コンソールがインストールされている。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
-
cockpit-podmanアドオンがインストールされている。
手順
- RHEL 10 Web コンソールにログインします。
- メインメニューで Podman containers をクリックします。
- Images テーブルで、右上隅にあるオーバーフローメニューをクリックし、Download new image を選択します。
- Search for an image ウィンドウが開きます。
- Search for フィールドに、イメージの名前を入力するか、その説明を指定します。
- in ドロップダウンリストで、イメージを取得するレジストリーを選択します。
- オプション: Tag フィールドに、イメージのタグを入力します。
- をクリックします。
検証
- メインメニューで Podman containers をクリックします。新しくダウンロードしたイメージは、Images テーブルで確認できます。
Images テーブルの ボタンをクリックすると、ダウンロードしたイメージからコンテナーを作成できます。コンテナーを作成するには、Web コンソールでのコンテナーの作成 のステップ 3 - 8 に従ってください。
16.2. Web コンソールでのコンテナーイメージのプルーニング リンクのコピーリンクがクリップボードにコピーされました!
RHEL Web コンソールでコンテナーイメージをプルーニングすることで、どのコンテナーにも使用されていない、不要なイメージをすべて削除できます。
前提条件
- 少なくとも 1 つのコンテナーイメージがプルされます。
- RHEL 10 Web コンソールがインストールされている。手順は、Web コンソールのインストールおよび有効化 を参照してください。
-
cockpit-podmanアドオンをインストールしている。
手順
- RHEL 10 Web コンソールにログインします。
- メインメニューで Podman containers をクリックします。
- Images テーブルで、右上隅のオーバーフローメニューをクリックし、Prune unused images を選択します。
- イメージのリストが表示されたウィンドウが開きます。Prune をクリックして選択を確定します。
検証
- メインメニューで Podman containers をクリックします。削除されたイメージは、Images テーブルにリストされません。
16.3. Web コンソールでのコンテナーイメージの削除 リンクのコピーリンクがクリップボードにコピーされました!
Web コンソールを使用して、以前にプルしたコンテナーイメージを削除できます。
前提条件
- 少なくとも 1 つのコンテナーイメージがプルされます。
- RHEL 10 Web コンソールがインストールされている。
-
cockpit-podmanアドオンがインストールされている。
手順
- RHEL 10 Web コンソールにログインします。
- メインメニューの Podman containers ボタンをクリックします。
- Images テーブルで、削除するイメージを選択し、オーバーフローメニューをクリックして Delete を選択します。
- 次のダイアログで、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 コンソールでコンテナーのチェックポイントを作成します。このチェックポイントを設定することで、作業の進行状況を失うことなく、安全に操作を一時停止したり、ワークロードを別のホストに移行したり、後でコンテナーを復元したりすることができます。
前提条件
- コンテナーが実行されている。
RHEL 10 Web コンソールがインストールされている。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
-
cockpit-podmanアドオンがインストールされている。
手順
- RHEL 10 Web コンソールにログインします。
- メインメニューで Podman containers をクリックします。
- Containers テーブルで、変更するコンテナーを選択し、オーバーフローアイコンメニューをクリックして Containers を選択します。
オプション: Checkpoint container フォームで、必要なオプションをチェックします。
- すべての一時チェックポイントファイルを保持する: チェックポイント処理中に Checkpoint/Restore In Userspace (CRIU) によって作成されたすべての一時ログおよび統計ファイルを保持します。さらなるデバッグのためのチェックポイント設定が失敗した場合でも、これらのファイルは削除されません。
- チェックポイントをディスクに書き込んだ後も実行したままにする: チェックポイントを作成した後もコンテナーを停止するのではなく、実行したままにします。
- 確立された TCP 接続の維持のサポート
をクリックします。
注記チェックポイントの作成は、システムコンテナーでのみ使用できます。
検証
- メインメニューで Podman containers クリックします。チェックポイントを設定したコンテナーを選択し、オーバーフローメニューアイコンをクリックして、Restore オプションがあることを確認します。
17.2. Web コンソールでのコンテナーチェックポイントの復元 リンクのコピーリンクがクリップボードにコピーされました!
以前に保存した状態から操作を再開するには、Red Hat Enterprise Linux の Web コンソールでコンテナーのチェックポイントを復元します。ホストの再起動後、ワークロードを迅速に復旧したり、移行したコンテナーをデータ損失なくオンラインに戻したりすることも可能です。
前提条件
- コンテナーにチェックポイントが設定されている。
- RHEL 10 Web コンソールがインストールされている。手順は、Web コンソールのインストールおよび有効化 を参照してください。
-
cockpit-podmanアドオンがインストールされている。
手順
- RHEL 10 Web コンソールにログインします。
- メインメニューで Podman containers をクリックします。
- Containers テーブルで、変更するコンテナーを選択し、オーバーフローメニューをクリックして Restore を選択します。
オプション: Restore container フォームで、必要なオプションを確認します。
- すべての一時チェックポイントファイルを保持する: チェックポイント処理中に CRIU によって作成されたすべての一時ログおよび統計ファイルを保持します。さらなるデバッグのためのチェックポイント設定が失敗した場合でも、これらのファイルは削除されません。
- Restore with established TCP connections
- 静的に設定されている場合は IP アドレスを無視する: ユーザーが IP アドレスを使用してコンテナーを開始した場合、復元されたコンテナーもその IP アドレスの使用を試みます。その IP アドレスがすでに使用されている場合、復元操作は失敗します。このオプションは、コンテナーの作成時に Integration タブでポートマッピングを追加した場合に適用されます。
- 静的に設定されている場合は MAC アドレスを無視する: IP アドレスを使用してコンテナーが開始された場合、復元されたコンテナーもその MAC アドレスの使用を試みます。その MAC アドレスがすでに使用されている場合、復元操作は失敗します。
をクリックします。
注記チェックポイントの作成は、システムコンテナーでのみ使用できます。
検証
- メインメニューで Podman containers クリックします。Containers テーブルで復元されたコンテナーが実行されていることがわかります。
17.3. Web コンソールでの Pod の作成 リンクのコピーリンクがクリップボードにコピーされました!
関連するコンテナーを 1 つの単位としてグループ化して管理するには、Red Hat Enterprise Linux Web コンソールインターフェイスでコンテナー Pod を作成します。前提条件は以下のとおりです。
RHEL 10 Web コンソールがインストールされている。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
-
cockpit-podmanアドオンがインストールされている。
手順
- RHEL 10 Web コンソールにログインします。
- メインメニューで Podman containers をクリックします。
- をクリックします。
Create pod フォームに必要な情報を入力します。
- 管理アクセスでのみ使用可能: コンテナーの所有者: システムまたはユーザーを選択します。
- Name フィールドに、コンテナーの名前を入力します。
をクリックして、コンテナーとホストシステムの間にポートマッピングを追加します。
- IP アドレス、ホストポート、コンテナーポート、プロトコルを入力します。
をクリックしてボリュームを追加します。
- ホストパス、コンテナーパスを入力します。書き込み可能チェックボックスをオンにして、書き込み可能なボリュームを作成できます。SELinux ドロップダウンリストで、次のオプションのいずれかを選択します: No Label、Shared、または Private。
- をクリックします。
検証
- メインメニューで Podman containers をクリックします。新しく作成された Pod は Containers テーブルで確認できます。
17.4. Web コンソールの Pod 内にコンテナーを作成する リンクのコピーリンクがクリップボードにコピーされました!
RHEL の Web コンソール GUI を使用して、Pod 内にコンテナーを作成できます。
前提条件
RHEL 10 Web コンソールがインストールされている。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
-
cockpit-podmanアドオンがインストールされている。
手順
- RHEL 10 Web コンソールにログインします。
- メインメニューで Podman containers をクリックします。
- をクリックします。
- Name フィールドに、コンテナーの名前を入力します。
Details タブに必要な情報を入力します。
- 管理アクセスでのみ使用可能: コンテナーの所有者: システムまたはユーザーを選択します。
Image ドロップダウンリストで、選択したレジストリー内のコンテナーイメージを選択または検索します。
- オプション: 最新のコンテナーイメージをプルするには、Pull latest image チェックボックスをオンにします。
Command フィールドはコマンドを指定します。必要に応じて、デフォルトのコマンドを変更できます。
- オプション: ターミナルを使用してコンテナーを実行するには、With terminal チェックボックスをオンにします。
- Memory limit フィールドでは、コンテナーのメモリー制限を指定します。デフォルトのメモリー制限を変更するには、チェックボックスをオンにして制限を指定します。
- システムコンテナーでのみ使用可能: CPU シェアフィールド で、相対的な CPU 時間量を指定します。デフォルト値は 1024 です。デフォルト値を変更するには、チェックボックスをオンにします。
システムコンテナーでのみ使用可能: Restart policy ドロップダウンメニューで、次のオプションのいずれかを選択します。
- No (デフォルト値): アクションはありません。
- On Failure: 失敗時にコンテナーを再起動します。
- Always: コンテナーの終了時またはシステム起動後にコンテナーを再起動します。
Integration タブに必要な情報を入力します。
をクリックして、コンテナーとホストシステムの間にポートマッピングを追加します。
- IP アドレス、ホストポート、コンテナーポート、および プロトコル を入力します。
をクリックしてボリュームを追加します。
- ホストパス、コンテナーパス を入力します。Writable オプションのチェックボックスをオンにして、書き込み可能なボリュームを作成できます。SELinux ドロップダウンリストで、No Label、Shared、または Private のいずれかのオプションを選択します。
をクリックして環境変数を追加します。
- Key と Value を入力します。
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 をインストールしている。
- ルートレス設定がセットアップされていることを確認した。
手順
統一設定は、以下の 2 つの方法で指定できます。
root 以外のすべてのユーザーに対して設定を指定できます。
/etc/containers/containers.rootless.conf.d/ディレクトリーを作成して、すべての非 root ユーザーに対して設定します。$ mkdir /etc/containers/containers.rootless.conf.d/たとえば、DNS サーバーを設定するには、
/etc/containers/containers.rootless.conf.d/dns.conf設定ファイルを作成します。[containers] dns_servers = [ "1.1.1.1", "8.8.8.8", ]
特定の非 root ユーザーに対して設定を指定できます。
特定の非 root ユーザーに対して設定するには、
/etc/containers/containers.rootless.conf.d/UID/ディレクトリーを作成します。$ mkdir /etc/containers/containers.rootless.conf.d/UID/たとえば、
/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メタパッケージがインストールされている。
手順
registry.redhat.io レジストリーにログインします。
$ podman login registry.redhat.io Username: myuser@mycompany.com Password: <password> Login Succeeded!registry.redhat.io/rhel10/skopeoコンテナーイメージを取得します。$ podman pull registry.redhat.io/rhel10/skopeoSkopeo を使用して、リモートコンテナーイメージ
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メタパッケージがインストールされている。
手順
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
-
-
オプション: ローカルストレージ内のイメージをリスト表示します。
$ 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メタパッケージがインストールされている。
手順
registry.redhat.io レジストリーにログインします。
$ podman login registry.redhat.io Username: myuser@mycompany.com Password: <password> Login Succeeded!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- 別のルートディレクトリーに変更する機能。コンテナーのデフォルト機能には含まれていません。
-
registry.access.redhat.com/ubi10/イメージを使用して、新しいコンテナーを作成します。# buildah from registry.access.redhat.com/ubi10/ ... ubi10/-working-containerubi10/-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必要に応じて、ローカルストレージ内の全イメージをリスト表示します。
# buildah images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi10/ latest ecbc6f53bba0 5 weeks ago 211 MB必要に応じて、作業用コンテナーとそのベースイメージをリスト表示します。
# buildah containers CONTAINER ID BUILDER IMAGE ID IMAGE NAME CONTAINER NAME 0aaba7192762 * ecbc6f53bba0 registry.access.redhat.com/ub... ubi10/-working-containerオプション:
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:latesti イメージがプルされます。
検証
すべてのコンテナーをリスト表示します。
$ 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:latesti イメージがプルされます。
検証
すべてのコンテナーをリスト表示します。
$ 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メタパッケージがインストールされている。
手順
registry.redhat.io レジストリーにログインしている。
# podman login registry.redhat.ioregistry.redhat.io/rhel10/podmanイメージをベースとするコンテナーを実行します。# podman run --privileged --name podman_container -it \ registry.redhat.io/rhel10/podman /bin/bashregistry.redhat.io/rhel10/podmanイメージに基づいて、podman_containerという名前の外部コンテナーを実行します。--itオプションは、コンテナー内で対話式 bash シェルを実行します。--privilegedオプションは、コンテナーをホストから分離するセキュリティー機能を無効にします。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パッケージをインストールします。 - コンテナーコマンドを設定します。
-
Containerfileを使用してmoon-buggyという名前の新しいコンテナーイメージをビルドします。# podman build -t moon-buggy .必要に応じて、すべてのイメージをリスト表示します。
# 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 MBmoon-buggyコンテナーをベースとする新しいコンテナーを実行します。# podman run -it --name moon moon-buggy必要に応じて、
moon-buggyイメージをタグ付けします。# podman tag moon-buggy registry.example.com/moon-buggy必要に応じて、
moon-buggyイメージをレジストリーにプッシュします。# podman push registry.example.com/moon-buggyこの例は、Podman がこのコンテナー内から別のコンテナーを構築して実行する方法を示しています。このコンテナーは、シンプルなテキストベースのゲームである
Moon-buggyを実行します。
第20章 コンテナーの監視 リンクのコピーリンクがクリップボードにコピーされました!
RHEL 上のコンテナーは、Podman や RHEL Web コンソールなどのツールを使用して監視できます。主な手法としては、コンテナーログの検査、リソース使用状況の監視、コンテナープロセスの健全性の確認などがあります。
20.1. コンテナーでヘルスチェックを使用する リンクのコピーリンクがクリップボードにコピーされました!
コンテナー内で実行されているプロセスの健全性や準備状況を判断するには、ヘルスチェックを実行します。ヘルスチェックに成功すると、コンテナーは "healthy" とマークされます。そうでなければ、"unhealthy" とマークされます。
podman exec コマンドを実行して終了コードを調べることで、ヘルスチェックを比較できます。ゼロの終了値は、コンテナーが healthy であることを意味します。Containerfile で HEALTHCHECK 命令を使用してイメージをビルドするとき、またはコマンドラインでコンテナーを作成するときに、ヘルスチェックを設定できます。
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メタパッケージがインストールされている。
手順
ヘルスチェックを定義します。
$ 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はヘルスチェックを手動で実行することを示します。hc-containerコンテナーのヘルスステータスを確認します。podman inspectコマンドの使用:$ podman inspect --format='{{json .State.Health.Status}}' hc-container healthypodman 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-containerpodman healthcheck runコマンドを使用します。$ podman healthcheck run hc-container healthy詳細は、システム上の
podman-healthcheck(1)およびpodman-run(1)man ページを参照してください。
20.3. Containerfile を使用してヘルスチェックを実行する リンクのコピーリンクがクリップボードにコピーされました!
Containerfile で HEALTHCHECK 命令を使用してヘルスチェックを設定できます。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
Containerfileを作成します。$ cat Containerfile FROM registry.access.redhat.com/ubi10/httpd-24 EXPOSE 8080 HEALTHCHECK CMD curl http://localhost:8080 || exit 1注記HEALTHCHECK命令は、dockerイメージ形式でのみサポートされています。ociイメージ形式の場合、命令は無視されます。コンテナーをビルドし、イメージ名を追加します。
$ 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コンテナーを実行します。
$ podman run -dt --name=hc-container localhost/hc-containerhc-containerコンテナーのヘルスステータスを確認します。podman inspectコマンドの使用:$ podman inspect --format='{{json .State.Health.Status}}' hc-container healthypodman 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-containerpodman 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 0BPodman のホスト、現在のストレージ統計、およびビルドに関する情報を表示するには、以下を入力します。
$ 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] ypodman system pruneコマンドは、未使用のコンテナー (関連付けられていないコンテナーおよび参照されていないコンテナー両方)、Pod、ローカルストレージのボリューム (任意) をすべて削除します。--allオプションを使用すると、ダングリングイメージや、コンテナーのベースとして使用されていないすべてのイメージを含む、未使用のイメージを一括で削除できます。ボリュームをプルーニングするには、--volumeオプションを使用します。デフォルトでは、コンテナーが現在ボリュームを使用していない場合、重要なデータが削除されるのを防ぐため、ボリュームは削除されません。詳細は、システム上の
podman-system-df、podman-system-info、およびpodman-system-pruneman ページを参照してください。
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メタパッケージがインストールされている。
手順
myubiコンテナーを実行します。$ podman run -q --rm --name=myubi registry.access.redhat.com/ubi10/ubi:latestPodman イベントを表示します。
すべての 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メタパッケージがインストールされている。
手順
~/.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ファイルを変更します。コンテナーを作成します。
$ podman create registry.access.redhat.com/ubi10/ubi:latest 19524fe3c145df32d4f0c9af83e7964e4fb79fc4c397c514192d9d7620a36cd3Podman イベントを表示します。
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 eventsとjournalctlコマンドの出力データは同じです。詳細は、システム上の
podman-events(1)およびcontainers.conf(5)man ページを参照してください。
第21章 開発とトラブルシューティングに Toolbx を使用する リンクのコピーリンクがクリップボードにコピーされました!
Toolbx コンテナーを使用すると、ホストシステムを変更することなく開発ツールをインストールできます。Toolbx は、システムをクリーンに保ちながらホストリソースにアクセスできるシームレスな環境を提供します。
システムへのソフトウェアのインストールには、一定のリスクが伴います。これにより、システムの動作が変化する可能性や、不要になった後も望ましくないファイルやディレクトリーがシステム内に残されてしまう可能性があります。
開発ツール、デバッグツール、エディター、ソフトウェア開発キット (SDK) を、ベースとなるオペレーティングシステムに影響を与えることなく、完全に変更可能な Toolbx コンテナーにインストールすることで、これらのリスクを回避できます。less、lsof、rsync、ssh、sudo、unzip などのコマンドを使用して、ホストシステム上で変更を加えることができます。
開発ツールや SDK を Toolbx コンテナーにインストールすることで、ベースとなるオペレーティングシステムへのシステム変更や不要なファイルのインストールを回避できます。less、lsof、rsync、ssh、sudo、unzip などのコマンドを使用して、ホストシステム上で変更を実行することもできます。Toolbx ユーティリティーは次のアクションを実行します。
-
registry.access.redhat.com/ubi10/toolbox:latestイメージをローカルシステムにプルする - イメージからコンテナーを起動する
- コンテナー内でシェルを実行し、そこからホストシステムにアクセスできる
Toolbx コンテナーがルートコンテナーとして実行されるか、ルートレスコンテナーとして実行されるかは、それを作成したユーザーの権限によって決まります。ホストシステム上で root 権限を必要とするユーティリティーは、root コンテナー内で実行する必要があります。
21.1. Toolbx コンテナーの起動 リンクのコピーリンクがクリップボードにコピーされました!
Toolbx コンテナーを起動することで、開発やトラブルシューティングのための分離環境に入ることができます。コンテナーに入ることで、基盤となるホストオペレーティングシステムを変更することなく、コマンドラインツールをインストールおよび実行できます。
手順
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
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 コンテナーを使用すると、systemctl、journalctl、nmap などのツールをホストシステムにインストールせずに使用して、ホストシステムのさまざまな問題の根本原因を見つけることができます。
前提条件
- Toolbx コンテナーを作成し、実行している。Toolbx コンテナーに入っている。Toolbx コンテナーはルート権限で作成する必要があります。Toolbx コンテナーの起動 を参照してください。
手順
journalctlコマンドを実行できるようにするには、systemdパッケージをインストールします。⬢[root@toolbox ~]# dnf install systemdホスト上で実行しているすべてのプロセスのログメッセージを表示します。
⬢[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>カーネルのログメッセージを表示します。
⬢[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>nmapネットワークスキャンツールをインストールします。⬢[root@toolbox ~]# dnf install nmapネットワーク内の 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 コンテナーを停止すると、システムリソースを解放し、開発セッションを終了できます。コンテナープロセスを終了することで、バックグラウンドタスクが確実に終了し、後続のワークロードのためにクリーンで効率的な環境を維持できます。
手順
コンテナーを離れてホストに戻ります。
⬢ [user@toolbox ~]$ exitツールボックスコンテナーを停止します。
⬢ [user@toolbox ~]$ podman stop <mytoolbox>オプション: 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 イメージには、install、run、uninstall という runlabel が含まれています。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
support-toolsイメージをプルします。# podman pull registry.redhat.io/rhel10/support-toolssupport-toolsのinstallrunlabel を表示します。# 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スクリプトを実行することを示しています。support-toolsのinstallrunlabel を実行します。# 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イメージが後で使用するファイルがホストシステム上に作成されます。support-toolsのrunrunlabel を表示します。# 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コンテナーを起動する際に、ホストから特定のファイルとディレクトリーをコンテナー内にマウントします。support-toolsのrunrunlabel を実行します。# 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 28a0d719ff179adcea81eb63cc90fcd09f1755d5edb121399068a4ea59bd0f53support-toolsコンテナーは権限を開き、ホストから必要なものをマウントし、support-toolsdデーモンをバックグラウンドで実行します (-d)。support-toolsdデーモンはログメッセージの収集を開始し、メッセージを/var/logディレクトリー内のファイルに送信します。support-toolsのuninstallrunlabel を表示します。# 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.shsupport-toolsのuninstallrunlabel を実行します。# 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パッケージがインストールされている。
手順
サービスをすぐに起動します。
# systemctl enable --now podman.socketdocker-podmanパッケージを使用してvar/lib/docker.sockへのリンクを有効にするには以下を実行します。# dnf install podman-docker
検証
Podman のシステム情報を表示します。
# podman-remote infoリンクを確認します。
# 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パッケージがインストールされている。
手順
サービスをすぐに有効にして起動します。
$ systemctl --user enable --now podman.socketオプション: Docker を使用してプログラムがルートレス Podman ソケットと対話できるようにするには、以下を実行します。
$ export DOCKER_HOST=unix:///run/user/<uid>/podman//podman.sock
検証
ソケットのステータスを確認します。
$ 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.socketpodman.socketはアクティブで、/run/user/<uid>/podman.podman.sockをリッスンしています。<uid>はユーザーの ID です。Podman のシステム情報を表示します。
$ podman-remote info
23.3. Podman API の手動実行 リンクのコピーリンクがクリップボードにコピーされました!
Podman API を実行できます。手動での実行は、特に Docker の互換性レイヤーを使用する場合など、API 呼び出しのデバッグに便利です。
前提条件
-
podman-remoteパッケージがインストールされている。
手順
REST API のサービスを実行します。
# podman system service -t 0 --log-level=debug-
値が 0 の場合はタイムアウトなしを意味します。ルートフルサービスのデフォルトのエンドポイントは
unix:/run/podman/podman.sockです。 -
--log-level <level>オプションは、ロギングレベルを設定します。標準のロギングレベルはdebug、info、warn、error、fatal、およびpanicです。
-
値が 0 の場合はタイムアウトなしを意味します。ルートフルサービスのデフォルトのエンドポイントは
別のコマンドラインウィンドウに、Podman のシステム情報を表示します。
podman-remoteコマンドは、通常のpodmanコマンドとは異なり、Podman ソケットを介して通信します。# podman-remote infoPodman 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 プロセッサーです。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プルしたイメージを表示します。
# 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" ], ... ] } ]