Oracle LinuxでPodmanを使用した複数プラットフォーム・コンテナ・イメージのビルド
イントロダクション
このデモでは、Oracle LinuxでPodmanを使用したマルチプラットフォーム・コンテナ・イメージの作成について説明します。
目的
このチュートリアルでは、次のことを学習します。
- リモート接続用のPodmanの構成
- リモートPodmanインスタンスへの接続
- 単一のContainerfileからプラットフォーム固有のイメージを構築
- プラットフォーム固有のイメージをOracle Cloud Infrastructure Registry (OCIR)にプッシュ
- 両方のプラットフォーム固有のイメージを含むマニフェストリストを作成します
- マニフェスト・リストをOCIRにプッシュ
- OCIRホストのマニフェスト・リストを調べ、使用可能なプラットフォームを確認します
- イメージのプルおよび実行
前提条件
- Oracle Cloud Infrastructure (OCI)テナンシへのアクセス
- Oracle Linuxのx86_64インスタンス
- Oracle Cloud Developer aarch_64インスタンス
- Oracle Cloud Infrastructure Registryへのアクセス
Podmanサーバーのデプロイ
-
Oracle Linuxコンピュート・インスタンスを作成します。
シェイプでx86_64アーキテクチャが使用されている場合、デフォルトのイメージおよびシェイプを使用できます。パブリック・サブネットを選択または作成し、IPv4アドレスを割り当てます。
このステップでは、Always Free Tierで使用可能なマイクロ・シェイプの使用がサポートされます。
-
インスタンスが実行されたら、インスタンスにログインします。
ssh -i <SSH_KEY> opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>説明:
<SSH_KEY>は、コンピュート・インスタンスのプロビジョニング時に使用されるSSHキーのプライベート部分です。例:~/.ssh/id_rsa<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>は、コンピュート・インスタンスのパブリックIPアドレスです。
リモート・アクセス用のPodmanのインストールおよび構成
これらのコマンドは、コンピュート・インスタンス上のデフォルトのopcユーザー・アカウントとして、またはsudoアクセス権を持つ任意のユーザーとして実行できます。
-
最新のセキュリティ修正と訂正でシステムを更新します。
sudo dnf -y update -
Podmanパッケージまたはモジュールをインストールします。
Oracle Linux 8:
sudo dnf module install -y container-tools:ol8Oracle Linux 9およびOracle Linux 10:
sudo dnf install -y container-toolscontainer-toolsモジュールまたはパッケージは、skopeoやbuildahなど、podmanおよびその他のコンテナ・ツールをインストールします。1つの必須パッケージはcontainer-selinuxです。これにより、SELinux対応システムで
podmanをroot以外のユーザーとして実行でき、Oracle Linuxではデフォルトで有効になっています。 -
Podmanソケットを有効にします。
systemdは、そのソケットでリスニングし、リモート・クライアントがアクティブ化するたびにPodmanのインスタンスを起動します。接続が閉じると、systemdはPodmanインスタンスを停止します。
ノート:リモートPodmanアクセスはルートレス・モードで構成できますが、このチュートリアルでは説明しません。
sudo systemctl enable --now podman.socket -
ソケットのパスを確認します。
sudo systemctl status podman.socket出力はソケット・リスニングを示し、その場所は
/run/podman/podman.sockです。これはそれですが、このチュートリアルの後半でSSHパスワードレス構成を実行するために、Podmanサーバー・インスタンスにログオンしたままにします。
Oracle Cloud Developerインスタンスのデプロイ
Oracle Ampere A1 Computeは、Oracle Cloud Infrastructure(OCI)とAmpere Altra Armプロセッサを組み合わせた高性能プラットフォームです。決定的なパフォーマンス、実証されたセキュリティ、および一般的なツールと環境(OS、Kubernetes - OKE、SDK、CLI)を含む幅広い開発者エコシステムを提供します。
OCIは、Oracle Cloud Developer Imageをプラットフォーム・イメージとしてリストし、Git、Node.js、Java、GraalVMなど、一般的な開発者ツールがすべてインストールされています。
-
Oracle Cloud Developerコンピュート・インスタンスを作成します。
Oracle Cloud DeveloperのイメージとAmpereシェイプを選択します。Podmanサーバー・インスタンスと同じパブリック・サブネットを選択し、IPv4アドレスを割り当てます。
-
イングレス・ルールまたはSSHポート転送の使用を決定します。
作成するデモWebアプリケーションには、2つの方法でアクセスできます。両方を有効にできますが、どちらか一方を選択するだけです。
(オプション)イングレス・ルールの作成
イングレス・ルールの使用は、2ステップのプロセスです。このオプションでは、インターネットからサブネットへのアクセスが開き、再起動後も指定したポート上のインスタンスへのアクセス権が引き続き付与されます。最初にOCI内にルールを作成し、次にOracle Linuxインスタンスでfirewalld内のポートを開く必要があります。
-
パブリック・サブネットにイングレス・ルールを追加します。
ルールでは、
0.0.0.0/0からのポート5808/tcpのインバウンド・トラフィックを許可する必要があります。ルールは作成直後に有効になります。 -
新しいターミナルを開き、SSHを介してOracle Cloud Developerインスタンスに接続します。
ssh -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE> -
デモWebアプリケーションへのアクセス権を追加します。
sudo firewall-cmd --permanent --add-port=5808/tcp sudo firewall-cmd --reload -
ファイアウォールへの変更を確認します。
sudo firewall-cmd --list-all出力には、使用可能な
ports: 5808/tcpが表示されます。
SSHポートフォワーディングの使用
-
端末を開き、SSH経由でOracle Cloud Developerインスタンスに接続します。
-Lオプションを使用すると、ローカル転送が有効になります。これにより、SSHトンネルを介してリモート・デモWebアプリケーションに接続するためのローカル・ポートが開きます。ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
Webアプリケーションのコンテナ・イメージの作成とローカルでの実行
-
デモ・アプリケーションのGitリポジトリをクローニングします。
このチュートリアルでは、Node.jsベースのサーバー・モニタリングWebアプリケーションであるRasDashをデプロイします。
git clone https://github.com/sykeben/RasDash.git -
ソース・コード・ディレクトリに移動します。
cd ~/RasDash -
Containerfileを作成して、Webアプリケーションを構築して提供します。
cat << EOF > Containerfile FROM ghcr.io/oracle/oraclelinux8-nodejs:14 COPY . /app WORKDIR /app RUN npm install && \ npm test CMD ["/usr/bin/node", "app.js", "service"] EOF -
ローカル・インスタンスでイメージを構築して実行します。
podmanを使用してコンテナ・イメージをローカルに構築し、アプリケーションのバージョンおよびプラットフォームのアーキテクチャでイメージをタグ付けします。この情報は、後で各プラットフォーム・イメージをOracle Cloud Infrastructure Registry (OCIR)にプッシュするとき、および2つのプラットフォーム・イメージのマニフェストを作成するときに役立ちます。sudo podman build --format docker --tag rasdash:0.3.4-arm64 .最終行はアプリケーション・ビルドに固有になります。
-
イメージを使用してコンテナを実行します。
sudo podman run --rm --init -detach --name rasdash --publish 5808:5808 localhost/rasdash:0.3.4-arm64Podmanが返すダイジェストは、各コンテナ・インスタンスに対して一意です。
-
実行中のコンテナを表示します。
sudo podman ps出力には、コンテナが
Upとして表示され、実行されています。 -
コンテナ・ログを表示します。
sudo podman logs rasdash出力には、
[STATE] Server startedが表示されます。 -
Webアプリケーションを表示します。
ローカル・マシンでブラウザを開き、
http://localhost:5808に移動します。イングレス・ルールおよびファイアウォール・ルールを作成した場合は、localhostではなくOracle Cloud DeveloperインスタンスのパブリックIPアドレスを使用できます。ノート: OCIの仮想インスタンスが物理ハードウェア・データにアクセスできないため、CPU温度メトリックは
-1を表示します。 -
実行中のコンテナを停止します。
sudo podman stop rasdash
インスタンス間でのパスワードなしSSHの構成
Podmanは、セキュリティ目的でインスタンス間でSSHを使用して通信します。よりシームレスなエクスペリエンスを実現するには、Cloud Developerインスタンスに公開/秘密キーのペアを作成し、それをPodmanリモート・サーバーにコピーして、パスワードの入力を求められることなく開発者インスタンスからSSHを実行できるようにします。
-
Oracle Cloud Developerインスタンスで公開キーと秘密キーのペアを生成します。
ssh-keygen -b 4096 -f ~/.ssh/id_rsa -q -N "" -
公開キー・ファイルの内容をコピーします。
cat ~/.ssh/id_rsa.pubcatコマンドから出力を選択し、コピーします。 -
Podmanサーバー・インスタンスに切り替えます。
-
viでファイルを開きます。
vi ~/.ssh/authorized_keys公開キーの内容を認可キー・ファイルに貼り付けます。
保存してファイルを閉じます。
-
SSHディレクトリおよびファイルに正しいファイル・システム権限を適用してください。
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys -
Cloud Developerインスタンスに切り替えます。
-
パスワードを必要とせずに、
opcユーザーとしてPodmanサーバーにSSH接続できるかどうかをテストします。ノート:問題がある場合は、次のドキュメントを参照してください。
ssh opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>パスワードなしで接続できることを確認したら、Oracle Cloud DeveloperインスタンスとPodmanサーバー間のSSHセッションを必ず
exitしてください。 -
Podmanサーバー・インスタンスに切り替えます。
-
rootユーザーの認可キー・ファイルを置き換えます。
cat /home/opc/.ssh/authorized_keys | sudo tee /root/.ssh/authorized_keys -
Cloud Developerインスタンスに切り替えます。
-
Cloud Developerインスタンスの
opcユーザーを使用して、PodmanサーバーのrootユーザーにSSH接続できるかどうかをテストします。ssh root@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>rootユーザーとしてPodmanサーバーへのSSH接続を正常にテストした後、セッションを
exitできます。
Podmanサーバーへのシステム接続の作成
-
Oracle Cloud DeveloperインスタンスとPodmanサーバーで実行されているPodmanサービスの間にPodmanシステム接続を作成します。
sudo podman system connection add --identity ~/.ssh/id_rsa amd64 ssh://root@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>/run/podman/podman.sock前述のコマンドで、
<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>をPodmanサーバーのIPアドレスまたはホスト名に置き換えてください。 -
接続が正常に追加されたことを確認します。
sudo podman system connection list出力には、
Default値がtrueに設定されたamd64接続が表示されます。Podmanは、システムに複数の接続が構成されている場合、この接続を使用します。
リモートPodmanサーバーでのイメージの構築
これで、podman --remoteを使用して、Oracle Cloud DeveloperインスタンスからリモートPodmanサーバー・インスタンスにコマンドを送信できるようになります。
-
Podmanサーバーの詳細を取得してテストします。
sudo podman --remote infoアーキテクチャは、
arm64としてレポートする必要があります。 -
リモート・イメージを作成します。
Podmanは、コンテキスト全体をリモート・インスタンスに自動的にコピーします。
cd ~/RasDash sudo podman --remote build --format docker --tag rasdash:0.3.4-amd64 . -
イメージがリモートPodmanサーバーに存在することを確認します。
ノート: Podmanでは、作成したイメージはクライアント・マシンにコピーされないため、
sudo podman imagesを実行するとイメージはリストされません。ただし、リモート・マシンで使用できます。sudo podman --remote images出力例:
REPOSITORY TAG IMAGE ID CREATED SIZE localhost/rasdash 0.3.4-amd64 3a1b9755ebdd 8 seconds ago 439 MB ... -
ローカル・イメージ・アーキテクチャを確認します。
特定のプラットフォームおよびアーキテクチャに対して各イメージが構築された(および構築された)ことを検証する最後の方法は、
jqを使用して、各イメージのマニフェスト内のArchitectureフィールドの値を抽出します。sudo podman inspect rasdash:0.3.4-arm64 | jq -r '.[] | .Architecture'ローカル・イメージは、そのアーキテクチャを
arm64としてレポートします。 -
リモート・イメージを確認します。
sudo podman --remote inspect rasdash:0.3.4-amd64 | jq -r '.[] | .Architecture'リモート・イメージは、
amd64としてレポートされます。
コンテナ・レジストリ・リポジトリの作成
Oracle Cloud Infrastructure Consoleで、「コンテナ・レジストリ」セクションに移動し、マルチプラットフォーム・アプリケーションを格納するリポジトリを作成します。
詳細は、Oracle Cloud Infrastructureドキュメントのリポジトリの作成を参照してください。
-
プライベート
demo/rasdashリポジトリを作成します。
-
新しいリポジトリの詳細を確認します。

コンテナ・レジストリ・リポジトリ資格証明の収集
次の表に、このチュートリアルの後続のステップで使用される値の例を示します。iadの例は、米国東部(アッシュバーン)リージョンのリージョン・キーです。リージョンがドイツ中央部(フランクフルト)の場合、リージョン・キーはfraです。使用可能なリージョン・キーをリストする完全な表については、リージョンおよび可用性ドメインのドキュメントを参照してください。
| レジストリデータ | チュートリアル・プレースホルダ | ノート |
|---|---|---|
| REGISTRY_NAMESPACE | gse00015915 |
リポジトリ情報パネルに「ネームスペース」として表示されます。 |
| REPOSITORY_NAME | demo/rasdash |
コンパートメント名の下に表示されます |
| OCIR_INSTANCE | iad.ocir.io |
<region>.ocir.ioの使用 |
必要に応じて、Docker CLIを使用したイメージのプッシュを参照してください。この手順では、CLIを使用してイメージをコンテナ・レジストリにプッシュするために必要なログイン・プロセスについて説明します。
-
ユーザー名を取得します。
コンテナ・レジストリにログインするには、ユーザー名と認証トークンが必要です。ユーザー名を取得するには、Oracle Cloud Infrastructureコンソールの右上隅で、「プロファイル」メニュー(ユーザー・メニュー・アイコン)を開き、「自分のプロファイル」をクリックして詳細を表示します。
コンソールに表示される
tenancy-namespaceを含め、ユーザー名をコピーして保存します。
-
認証トークンの生成
コンソールの「マイ・プロファイル」ページをスクロール・ダウンし、「リソース」の下の「認証トークン」を選択します。
「トークンの生成」ボタンを選択し、新しいトークンの
demoの説明を指定します。
トークンを生成したら、必ずコピーして保存してください。

コンテナ・レジストリ・リポジトリにログイン
次の表に、このチュートリアルの後続のステップで使用される値の例を示します。
| ユーザー名 | チュートリアル・プレースホルダ |
|---|---|
| REGISTRY_NAMESPACE | gse00015915 |
| USERNAME | luna.user@e1ab5742-7e30-463a-9017-0b48fa54197e |
| トークン | ]y#W_iS9GKC}4l1Gq9Fn |
| OCIR_INSTANCE | iad.ocir.io |
-
podman loginコマンドで使用する環境変数を作成します。ユーザー名およびトークンを使用して、
USERおよびTOKEN環境変数を作成します。ユーザー名の一部として<REGISTRY_NAMESPACE>を含めます。export OCIR_INSTANCE="iad.ocir.io" export OCIR_NAMESPACE="gse00015915" export OCI_USERNAME="luna.user@e1ab5742-7e30-463a-9017-0b48fa54197e" export OCIR_USERNAME="$OCIR_NAMESPACE/$OCI_USERNAME" export OCI_USER_TOKEN="]y#W_iS9GKC}4l1Gq9Fn" -
コンテナ・レジストリにログインします。
sudo -E podman login -u $OCIR_USERNAME -p $OCIR_USER_TOKEN $OCIR_INSTANCEリモート・インスタンスは、クライアント・インスタンスから認証資格証明を自動的に継承します。
プラットフォーム・イメージのプッシュ
この例では、プラットフォーム固有のタグを持つ最後のリポジトリURIは次のとおりです。
docker://iad.ocir.io/gse00015915/demo/rasdash:0.3.4-arm64docker://iad.ocir.io/gse00015915/demo/rasdash:0.3.4-amd64
Podmanは、事前にタグ付けする必要なく、ローカル・イメージをリモート・レジストリにプッシュできます。
-
ローカル
rasdash/0.3.4-arm64イメージをプッシュします。sudo -E podman push rasdash:0.3.4-arm64 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-arm64 -
リモート
rasdash:0.3.4-amd64イメージをプッシュします。sudo -E podman --remote push rasdash:0.3.4-amd64 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-amd64 -
コンテナ・レジストリ・コンソールを確認します。
ノート:リモート・イメージをプッシュしても、ローカル出力は生成されません。
rasdash:0.3.4-amd64タグのコンテナ・レジストリ・コンソールを確認して、イメージが正常にプッシュされたかどうかを確認します。コンテナ・レジストリ・コンソールに2つのイメージが表示されます。

0.3.4-amd64イメージ:
0.3.4-arm64イメージ:
マニフェスト・リストの作成およびコンテナ・レジストリへのプッシュ
2つのプラットフォーム・イメージがあるので、マニフェスト・リストを作成して、コンテナ・ランタイムがプラットフォームに適したイメージ(オペレーティング・システムとアーキテクチャの組合せ)を選択できるようにします。
ほとんどのコンテナ・イメージはLinuxベースであるため、ユーザーは通常、マルチプラットフォーム・イメージをマルチアーカイブ・イメージと呼びます。ただし、Windows、macOSおよびLinuxで実行できるイメージを単一のマニフェストに結合することもできます。
-
マニフェストを作成して入力します。
タグ内のアプリケーション・バージョンのみを使用して、Cloud Developerインスタンスにローカル・マニフェスト・リストを作成します。
sudo podman manifest create rasdash:0.3.4これまでと同様に、チェックサム出力は、作成したマニフェストに固有であり、前述のものと一致しません。
-
マニフェスト・リストを調べて、使用されている
mediaTypeとそのメンバー・イメージを確認します。sudo podman manifest inspect rasdash:0.3.4 -
2つのプラットフォーム固有のイメージをリストに追加します。
sudo -E podman manifest add rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-arm64sudo -E podman manifest add rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-amd64 -
マニフェストリストを調べます。
sudo podman manifest inspect rasdash:0.3.4画像を追加した後の出力がより興味深い。
最大限の互換性のために、各ビルド・コマンドに
--format dockerパラメータを追加しました。このパラメータは、Podmanがデフォルトで使用するOpen Container Initiative Image Manifest Specificationではなく、Docker Image Manifest V2、Schema 2 (v2s2)仕様を使用してイメージを作成するようにPodmanに指示します。マニフェストは
v2s2仕様を使用しているため、Podmanは、Open Container Initiative Image Index Specificationのかわりに、関連するv2s2Manifest List仕様を使用します。Oracle Engine for Kubernetes (OKE)およびオンプレミスの自己ホストKubernetesディストリビューションを含む、クラウドベースの管理対象Kubernetesサービスの両方で使用されるデフォルトのコンテナ・ランタイムは、両方の仕様と互換性があります。
-
マニフェスト・リストをコンテナ・レジストリにプッシュします。
マニフェスト・リストを作成したので、プラットフォーム固有のイメージを格納するコンテナ・レジストリ・リポジトリにこれをプッシュできます。
sudo -E podman manifest push --all rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4以前にプラットフォーム固有のイメージをプッシュしたため、このアクションは迅速な操作です。コンテナ・レジストリは、マニフェスト・リストを既存のイメージにリンクするだけです。
-
イメージを作成してローカルで実行します。
プラットフォーム固有のタグのかわりにマニフェスト・リスト・タグを使用して、イメージのインスタンスをローカルおよびリモートで実行できるようになりました。
sudo -E podman run --rm --detach --init --publish 5808:5808 $OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4 -
イメージをリモートで作成および実行します。
sudo -E podman --remote run --rm --detach --init --publish 5808:5808 $OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
ブラウザを使用したイメージのテスト
インスタンスに必要なイングレス・ルールおよびfirewalldルールを作成したとします。その場合、ブラウザを開き、http://<PUBLIC_IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>:5808およびhttp://<PUBLIC_IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>:5808に移動して、各インスタンスで実行されているRasDash Webアプリケーションを開くことができます。
それ以外の場合は、ローカル・マシンから2つのトンネルを作成することで、以前と同様にSSHポート転送を使用できます。
-
Oracle Cloud DeveloperインスタンスへのSSHトンネルを開きます。
ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>ローカル・マシンでブラウザを開き、
http://localhost:5808に移動して、クラウド開発インスタンスでarm64ベースのWebアプリケーションを表示します。 -
SSHトンネル・セッションを終了します。
-
Podmanサーバー・インスタンスへのSSHトンネルを開きます。
ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>http://localhost:5808を指すローカル・マシンのブラウザをリフレッシュして、Podmanサーバー・インスタンスでamd64ベースのWebアプリケーションを表示します。
次のステップ
このチュートリアルを終えると、プライベートとパブリックの両方のOCIRリポジトリからデプロイできるイメージを作成する方法がわかります。これらのイメージは、Oracle Engine for Kubernetes (OKE)やOracle Cloud Native Environmentなど、様々な場所で使用できます。MacまたはWindows用のPodman Desktopなど、Oracle Cloud Infrastructureの外部のホストにイメージをデプロイする場合は、リポジトリがパブリックであることを確認する必要があります。
関連リンク
その他の学習リソース
docs.oracle.com/learnで他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Build Multi-Platform Container Images Using Podman on Oracle Linux
F49999-04