Oracle LinuxでPodmanを使用した複数プラットフォーム・コンテナ・イメージのビルド

イントロダクション

このデモでは、Oracle LinuxでPodmanを使用したマルチプラットフォーム・コンテナ・イメージの作成について説明します。

目的

このチュートリアルでは、次のことを学習します。

前提条件

Podmanサーバーのデプロイ

  1. Oracle Linuxコンピュート・インスタンスを作成します。

    シェイプでx86_64アーキテクチャが使用されている場合、デフォルトのイメージおよびシェイプを使用できます。パブリック・サブネットを選択または作成し、IPv4アドレスを割り当てます。

    このステップでは、Always Free Tierで使用可能なマイクロ・シェイプの使用がサポートされます。

  2. インスタンスが実行されたら、インスタンスにログインします。

    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アクセス権を持つ任意のユーザーとして実行できます。

  1. 最新のセキュリティ修正と訂正でシステムを更新します。

    sudo dnf -y update
    
  2. 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ではデフォルトで有効になっています。

  3. Podmanソケットを有効にします。

    systemdは、そのソケットでリスニングし、リモート・クライアントがアクティブ化するたびにPodmanのインスタンスを起動します。接続が閉じると、systemdはPodmanインスタンスを停止します。

    ノート:リモートPodmanアクセスはルートレス・モードで構成できますが、このチュートリアルでは説明しません。

    sudo systemctl enable --now podman.socket
    
  4. ソケットのパスを確認します。

    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など、一般的な開発者ツールがすべてインストールされています。

  1. Oracle Cloud Developerコンピュート・インスタンスを作成します。

    Oracle Cloud DeveloperのイメージとAmpereシェイプを選択します。Podmanサーバー・インスタンスと同じパブリック・サブネットを選択し、IPv4アドレスを割り当てます。

  2. イングレス・ルールまたはSSHポート転送の使用を決定します。

    作成するデモWebアプリケーションには、2つの方法でアクセスできます。両方を有効にできますが、どちらか一方を選択するだけです。

(オプション)イングレス・ルールの作成

イングレス・ルールの使用は、2ステップのプロセスです。このオプションでは、インターネットからサブネットへのアクセスが開き、再起動後も指定したポート上のインスタンスへのアクセス権が引き続き付与されます。最初にOCI内にルールを作成し、次にOracle Linuxインスタンスでfirewalld内のポートを開く必要があります。

  1. パブリック・サブネットにイングレス・ルールを追加します。

    ルールでは、0.0.0.0/0からのポート5808/tcpのインバウンド・トラフィックを許可する必要があります。ルールは作成直後に有効になります。

  2. 新しいターミナルを開き、SSHを介してOracle Cloud Developerインスタンスに接続します。

    ssh -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
    
  3. デモWebアプリケーションへのアクセス権を追加します。

    sudo firewall-cmd --permanent --add-port=5808/tcp
    sudo firewall-cmd --reload
    
  4. ファイアウォールへの変更を確認します。

    sudo firewall-cmd --list-all
    

    出力には、使用可能なports: 5808/tcpが表示されます。

SSHポートフォワーディングの使用

  1. 端末を開き、SSH経由でOracle Cloud Developerインスタンスに接続します。

    -Lオプションを使用すると、ローカル転送が有効になります。これにより、SSHトンネルを介してリモート・デモWebアプリケーションに接続するためのローカル・ポートが開きます。

    ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
    

Webアプリケーションのコンテナ・イメージの作成とローカルでの実行

  1. デモ・アプリケーションのGitリポジトリをクローニングします。

    このチュートリアルでは、Node.jsベースのサーバー・モニタリングWebアプリケーションであるRasDashをデプロイします。

    git clone https://github.com/sykeben/RasDash.git
    
  2. ソース・コード・ディレクトリに移動します。

    cd  ~/RasDash
    
  3. 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
    
  4. ローカル・インスタンスでイメージを構築して実行します。

    podmanを使用してコンテナ・イメージをローカルに構築し、アプリケーションのバージョンおよびプラットフォームのアーキテクチャでイメージをタグ付けします。この情報は、後で各プラットフォーム・イメージをOracle Cloud Infrastructure Registry (OCIR)にプッシュするとき、および2つのプラットフォーム・イメージのマニフェストを作成するときに役立ちます。

    sudo podman build --format docker --tag rasdash:0.3.4-arm64 .
    

    最終行はアプリケーション・ビルドに固有になります。

  5. イメージを使用してコンテナを実行します。

    sudo podman run --rm --init -detach --name rasdash --publish 5808:5808 localhost/rasdash:0.3.4-arm64
    

    Podmanが返すダイジェストは、各コンテナ・インスタンスに対して一意です。

  6. 実行中のコンテナを表示します。

    sudo podman ps
    

    出力には、コンテナがUpとして表示され、実行されています。

  7. コンテナ・ログを表示します。

    sudo podman logs rasdash
    

    出力には、[STATE] Server startedが表示されます。

  8. Webアプリケーションを表示します。

    ローカル・マシンでブラウザを開き、http://localhost:5808に移動します。イングレス・ルールおよびファイアウォール・ルールを作成した場合は、localhostではなくOracle Cloud DeveloperインスタンスのパブリックIPアドレスを使用できます。

    ノート: OCIの仮想インスタンスが物理ハードウェア・データにアクセスできないため、CPU温度メトリックは-1を表示します。

  9. 実行中のコンテナを停止します。

    sudo podman stop rasdash
    

インスタンス間でのパスワードなしSSHの構成

Podmanは、セキュリティ目的でインスタンス間でSSHを使用して通信します。よりシームレスなエクスペリエンスを実現するには、Cloud Developerインスタンスに公開/秘密キーのペアを作成し、それをPodmanリモート・サーバーにコピーして、パスワードの入力を求められることなく開発者インスタンスからSSHを実行できるようにします。

  1. Oracle Cloud Developerインスタンスで公開キーと秘密キーのペアを生成します。

    ssh-keygen -b 4096 -f ~/.ssh/id_rsa -q -N ""
    
  2. 公開キー・ファイルの内容をコピーします。

    cat ~/.ssh/id_rsa.pub
    

    catコマンドから出力を選択し、コピーします。

  3. Podmanサーバー・インスタンスに切り替えます。

  4. viでファイルを開きます。

    vi ~/.ssh/authorized_keys
    

    公開キーの内容を認可キー・ファイルに貼り付けます。

    保存してファイルを閉じます。

  5. SSHディレクトリおよびファイルに正しいファイル・システム権限を適用してください。

    chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
    
  6. Cloud Developerインスタンスに切り替えます。

  7. パスワードを必要とせずに、opcユーザーとしてPodmanサーバーにSSH接続できるかどうかをテストします。

    ノート:問題がある場合は、次のドキュメントを参照してください。

    ssh opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
    

    パスワードなしで接続できることを確認したら、Oracle Cloud DeveloperインスタンスとPodmanサーバー間のSSHセッションを必ずexitしてください。

  8. Podmanサーバー・インスタンスに切り替えます。

  9. rootユーザーの認可キー・ファイルを置き換えます。

    cat /home/opc/.ssh/authorized_keys | sudo tee /root/.ssh/authorized_keys
    
  10. Cloud Developerインスタンスに切り替えます。

  11. Cloud Developerインスタンスのopcユーザーを使用して、PodmanサーバーのrootユーザーにSSH接続できるかどうかをテストします。

    ssh root@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
    

    rootユーザーとしてPodmanサーバーへのSSH接続を正常にテストした後、セッションをexitできます。

Podmanサーバーへのシステム接続の作成

  1. 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アドレスまたはホスト名に置き換えてください。

  2. 接続が正常に追加されたことを確認します。

    sudo podman system connection list
    

    出力には、Default値がtrueに設定されたamd64接続が表示されます。Podmanは、システムに複数の接続が構成されている場合、この接続を使用します。

リモートPodmanサーバーでのイメージの構築

これで、podman --remoteを使用して、Oracle Cloud DeveloperインスタンスからリモートPodmanサーバー・インスタンスにコマンドを送信できるようになります。

  1. Podmanサーバーの詳細を取得してテストします。

    sudo podman --remote info
    

    アーキテクチャは、arm64としてレポートする必要があります。

  2. リモート・イメージを作成します。

    Podmanは、コンテキスト全体をリモート・インスタンスに自動的にコピーします。

    cd ~/RasDash
    sudo podman --remote build --format docker --tag rasdash:0.3.4-amd64 .
    
  3. イメージがリモート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
    ...
    
  4. ローカル・イメージ・アーキテクチャを確認します。

    特定のプラットフォームおよびアーキテクチャに対して各イメージが構築された(および構築された)ことを検証する最後の方法は、jqを使用して、各イメージのマニフェスト内のArchitectureフィールドの値を抽出します。

    sudo podman inspect rasdash:0.3.4-arm64 | jq -r '.[] | .Architecture'
    

    ローカル・イメージは、そのアーキテクチャをarm64としてレポートします。

  5. リモート・イメージを確認します。

    sudo podman --remote inspect rasdash:0.3.4-amd64 | jq -r '.[] | .Architecture'
    

    リモート・イメージは、amd64としてレポートされます。

コンテナ・レジストリ・リポジトリの作成

Oracle Cloud Infrastructure Consoleで、「コンテナ・レジストリ」セクションに移動し、マルチプラットフォーム・アプリケーションを格納するリポジトリを作成します。

詳細は、Oracle Cloud Infrastructureドキュメントのリポジトリの作成を参照してください。

  1. プライベートdemo/rasdashリポジトリを作成します。

    リポジトリの作成

  2. 新しいリポジトリの詳細を確認します。

    リポジトリ詳細

コンテナ・レジストリ・リポジトリ資格証明の収集

次の表に、このチュートリアルの後続のステップで使用される値の例を示します。iadの例は、米国東部(アッシュバーン)リージョンのリージョン・キーです。リージョンがドイツ中央部(フランクフルト)の場合、リージョン・キーはfraです。使用可能なリージョン・キーをリストする完全な表については、リージョンおよび可用性ドメインのドキュメントを参照してください。

レジストリデータ チュートリアル・プレースホルダ ノート
REGISTRY_NAMESPACE gse00015915 リポジトリ情報パネルに「ネームスペース」として表示されます。
REPOSITORY_NAME demo/rasdash コンパートメント名の下に表示されます
OCIR_INSTANCE iad.ocir.io <region>.ocir.ioの使用

必要に応じて、Docker CLIを使用したイメージのプッシュを参照してください。この手順では、CLIを使用してイメージをコンテナ・レジストリにプッシュするために必要なログイン・プロセスについて説明します。

  1. ユーザー名を取得します。

    コンテナ・レジストリにログインするには、ユーザー名と認証トークンが必要です。ユーザー名を取得するには、Oracle Cloud Infrastructureコンソールの右上隅で、「プロファイル」メニュー(ユーザー・メニュー・アイコン)を開き、「自分のプロファイル」をクリックして詳細を表示します。

    コンソールに表示されるtenancy-namespaceを含め、ユーザー名をコピーして保存します。

    ユーザー

  2. 認証トークンの生成

    コンソールの「マイ・プロファイル」ページをスクロール・ダウンし、「リソース」の下の「認証トークン」を選択します。

    「トークンの生成」ボタンを選択し、新しいトークンのdemoの説明を指定します。

    Genトークン

    トークンを生成したら、必ずコピーして保存してください。

    コピー・トークン

コンテナ・レジストリ・リポジトリにログイン

次の表に、このチュートリアルの後続のステップで使用される値の例を示します。

ユーザー名 チュートリアル・プレースホルダ
REGISTRY_NAMESPACE gse00015915
USERNAME luna.user@e1ab5742-7e30-463a-9017-0b48fa54197e
トークン ]y#W_iS9GKC}4l1Gq9Fn
OCIR_INSTANCE iad.ocir.io
  1. 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"
    
  2. コンテナ・レジストリにログインします。

    sudo -E podman login -u $OCIR_USERNAME -p $OCIR_USER_TOKEN $OCIR_INSTANCE
    

    リモート・インスタンスは、クライアント・インスタンスから認証資格証明を自動的に継承します。

プラットフォーム・イメージのプッシュ

この例では、プラットフォーム固有のタグを持つ最後のリポジトリURIは次のとおりです。

Podmanは、事前にタグ付けする必要なく、ローカル・イメージをリモート・レジストリにプッシュできます。

  1. ローカル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
    
  2. リモート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
    
  3. コンテナ・レジストリ・コンソールを確認します。

    ノート:リモート・イメージをプッシュしても、ローカル出力は生成されません。rasdash:0.3.4-amd64タグのコンテナ・レジストリ・コンソールを確認して、イメージが正常にプッシュされたかどうかを確認します。

    コンテナ・レジストリ・コンソールに2つのイメージが表示されます。

    イメージ

    0.3.4-amd64イメージ:

    イメージ

    0.3.4-arm64イメージ:

    イメージ

マニフェスト・リストの作成およびコンテナ・レジストリへのプッシュ

2つのプラットフォーム・イメージがあるので、マニフェスト・リストを作成して、コンテナ・ランタイムがプラットフォームに適したイメージ(オペレーティング・システムとアーキテクチャの組合せ)を選択できるようにします。

ほとんどのコンテナ・イメージはLinuxベースであるため、ユーザーは通常、マルチプラットフォーム・イメージをマルチアーカイブ・イメージと呼びます。ただし、Windows、macOSおよびLinuxで実行できるイメージを単一のマニフェストに結合することもできます。

  1. マニフェストを作成して入力します。

    タグ内のアプリケーション・バージョンのみを使用して、Cloud Developerインスタンスにローカル・マニフェスト・リストを作成します。

    sudo podman manifest create rasdash:0.3.4
    

    これまでと同様に、チェックサム出力は、作成したマニフェストに固有であり、前述のものと一致しません。

  2. マニフェスト・リストを調べて、使用されているmediaTypeとそのメンバー・イメージを確認します。

    sudo podman manifest inspect rasdash:0.3.4
    
  3. 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
    
  4. マニフェストリストを調べます。

    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サービスの両方で使用されるデフォルトのコンテナ・ランタイムは、両方の仕様と互換性があります。

  5. マニフェスト・リストをコンテナ・レジストリにプッシュします。

    マニフェスト・リストを作成したので、プラットフォーム固有のイメージを格納するコンテナ・レジストリ・リポジトリにこれをプッシュできます。

    sudo -E podman manifest push --all rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
    

    以前にプラットフォーム固有のイメージをプッシュしたため、このアクションは迅速な操作です。コンテナ・レジストリは、マニフェスト・リストを既存のイメージにリンクするだけです。

  6. イメージを作成してローカルで実行します。

    プラットフォーム固有のタグのかわりにマニフェスト・リスト・タグを使用して、イメージのインスタンスをローカルおよびリモートで実行できるようになりました。

    sudo -E podman run --rm --detach --init --publish 5808:5808 $OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
    
  7. イメージをリモートで作成および実行します。

    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ポート転送を使用できます。

  1. 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アプリケーションを表示します。

  2. SSHトンネル・セッションを終了します。

  3. 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を参照してください。