6 Dockerレジストリの使用方法

Dockerレジストリは、Dockerイメージのストアです。Dockerイメージは読取り専用テンプレートで、Dockerコンテナを作成するために使用します。DockerレジストリはDockerイメージを格納するために使用し、Dockerイメージは必要に応じてコンテナをデプロイするために使用します。

デフォルトのDockerレジストリはDocker Hubであり、次の場所で使用可能です。

https://hub.docker.com

オラクル社は、オープン・ソース・ソフトウェアをGitHubコンテナ・レジストリで入手可能にしています。詳細は、https://github.com/oracle/docker-imagesおよびhttps://docs.github.com/en/packages/guides/about-github-container-registryを参照してください。

また、Oracle独自のDockerレジストリであるOracle Container Registryもホストしています。このレジストリには、ライセンス供与されているOracleソフトウェアとオープン・ソースのOracleソフトウェアの両方が含まれています。Oracle Container Registryは次の場所にあります。

https://container-registry.oracle.com

イメージをプルするときに複数のレジストリを構成できます。複数のレジストリの使用方法の詳細は、「コンテナ・レジストリ・オプションの設定」を参照してください。

Oracle Container RegistryにはWebインタフェースが用意されており、管理者は組織で使用するソフトウェアのイメージを選択できます。

ライセンス供与されたOracleソフトウェア・イメージを使用する場合は、まずOracle Container RegistryのWebインタフェースにログインし、ソフトウェア・イメージのOracle標準条件および制約事項に同意する必要があります。

オープン・ソース・ソフトウェア・イメージ、およびイメージに含まれるすべてのソフトウェアは、コンテナ・イメージで提供される1つ以上のオープン・ソース・ライセンスの下でライセンス供与されます。コンテナ・イメージを使用する場合は、それらのライセンスの条件に従います。

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

エンタープライズ環境では、ローカルDockerレジストリの設定を検討することをお薦めします。これにより、カスタマイズしたコンテナをイメージに変換してローカル・レジストリにコミットし、それを今後コンテナをデプロイする際に使用して、一括デプロイで必要になる構成のカスタマイズ作業を軽減できます。ローカル・レジストリでは、アップストリーム・レジストリからプルされたイメージをキャッシュおよびホストすることもできます。これにより、一致するコンテナを分散するローカル・システム全体にデプロイするときに、ネットワークのオーバーヘッドを削減し、待機時間を短縮できます。

Oracle Cloud Infrastructureのユーザーは、Oracleが管理するDockerレジストリにRegistryサービスを使用して内部のコンピュート・インスタンスにイメージを提供したり、必要に応じてインターネットでパブリック・レジストリとして公開できます。Oracle Cloud Infrastructure Registryサービスには、レジストリへのアクセスを制御できるきめ細かいポリシー・コントロールが含まれています。このサービスの使用に関する詳細なドキュメントについては、https://docs.oracle.com/iaas/Content/Registry/Concepts/registryoverview.htmを参照してください

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

この項では、Oracle Container Registryからのイメージのプルについて説明します。

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

Oracle Container Registryからイメージをプルするには:

docker pull container-registry.oracle.com/area/image[:tag]           

areaはOracle Container Registryのリポジトリの場所に、imageはソフトウェア・イメージの名前に置き換えます。必要に応じて、イメージに特定の[:tag]を指定できます。たとえば:

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

ほとんどの場合、areaimageは小文字で指定します。イメージをプルするコマンドは通常、Oracle Container RegistryのWebインタフェースのリポジトリ情報ページに用意されています。イメージとその実行方法に関するその他の有用な情報も同じページで参照できます。

Oracle Container Registry Notary for Content Trustの使用方法

Oracle Container Registryには、レジストリからプルされた署名付きイメージの検証に使用できるNotaryサービスも含まれています。このサービスは、セキュリティの強化に有効で、安全性が損なわれたイメージをインフラストラクチャで誤って実行するリスクを軽減できます。

Notaryサービスの使用は簡単で、必要なことは、Dockerコマンドを実行するユーザーのために2つの環境変数を設定することだけです。

  1. 次のようにDOCKER_CONTENT_TRUST環境変数を設定して、Docker内でContent Trustを有効にします。

    export DOCKER_CONTENT_TRUST=1

    詳細は、「Docker Content Trustの有効化または無効化」を参照してください。

  2. DOCKER_CONTENT_TRUST_SERVERをNotaryサービスを指すように設定します。この変数に指定する値にポート番号を指定することが重要です。

    export DOCKER_CONTENT_TRUST_SERVER="https://container-trust.oci.oraclecloud.com:443"
  3. 「Oracle Container Registryからのイメージのプル」の説明に従い、コンテナ・レジストリからイメージをプルして、Notaryメタデータ・キャッシュを更新します。Content Trustが正しく動作していれば、イメージのプルは正常に動作します。Notaryが使用できない場合、Dockerは署名メタデータのローカル・キャッシュにフォールバックし、警告を発行します。

    WARN[0015] Error while downloading remote metadata, using cached timestamp 
        - this might not be the latest version available remotely

    信頼されていないイメージやOracle Container Registryにホストされていないイメージをプルしようとすると、エラーが表示され、イメージをプルできません。たとえば、Content Trustが有効で、Content TrustサーバーがOracle Container Registry Notaryサービス用に構成されているdocker.ioからイメージをプルすると、次のエラーが返されます。

    Error: remote trust data does not exist for nginx: container-trust.oci.oraclecloud.com:443 
    does not have trust data for docker.io/library/nginx

ユーザーは、--disable-content-trustオプションを指定することでDockerコマンドの実行時にContent Trustを明示的に無効にすることも、単に環境変数を設定解除することもできます。同様に、--disable-content-trust=falseをオプションとしてコマンドを実行すると、環境変数設定に関係なくContent Trustを強制できます。

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

  3. Webインタフェースを使用して、Oracleソフトウェア・イメージを参照または検索します。

  4. ホスト・システムで、docker loginコマンドを使用して、Webインタフェースへのログインに使用したものと同じOracleアカウントを使用してOracle Container Registryに対する認証を行います。

    docker login container-registry.oracle.com                     

    Oracleアカウントのユーザー名およびパスワードの入力を求められます。

  5. docker Pullコマンドを使用して、必要なイメージをプルします。たとえば:

    docker pull container-registry.oracle.com/java/serverjre                     

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

    Oracleアカウントの資格証明を検証でき、Oracle標準条件および制約事項にすでに同意している場合は、イメージがOracle Container Registryからプルされてローカルに格納され、コンテナのデプロイに使用できるようになります。

  6. Oracle Container Registryからイメージをプルしたら、不正アクセスを防止するためレジストリからログアウトし、今後の操作用にDockerによって格納される可能性がある資格証明のレコードを削除することをお薦めします。

    docker logout container-registry.oracle.com                     

Oracle Container Registryミラーの使用方法

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

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

そのミラーのURLを使用して、Oracle Container Registryミラーからイメージをプルします。たとえば、シドニー・ミラーからOracle Linux 7イメージをプルするには、次を使用します。

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

ライセンス供与されているOracleソフトウェア・イメージをレジストリ・ミラーからダウンロードするには、まずOracle Container RegistryのWebインタフェースでOracle標準条件および制約事項事項に同意する必要があります。

https://container-registry.oracle.com

ライセンス供与されたOracleソフトウェア・イメージをプルするには、イメージをプルする前にOracle Container Registryミラーにログインします。たとえば:

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

サードパーティ・レジストリの使用方法

Oracle Container Runtime for Dockerでは、Docker HubやGitHubコンテナ・レジストリなどいくつかのサードパーティ・レジストリを使用できます。一部のサードパーティ・レジストリには、ライセンス供与される一部の商用Oracleソフトウェア製品のイメージが作成されています。

GitHubコンテナ・レジストリ

GitHubは、人気のあるオープンソース開発プラットフォームであり、オープン・ソース・ソフトウェア向けにOracleが推奨するリポジトリの1つです。GitHubコンテナ・レジストリは、環境で実行する必要があるコンテナのイメージをプルするために使用できる業界標準のレジストリです。

GitHubコンテナ・レジストリからイメージをプルするために認証は必要ありません。たとえば、GitHubコンテナ・レジストリからOracle Linux 8スリム・イメージをプルするには、次を使用します。

docker pull ghcr.io/oracle/oraclelinux:8-slim                

GitHubコンテナ・レジストリの詳細は、https://docs.github.com/en/packages/guides/about-github-container-registryを参照してください

Docker Hub

Docker Hubは、次の場所で使用可能です。

https://hub.docker.com

Docker Hubを参照することはできますが、そこにホストされているイメージの多くにアクセスするには、有効なDocker IDを使用してログインする必要があります。Docker IDを持っていない場合は、次の場所で登録できます。

https://hub.docker.com/signup

Docker HubにはWebインタフェースが用意されており、インストールするDocker認定イメージを選択したり、適用される可能性のある条件に同意したり、必要に応じて支払いを行うことができます。イメージに適用される条件に同意すると、イメージがMy Content領域に格納されるため、後で再び参照できます。

Docker Hubでは、このレジストリにホストされているDocker認定イメージをプルする前にログインを求められる場合があります。これにより、イメージに適用される条件に同意し、支払いが行われることになります。

Docker Hubがデフォルト・レジストリであるため、名前とタグを指定するだけでイメージをプルできます。たとえば、oraclelinux:7-slimイメージをプルするには、次のようにします。

docker pull oraclelinux:7-slim
Trying to pull repository docker.io/library/oraclelinux ... 
7-slim: Pulling from docker.io/library/oraclelinux
a61503a3b32e: Pull complete 
Digest: sha256:bb7c3969d33b3c2695b11dd705e18ed604ce0f1e3317ef293e8f0d9d125dc90a
Status: Downloaded newer image for oraclelinux:7-slim
oraclelinux:7-slim

ローカルDockerレジストリの設定

この項では、独自のイメージのホストに使用したり、Oracle Container Registryのミラーとして使用することもできる、ローカルDockerレジストリ・サーバーの設定について説明します。

Oracle Cloud Infrastructureのユーザーは、Oracleが管理するレジストリ・サービスを使用してローカルDockerレジストリの要件に対応することを検討してください。https://docs.oracle.com/iaas/Content/Registry/Concepts/registryoverview.htmを参照してください。

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

レジストリ・ファイル・システムの作成

レジストリ・サーバーには、レジストリ・データを格納するために少なくとも15GBの使用可能なディスク領域が必要です。これは通常、/var/lib/registryにあります。このためのファイル・システムを別途作成することをお薦めします。レジストリ・ファイル・システムを簡単にスケーリングしたり、スナップショット作成などのbtrfs機能を利用できるように、btrfs形式のファイル・システムを作成することをお薦めします。この項の手順では、btrfsファイル・システムの設定について詳しく説明します。デバイスには、ディスク・パーティション、LVMボリューム、ループバック・デバイス、マルチパス・デバイスまたはLUNを指定できます。

レジストリ・ファイル・システム専用の記憶域が必要な場合は、ファイル・システムを作成して/var/lib/registryにマウントします。この例では、btrfsを使用してファイル・システムをフォーマットします。

レジストリ用のbtrfsファイル・システムを作成するには:

  1. btrfs-progsパッケージに用意されているユーティリティを使用してbtrfsファイル・システムを作成します。これらはデフォルトでインストールされます。1つ以上のブロック・デバイスにbtrfsファイル・システムを作成します。

    mkfs.btrfs [-L label] block_device ...                        

    -L labelは、ファイル・システムのマウントに使用できるオプションのラベルです。

    たとえば、パーティション/dev/sdc1にファイル・システムを作成するには、次のようにします。

    sudo mkfs.btrfs -L var-lib-registry /dev/sdc1                        

    パーティションはすでに存在している必要があります。必要に応じて、fdisk (MBRパーティション)やgdisk (GPTパーティション)などのユーティリティを使用して、作成します。

    olボリューム・グループのdocker-registryという名前の論理ボリュームにファイル・システムを作成するには、次のようにします。

    sudo mkfs.btrfs -L var-lib-registry /dev/ol/docker-registry                        

    論理ボリュームはすでに存在している必要があります。必要に応じて論理ボリューム・マネージャ(LVM)を使用して作成します。

    mkfs.btrfsの使用方法の詳細は、Oracle Linux 7: ファイル・システムの管理を参照してください。

  2. btrfsファイル・システムが含まれているデバイスのUUIDを入手します。

    blkidコマンドを使用してデバイスのUUIDを表示し、次のようにこの値をノートにとっておきます。

    sudo blkid /dev/sdc1 
    /dev/sdc1: LABEL="var-lib-registry" UUID="50041443-b7c7-4675-95a3-bf3a30b96c17" \
    UUID_SUB="09de3cb1-2f9b-4bd8-8881-87e591841c75" TYPE="btrfs"

    btrfsファイル・システムが複数のデバイスにわたって作成されている場合は、任意のデバイスを指定してUUIDを入手できます。あるいは、btrfs filesystem showコマンドを使用してUUIDを確認することもできます。論理ボリュームの場合は、デバイスとして論理ボリュームへのパスを指定します(例: /dev/ol/docker-registry)。UUID_SUB値が表示された場合は無視します。

  3. /etc/fstabファイルを編集し、システムの起動時にファイル・システムがマウントされるようにするためのエントリを追加します。

    UUID=UUID_value /var/lib/registry  btrfs  defaults  0 0

    UUID_valueを前のステップで入手したUUIDに置き換えます。btrfsファイル・システムのラベルを作成した場合は、UUIDのかわりにそのラベルを使用することもできます。次に例を示します。

    LABEL=label /var/lib/registry  btrfs  defaults  0 0
  4. /var/lib/registryディレクトリを作成します。

    sudo mkdir /var/lib/registry                        
  5. /etc/fstabにリストされているすべてのファイル・システムをマウントします。

    sudo mount -a                        
  6. ファイル・システムがマウントされていることを確認します。

    df
    Filesystem     1K-blocks    Used Available Use% Mounted on
    ...
    /dev/sdc1            ...    ...  ...       1%   /var/lib/registry

DockerレジストリのTransport Layer Securityの設定

レジストリ・ホストでは、レジストリでTransport Layer Security (TLS)を有効にする場合、WebサーバーにTLSを使用する場合と同様に、有効なX.509証明書と秘密キーが必要です。この項では、ホストのX.509証明書および秘密キーをDockerに追加する方法について説明します。

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

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

テスト目的でX.509証明書の検証を無効にする必要がある場合は、「コンテナ・レジストリ・オプションの設定」を参照してください。

DockerでX.509証明書を使用するには:

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

    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                        

レジストリの作成

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

Dockerレジストリ・コンテナを作成します。たとえば:

docker 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:latest           

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

--restart=alwaysオプション内で処理されないオプションは、Dockerが起動するときにレジストリ・コンテナを起動します。

必要に応じて、使用するポート番号と一致するように前述のコマンドの5000を変更することで、Dockerレジストリの代替ポート番号をマップできます。

Oracleアカウントを保有せず、サポートを必要としない場合は、かわりにlibrary/registry:latestで公開されているDockerレジストリ・イメージを使用できます。

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

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

ファイアウォールを実行している場合は、Dockerレジストリでリスニングする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証明書を使用する場合は、ローカルDockerレジストリを使用するデプロイメント内のすべてのホストに証明書を配布する必要があります。

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

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

  1. /etc/docker/certs.d/registry_hostname:portディレクトリを作成します。

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

    scp root@registry_hostname:/var/lib/registry/conf.d/domain.crt \
    /etc/docker/certs.d/registry_hostname:port/ca.crt
  3. dockerサービスを再起動します。

    sudo systemctl restart docker.service                        

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

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

イメージをローカルDockerレジストリにインポートするには:

  1. レジストリからイメージをプルします。たとえば、Oracle Container Registryからイメージをプルできます。

    docker pull container-registry.oracle.com/os/oraclelinux:latest                        
  2. ローカル・レジストリを指すようにイメージをタグ付けします。たとえば:

    docker tag container-registry.oracle.com/os/oraclelinux:latest localhost:5000/ol7image:v1

    この例では、localhostはローカル・レジストリが存在するホスト名です。また、5000はレジストリがリスニングするポート番号です。レジストリとは異なるホストにあるDocker Engineで作業している場合は、その正しいホストを指すようにホスト名を変更する必要があります。リポジトリとターゲットの名前(この例ではol7image:v1)は、有効なタグになるように、すべて小文字にする必要があります。

  3. イメージをローカル・レジストリにプッシュします。たとえば:

    docker push localhost:5000/ol7image:v1

独自のイメージの作成方法の詳細は、「既存コンテナからのDockerイメージの作成」「DockerfileからのDockerイメージの作成」を参照してください。カスタマイズしたイメージをコミットしたら、前述のステップに示すように、それをタグ付けしてローカル・レジストリにプッシュできます。