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:ol8
Oracle Linux 9およびOracle Linux 10:
sudo dnf install -y container-tools
container-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-arm64
Podmanが返すダイジェストは、各コンテナ・インスタンスに対して一意です。
-
実行中のコンテナを表示します。
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.pub
cat
コマンドから出力を選択し、コピーします。 -
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-arm64
docker://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-arm64
sudo -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のかわりに、関連するv2s2
Manifest 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