この記事では、Azure コンテナー レジストリなどのローカル レジストリを使用して、Docker Hub のコンテナー イメージなどのパブリック コンテンツのコピーを管理するための手法とワークフローについて概説します。
パブリック コンテンツに関するリスク
お使いの環境が、パブリック コンテナー イメージ、Helm チャート、Open Policy Agent (OPA) ポリシー、その他の成果物などのパブリック コンテンツに依存している場合があります。 たとえば、Docker Hub や別のパブリック レジストリから直接イメージをプルして、 またはサービス ルーティングのための docker build FROM alpine
を実行する場合があります。
適切な制御なしでパブリック レジストリ コンテンツに依存すると、イメージの開発とデプロイのワークフローにリスクが生じる可能性があります。 リスクを軽減するには、できるだけパブリック コンテンツのローカル コピーを保持するようにします。 詳細については、Open Container Initiative のブログを参照してください。
Docker Hub を使用して認証する
現在、ビルドまたはデプロイのワークフローの一環として Docker Hub からパブリック イメージをプルしている場合、匿名のプル要求を行うのではなく、Docker Hub アカウントを使用して認証することをお勧めします。
匿名のプル要求を頻繁に行うと、ERROR: toomanyrequests: Too Many Requests.
や You have reached your pull rate limit.
のような Docker エラーが発生することがあります。このようなエラーを防ぐには、Docker Hub に対して認証を行います。
注意
2020 年 11 月 2 日以降、Docker 無料プラン アカウントからの Docker Hub に対する匿名および認証済みの要求にはダウンロード レート制限が適用されます。 これらの制限は、IP アドレスと Docker ID によってそれぞれ適用されます。
プル要求の数を見積もるには、クラウド プロバイダー サービスを使用する際や、企業の NAT の内側で作業する際に、複数のユーザーが IP アドレスのサブセットとして Docker Hub に示されることに留意してください。 Docker 有料アカウントの認証を、Docker Hub に対して行われる要求に追加すれば、レート制限の調整が原因でサービスが中断される可能性がなくなります。
詳細については、「Docker の価格とサブスクリプション」および「Docker のサービス使用条件」を参照してください。
Docker Hub のアクセス トークン
Docker Hub では、Docker Hub に対する認証時に Docker パスワードの代替手段として個人用アクセス トークンがサポートされます。 Docker Hub からイメージをプルする自動化されたサービスには、トークンをお勧めします。 異なるユーザーまたはサービス用に複数のトークンを生成でき、不要になったときはトークンを取り消すことができます。
トークンを使用して docker login
によって認証するには、コマンド ラインでパスワードを省略します。 パスワードの入力を求められたら、代わりにトークンを入力します。 Docker Hub アカウントで 2 要素認証を有効にした場合は、Docker CLI からログインするときに個人用アクセス トークンを使用する必要があります。
Azure サービスから認証する
App Service や Azure Container Instances を含むいくつかの Azure サービスでは、コンテナーのデプロイのために Docker Hub などのパブリック レジストリからイメージをプルすることがサポートされています。 Docker Hub からのイメージをデプロイする必要がある場合は、Docker Hub アカウントを使用して認証を行うように設定を構成することをお勧めします。 例 :
App Service
- イメージのソース: Docker Hub
- リポジトリ アクセス: プライベート
- ログイン: <Docker Hub のユーザー名>
- パスワード: <Docker Hub のトークン>
詳細については、「App Service での Docker Hub の認証されたプル」を参照してください。
Azure Container Instances
- イメージのソース: Docker Hub またはその他のレジストリ
- イメージの種類: プライベート
- イメージ レジストリのログイン サーバー: docker.io
- イメージ レジストリのユーザー名: <Docker Hub のユーザー名>
- イメージ レジストリのパスワード: <Docker Hub のトークン>
- イメージ: docker.io/<リポジトリ名>:<タグ>
パブリック コンテンツを使用するようにアーティファクト キャッシュを構成する
パブリック コンテンツの使用に関するベスト プラクティスは、レジストリ認証とアーティファクト キャッシュ機能を組み合わせることです。 プライベート ネットワークであっても、アーティファクト キャッシュを使ってコンテナー成果物を Azure Container Registry にキャッシュします。 アーティファクト キャッシュを使うと、レジストリのレート制限から保護されるだけでなく、geo レプリケートされた ACR と組み合わせて Azure リソースに最も近いリージョンから成果物をプルするときに、プルの信頼性が大幅に向上します。 さらに、プライベート ネットワーク、ファイアウォール構成、サービス プリンシパルなど、ACR が提供するすべてのセキュリティ機能を使うことができます。 ACR アーティファクト キャッシュとともにパブリック コンテンツを使用することの詳細については、アーティファクト キャッシュのチュートリアルを参照してください。
Azure コンテナー レジストリにイメージをインポートする
パブリック イメージのコピーを管理するには、Azure コンテナー レジストリを作成します (まだない場合)。 レジストリを作成するには、Azure CLI、Azure portal、Azure PowerShell、またはその他のツールを使用します。
推奨されている 1 回限りの手順として、基本イメージとその他のパブリック コンテンツを Azure コンテナー レジストリにインポートしてください。 Azure CLI の az acr import コマンドは、Docker Hub や Microsoft Container Registry などのパブリック レジストリ、およびプライベート コンテナー レジストリからのイメージのインポートをサポートしています。
az acr import
では、Docker のローカル インストールは不要です。 Azure CLI のローカル インストールを使用するか、Azure Cloud Shell 内で直接実行できます。 任意の種類の OS のイメージ、マルチアーキテクチャ イメージ、または Helm チャートなどの OCI 成果物がサポートされています。
組織のニーズに応じて、専用レジストリか、または共有レジストリ内のリポジトリにインポートできます。
az acr import \
--name myregistry \
--source docker.io/library/hello-world:latest \
--image hello-world:latest \
--username <Docker Hub username> \
--password <Docker Hub token>
イメージ参照を更新する
アプリケーション イメージの開発者は、そのコードが、自分の制御下にあるローカル コンテンツを参照していることを確認する必要があります。
- プライベート レジストリを使用するようにイメージ参照を更新します。 たとえば、Dockerfile の
FROM baseimage:v1
ステートメントを、DNL対応でないレジストリにはFROM myregistry.azurecr.io/mybaseimage:v1
に更新し、DNL対応レジストリにはFROM myregistry-abc123.azurecr.io/mybaseimage:v1
に更新します。 レジストリの作成中の DNL オプションと DNS 名への影響の詳細については、「 クイック スタート - ポータルでのレジストリの作成」を参照してください。 - プライベート レジストリを使用するように資格情報または認証メカニズムを構成します。 正しいメカニズムは、レジストリのアクセスに使用するツールと、ユーザー アクセスの管理方法によって変わります。
アプリケーション イメージの更新を自動化する
基本イメージの更新時にアプリケーション イメージのビルドが自動的に行われるようにするには、Azure Container Registry タスクを設定します。 この方法は、イメージのインポートの拡張です。 自動化されたビルド タスクでは、基本イメージの更新とソース コードの更新の両方を追跡できます。
詳しい例については、「Azure Container Registry タスクを使用してパブリック コンテンツを使用および保守する方法」を参照してください。
注意
タスクを 1 つ事前に構成しておくと、依存する基本イメージを参照するすべてのアプリケーション イメージを自動的にリビルドできます。
次のステップ
- Azure でコンテナー イメージをビルド、実行、プッシュ、修正する ACR タスクの詳細について学習します。
- 環境に合わせて基本イメージを更新するための自動化されたゲート ワークフローについては、「Azure Container Registry タスクを使用してパブリック コンテンツを使用および保守する方法」を参照してください。
- イメージのビルドと更新を自動化するその他の例については、ACR タスクのチュートリアルを参照してください。