9 コンテナ・レジストリの使用

この章では、Oracle Container Registryへのサインイン方法、自己ホスト・コンテナ・レジストリの作成方法および新しいコンテナ・レジストリ・ミラーの追加方法について説明します。

コンテナ・レジストリは、Open Container Initiativeイメージのストアです。コンテナ・イメージは、実行するコンテナの作成に使用する読取り専用テンプレートです。レジストリ内のコンテナ・イメージは、必要に応じてデプロイできます。

デフォルトでは、Oracle Linuxシステムは一般的に使用される3つのレジストリへのアクセス権で構成されています。

  • container-registry.oracle.com

    Oracle Container Registryは、コンテナ・イメージを安全に格納および共有するためのオープン標準ベースのOracle管理コンテナ・レジストリ・サービスです。Oracle Container Registryには、ライセンスされたOracleソフトウェアとオープン・ソースの両方のOracleソフトウェアが含まれ、イメージはOracleによって構築および署名されています。コンテナ・イメージの使用には、該当するライセンスの条件が適用されます。ユーザーは、使い慣れたDockerコマンドライン・インタフェース(CLI)およびAPIを使用してコンテナ・イメージをプルできます。

    Oracle Container Registryからのイメージが署名されている場合のみ信頼するようにコンテナ・ランタイムを構成することで、セキュリティを向上させ、不注意で危険にさらされたイメージの実行を軽減できます。詳細は、「署名付きイメージに対するPodmanの構成」を参照してください。

    Oracle Container Registryは、https://container-registry.oracle.comにあります。これには、Webインタフェースが用意されていて、組織が使用できるソフトウェアのイメージを参照および選択できます。

    ライセンスされたOracleソフトウェア・イメージを使用するには、まず、Oracle Container RegistryのWebインタフェースにサインインし、必要なソフトウェア・イメージのOracle標準条件および制限事項に同意します。

    Oracle Container Registryのいずれかのミラーを使用すると、それぞれの地理的なリージョンでダウンロードを高速化できます。

  • quay.io

    Quay Container Registryは、幅広く使用されているレジストリでRed Hatが提供しています。このレジストリでは、多数のオープン・ソース・イメージを使用できます。

  • docker.io

    Docker Hubレジストリは、主にDockerでの使用を目的とするがPodmanとの互換性がある多くのソフトウェア・イメージを提供しています。Docker Hubレジストリには、使用可能なイメージを参照するためのWebインタフェース(https://hub.docker.com)があります。

    Oracleのエンタープライズ対応のイメージは、Docker Hubでも使用できます。

エンタープライズ環境では、ローカルのコンテナ・レジストリの設定も検討できます。ローカル・コンテナ・レジストリには、カスタマイズされたコンテナから変換されたイメージが格納されます。その後、これらのイメージを将来のコンテナ・デプロイメントに使用できます。ローカル・コンテナ・レジストリにイメージを格納すると、一括デプロイのために実行する必要があるカスタマイズ構成の量が削減されます。ローカル・レジストリは、アップストリーム・レジストリからプルされたイメージをキャッシュおよびホストすることもできます。これにより、ローカル・システムにまたがって一致するコンテナをデプロイすると、ネットワークのオーバーヘッドとレイテンシがさらに軽減されます。

レジストリ構成

デフォルトのレジストリ設定を構成する場合は、/etc/containers/registries.confを編集します。

構成ファイルは、使用可能なオプションについて説明するコメントが付いています。ローカルで使用できないイメージをプルまたは使用しようとしたときに検索されるレジストリは、次の構成ブロックで定義します。

[registries.search]
registries = ['container-registry.oracle.com', 'quay.io', 'docker.io']

レジストリは、このリストで定義した順序で順番に検索されます。ローカル・レジストリが存在する場合は、リストの先頭に追加して、最初に検索するレジストリにします。

有効なSSL証明書がない場合やSSLを使用しないセキュアでないレジストリを使用するには、[registries.insecure]構成ブロック内のregistriesリストにレジストリ・ドメイン名を追加します。

署名付きイメージに対するPodmanの構成

Podmanは、イメージに署名があり、提示された署名がローカルに格納されている公開キーに対して検証できる場合にのみ、リモート・レジストリからのイメージを信頼するように構成できます。この構成オプションは、セキュリティの向上に役立ち、危険にさらされたイメージをインフラストラクチャで実行してしまう不注意を軽減できます。

イメージは、Oracle Linux yumサーバーで使用可能になるパッケージと同様の方法で署名されます。GPGキーは、レジストリで提供されるイメージの署名に使用されます。イメージごとのデジタル署名は、HTTPSを使用してアクセス可能な署名ストアに格納されます。イメージ・ダイジェストに対する署名の検証に使用する公開GPGキーは、Podmanがインストールされているシステムで使用可能にしておく必要があります。

次のステップでは、リモート・レジストリのイメージをローカルで使用する前に、そのイメージの署名と検証を要求するようにPodmanホストを構成する方法を示します。

  1. 署名の検証が必要なレジストリごとに、/etc/containers/registries.d/にYAML形式の構成ファイルを作成して、そのレジストリのsigstoreの値を指定します。

    たとえば、Oracle Container Registryの場合は、ファイル/etc/containers/registries.d/oracle.yamlを作成して、次の内容を移入します。

    docker:
      container-registry.oracle.com:
        sigstore: https://container-trust.oci.oraclecloud.com/podman

    詳細およびテンプレート構成を表示するには、/etc/containers/registries.d/default.yamlを参照してください。

  2. レジストリからのイメージの署名を検証するために使用する必要がある公開GPGキーをダウンロードして保存します。Oracle Container Registryの場合、この公開GPGキーはhttps://container-trust.oci.oraclecloud.com/podman/GPG-KEY-oracleでダウンロードできます。次に例を示します。

    sudo mkdir -p /etc/pki/containers
    sudo wget -O /etc/pki/containers/GPG-KEY-oracle https://container-trust.oci.oraclecloud.com/podman/GPG-KEY-oracle
  3. コンテナのポリシー構成を編集して、特定のレジストリからプルされたイメージの署名を検証するために使用する公開GPGキーの場所を追加します。

    このポリシー構成はJSON形式で、/etc/containers/policy.jsonにあります。レジストリ構成は、dockerキーの下にあります。このキーは、既存の構成のtransportsキーの下に追加することが必要になる場合があります。たとえば、Oracle Container Registryのエントリを含めるように編集したデフォルトのポリシー構成は次のようになります。

    {
      "default": [
        {
          "type": "insecureAcceptAnything"
        }
      ],
      "transports":
        {
          "docker-daemon":
            {
              "": [{"type":"insecureAcceptAnything"}]
            },
          "docker":
            {
              "container-registry.oracle.com": [
                {
                  "type": "signedBy",
                  "keyType": "GPGKeys",
                  "keyPath": "/etc/pki/containers/GPG-KEY-oracle"
                }
              ]
            }
        }
    }

    この構成ファイルの形式の詳細は、containers-policy.json(5)マニュアル・ページを参照してください。

  4. リモート・レジストリからイメージをプルして、構成が正しいことを検証します。例については、「Oracle Container Registryからのイメージのプル」を参照してください。署名要件が正しく構成されている場合は、署名検証が構成されていないイメージをプルしたときの出力と違いがない点に注意してください。検証が実施されたことをテストするには、ポリシー構成でGPGのkeyPathを設定して別のキーを使用します。たとえば、/etc/pki/rpm-gpg/RPM-GPG-KEY-oracleでRPMパッケージの検証に使用されるGPGキーを使用するようにパスを構成できます。署名検証の失敗は、次のように表示されます。

    Trying to pull container-registry.oracle.com/os/oraclelinux:7-slim...
     Invalid GPG signature: gpgme.Signature{Summary:128, Fingerprint:"357217938FC350A2", 
     Status:gpgme.Error{err:0x9}, Timestamp:time.Time{wall:0x0, ext:63754125715, 
     loc:(*time.Location)(0x558c35f0c0a0)}, ExpTimestamp:time.Time{wall:0x0, ext:62135596800, 
     loc:(*time.Location)(0x558c35f0c0a0)}, WrongKeyUsage:false, PKATrust:0x0, 
     ChainModel:false, Validity:0, ValidityReason:error(nil), PubkeyAlgo:1, HashAlgo:2}
    Error: Source image rejected: Invalid GPG signature: gpgme.Signature{Summary:128, 
     Fingerprint:"357217938FC350A2", Status:gpgme.Error{err:0x9}, Timestamp:time.Time{wall:0x0, 
     ext:63754125715, loc:(*time.Location)(0x558c35f0c0a0)}, ExpTimestamp:time.Time{wall:0x0, 
     ext:62135596800, loc:(*time.Location)(0x558c35f0c0a0)}, WrongKeyUsage:false, PKATrust:0x0, 
     ChainModel:false, Validity:0, ValidityReason:error(nil), PubkeyAlgo:1, HashAlgo:2}

 Oracle Container Registryからのイメージのプル

ライセンスされたOracleソフトウェア・イメージをプルする場合は、まずOracle Container Registryにサインインし、Oracle標準条件および制約事項に同意する必要があります。ライセンス供与されたOracleソフトウェアをOracle Container Registryからプルする方法の詳細は、「Oracle Container Registryからのライセンス所有ソフトウェアのプル」を参照してください。

Oracle Container Registryからイメージをプルするには、次のコマンドを使用します。

sudo podman pull container-registry.oracle.com/area/image:tag

areaはOracle Container Registryのリポジトリの場所に、imageはソフトウェア・イメージの名前に置き換えます。次に例を示します。

sudo podman pull container-registry.oracle.com/os/oraclelinux:7-slim

ほとんどの場合、areaimageは小文字で指定します。イメージを参照するときには、使用する適切なtagを常に指定することをお薦めします。

ノート:

通常、イメージをプルするための正しいコマンドは、Oracle Container Registry Webインタフェースのリポジトリ情報ページに記載されています。同じページで、イメージとその実行方法に関するその他の有用な情報も得られます。

Oracle Container Registryからのライセンス所有ソフトウェアのプル

Oracle Container Registryには、ライセンスされている商用のOracleソフトウェア製品のイメージが含まれています。ライセンス所有ソフトウェアのイメージをOracle Container Registryでプルするには、Oracleアカウントが必要です。Oracleアカウントは、https://profile.oracle.com/myprofile/account/create-account.jspxで作成できます。

ノート:

オープン・ソースのOracleソフトウェア・イメージをプルするために、Oracle Container Registryにサインインしたり、Oracle標準条件および制約事項に同意する必要はありません。

ライセンス所有ソフトウェア・イメージを次のようにOracle Container Registryからプルします。

  1. Webブラウザで、Oracleアカウントを使用してOracle Container Registryにサインインします(https://container-registry.oracle.com)。

  2. プルするOracleソフトウェア・イメージのOracle標準条件および制約事項に同意します。この条件の同意は、Oracleアカウントにソフトウェア・イメージをリンクするデータベースに格納されます。Oracle標準条件および制約事項の同意は、条件に同意するリポジトリに対してのみ有効です。レジストリ内の他のリポジトリまたは新しいリポジトリからソフトウェアをプルしようとすると、このプロセスの繰返しが必要になることがあります。Oracle標準条件および制約事項は予告なしに変更される場合があります。

  3. Oracleソフトウェア・イメージを参照するか検索します。

  4. ホスト・システムで、podman loginコマンドを使用して、Oracle Container Registryに対して認証します。

    sudo podman login container-registry.oracle.com

    プロンプトが表示されたら、Oracleアカウントのユーザー名とパスワードを指定します。

  5. podman pullコマンドを使用して、必要なイメージをプルします。次に例を示します。

    sudo podman pull container-registry.oracle.com/java/serverjre

    Oracle Container Registryからのイメージのプルの詳細は、「Oracle Container Registryからのイメージのプル」を参照してください。

    イメージはOracle Container Registryからプルされ、コンテナのデプロイに使用できる状態でローカルに格納されます。

  6. Oracle Container Registryからイメージをプルしたら、不正アクセスを防ぐためにレジストリからログアウトして、Podmanが今後の操作のために格納する可能性のあるサインイン資格証明のすべてのレコードを削除する必要があります。

    sudo podman logout container-registry.oracle.com

PodmanでのOracle Container Registryミラーの使用

Oracle Container Registryには、世界中に多数のミラー・サーバーがあります。特定のグローバル・リージョンにあるレジストリ・ミラーを使用すると、コンテナ・イメージのダウンロード・パフォーマンスを高めることができます。

使用可能なすべてのミラーと、特定のミラーからのイメージのプルに使用するコマンドをリストするには、Oracle Container RegistryのWebインタフェースを使用してイメージの情報ページを参照してください。情報ページの下部にあるTags表には、レジストリ・ミラーを選択するためのDownload Mirrorドロップダウン・リストがあります。ミラーを選択すると、Pull Command列は、選択したミラーからイメージをプルするためのコマンドを表示するように変更されます。

たとえば、SydneyミラーからOracle Linux 7イメージをプルするコマンドは次のとおりです。

sudo podman pull container-registry-sydney.oracle.com/os/oraclelinux:7-slim

ライセンスされたOracleソフトウェア・イメージをレジストリ・ミラーからダウンロードするには、まず、https://container-registry.oracle.comにあるOracle Container RegistryのWebインタフェースでOracle標準条件および制限事項に同意する必要があります。

ライセンスされたOracleソフトウェア・イメージをプルするには、イメージをプルする前にOracle Container Registryミラーにサインインします。次に例を示します。

sudo podman login container-registry-sydney.oracle.com
sudo podman pull container-registry-sydney.oracle.com/java/serverjre
sudo podman logout container-registry-sydney.oracle.com.oracle.com

定期的にミラーを使用する場合は、そのミラーを構成に追加して、デフォルトで検索およびプル・リクエストに使用されるようにします。詳細は、「レジストリ構成」を参照してください。

PodmanでのDocker Hubの使用

Docker Hubには、エンタープライズで使用可能なライセンスされた商用Oracleソフトウェア製品のDockerイメージが含まれています。Docker Hubは、https://hub.docker.comにあります。

Docker Hubを参照し、ハブから一部のイメージを匿名でプルできます。ただし、Docker Hubでホストされているイメージの大部分にアクセスするには、有効なDocker IDを使用してサインインする必要があります。Docker IDにはhttps://hub.docker.com/signupで登録できます。

Docker Hubには、インストールするDocker認定イメージの選択に使用できるWebインタフェースがあります。一部のイメージについては、Proceed to Checkoutボタンをクリックして適用される条件に同意することや、イメージにアクセスする前に支払いが必要になることがあります。

トランザクションの完了時に、イメージはMy Content領域に格納され、後で再表示できます。

各イメージには説明と設定手順が示されています。

次の例では、Docker Hubにサインインし、イメージを調査してプルする方法を示します。

sudo podman login
sudo skopeo inspect docker://docker.io/store/oracle/database-enterprise:12.2.0.1
sudo podman pull docker.io/store/oracle/database-enterprise:12.2.0.1-slim

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

この項では、ローカルのコンテナ・レジストリ・サーバーの設定に関する情報を示します。このサーバーは、イメージのホストに使用することも、Oracle Container Registryのミラーとして使用することもできます。

このレジストリ・サーバーは、コンテナ・アプリケーションです。ホストには、Docker Hubまたはサポートが必要な場合はOracle Container Registryからレジストリ・イメージをダウンロードするためのインターネット接続が必要です。

レジストリ・サーバーでは、レジストリ・データを格納するために少なくとも15GBの使用可能なディスク領域(通常は/var/lib/registry)が必要ですが、レジストリを標準ユーザーとして実行する場合は、別のパスを選択できます。ローカル・コンテナ・レジストリ用に個別のファイル・システム(できればBtrfs形式のファイル・システム)を作成することをお薦めします。Btrfsファイル・システムを使用すると、レジストリ・ファイル・システムを簡単にスケーリングし、ファイル・システムのスナップショットなどのbtrfs機能を利用できます。

レジストリのトランスポート層セキュリティの設定

WebサーバーにTLSを使用する場合と同様に、レジストリ・ホストは、レジストリでトランスポート層セキュリティ(TLS)を有効にするために、有効なX.509証明書と秘密キーを要求します。この項では、PodmanにホストのX.509証明書と秘密キーを追加する方法について説明します。

すでにホストにX.509証明書がある場合は、同じ証明書をPodmanで使用できます。

ホストにX.509証明書がない場合は、自己署名のプライベート証明書をテスト目的で作成できます。自己署名証明書および秘密キーの作成の詳細は、『Oracle Linux: 証明書と公開キー・インフラストラクチャの管理』を参照してください。

X.509証明書の検証をテスト目的で無効にする場合は、レジストリ構成を参照してください。

次のように、PodmanでX.509証明書を使用します。

  1. ホストのX.509証明書が中間認証局(CA)によって発行されていた場合は、DockerがホストのX.509証明書を検証できるように、ホストの証明書を中間CAの証明書と組み合せて連鎖証明書を作成する必要があります。次に例を示します。

    sudo cat registry.example.com.crt intermediate-ca.pem > domain.crt
  2. /var/lib/registry/conf.dディレクトリを作成して、証明書と秘密キーを格納します。

    sudo mkdir -p /var/lib/registry/conf.d
  3. 証明書と秘密キーを/var/lib/registry/conf.dディレクトリにコピーします。

    sudo cp certfile /var/lib/registry/conf.d/domain.crt
    sudo cp keyfile /var/lib/registry/conf.d/domain.key

    コマンドで、certfileはホストのX.509証明書または連鎖した証明書へのフル・パスで、keyfileはホストの秘密キーへのフル・パスです。次に例を示します。

    sudo cp /etc/pki/tls/certs/registry.example.com.crt /var/lib/registry/conf.d/domain.crt
    sudo cp /etc/pki/tls/private/registry.example.com.key /var/lib/registry/conf.d/domain.key
  4. 秘密キーのファイル権限が正しいことを確認してください。

    sudo chmod 600 /var/lib/registry/conf.d/domain.key

レジストリの作成

この項では、コンテナ・アプリケーションとしてレジストリ・サーバーを作成する方法について説明します。レジストリ・ホストで次のステップを実行します。

Podmanレジストリ・コンテナを作成します。次に例を示します。

sudo podman run -d -p 5000:5000 --name registry --restart=always \
    -v /var/lib/registry:/registry_data \
    -e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry_data \
    -e REGISTRY_HTTP_TLS_KEY=/registry_data/conf.d/domain.key \
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/registry_data/conf.d/domain.crt \
    -e REGISTRY_AUTH="" \
    container-registry.oracle.com/os/registry:v2.7.1.1

Oracle Container Registryからレジストリ・イメージがプルされ、レジストリ・コンテナが開始されます。

--restart=alwaysオプションにより、開始時にレジストリ・コンテナを開始します。

デフォルトでは、コンテナ・サービスで使用されるポート番号は5000です。必要に応じて、コンテナ・レジストリに異なるポート番号を使用し、そのポートを5000にマップできます(例: portnumber:5000)。Podmanでのポートのマッピングの詳細は、「Podman用ネットワークの構成」を参照してください。

Oracleアカウントがなく、サポートの必要もない場合は、一般公開されているコンテナ・レジストリ・イメージ(docker.io/library/registry:latest)をかわりに使用できます。

レジストリ・ポートの設定

デフォルトでは、レジストリ・サーバーはポート5000で実行されます。OpenStack Keystoneサービスなど、同じTCPポートを使用する別のサービスを実行する場合は、ポートの競合を回避するために構成の変更が必要になります。レジストリ・サーバーへのアクセスが必要なすべてのシステムが、このポートで自由に通信できる必要があります。ポートの競合を防ぐために、ファイアウォール・ルールを調整してください。

ファイアウォールを実行している場合は、コンテナ・レジストリがリスニングするTCPポートにアクセスできることを確認します。firewalldを実行している場合は、docker-registryサービスのデフォルト・ルールを追加します。

sudo firewall-cmd --zone=public --permanent --add-service=docker-registry

レジストリをデフォルトのポートで実行しない場合は、ポートを直接指定できます。次に例を示します。

sudo firewall-cmd --zone=public --permanent --add-port=5001/tcp

X.509証明書の配布

レジストリ・ホストが自己署名X.509証明書を使用する場合は、ローカルのコンテナ・レジストリを使用する予定のすべてのホストに証明書を配布する必要があります。rootユーザーの場合、各レジストリの証明書は/etc/containers/certs.d/registry_hostname:port/に格納されます。標準ユーザーの場合、証明書は$HOME/.local/share/containers/certs.d/registry_hostname:port/に格納できます。

通常、レジストリと相互作用するPodman、BuildahおよびSkopeoのコマンドは、これらの証明書の代替の場所を指定する--cert-dirオプションもサポートしています。

ローカル・レジストリにアクセスする必要がある各ホストで、次のステップを実行します。registry_hostnameはレジストリ・ホストの名前に、portはコンテナ・レジストリ・サーバーに選択したポート番号に置き換えます(デフォルトでは5000)。

自己署名X.509証明書を配布するには:

  1. レジストリ・ホストとユーザー用に適切なcerts.dの場所を作成します。たとえば、rootユーザーの場合は、/etc/containers/certs.d/registry_hostname:portにディレクトリを作成します。

    sudo mkdir -p /etc/containers/certs.d/registry_hostname:port
  2. レジストリ・ホストからX.509証明書をコピーします。

    sudo scp root@registry_hostname:/var/lib/registry/conf.d/domain.crt \
    /etc/containers/certs.d/registry_hostname:port/ca.crt

レジストリへのイメージのインポート

コンテナ・レジストリ・サーバーの設定後に、イメージをレジストリにインポートしてコンテナのデプロイに使用できるようにします。Oracle Container Registryなどのレジストリからイメージをプルして、ローカル・レジストリにコミットできます。または、アップストリーム・イメージに基づいて独自のイメージを作成することもできます。

  1. レジストリからイメージをプルします。

    たとえば、Oracle Container Registryからイメージをプルするには、次のように入力します。

    sudo podman pull container-registry.oracle.com/os/oraclelinux:7-slim
  2. ローカル・レジストリをポイントするようにイメージにタグを付けます。次に例を示します。

    sudo podman tag container-registry.oracle.com/os/oraclelinux:7-slim localhost:portnumber/ol7image:v1

    この例では、localhostはローカル・レジストリが存在するホスト名で、portnumber(デフォルトでは5000)はレジストリがリスニングするポート番号です。レジストリとは別のホストにあるPodmanインストール環境で操作する場合は、正しいホストをポイントするようにホスト名を変更する必要があります。リポジトリとターゲットの名前(この例ではol7image:v1)は、有効なタグになるように、すべて小文字にする必要があります。

  3. ローカル・レジストリにイメージをプッシュします。次に例を示します。

    sudo podman push localhost:portnumber/ol7image:v1

独自のイメージの作成方法の詳細は、Buildahを使用したイメージの構築を参照してください。カスタマイズしたイメージをコミットしていた場合は、タグを付けてローカル・レジストリにプッシュできます。