ダウンロードレート制限

読む時間の目安: 3 分

Docker では Docker Hub 上でのプルリクエストに対して、ダウンロードレート制限を有効化してきました。 この制限はアカウントの種類により決定されます。 詳しくは リソース消費 FAQDocker Hub Pricing を参照してください。

ユーザーへの制限というのは、個人アカウントやこれが所属する組織に対しての、最大限の資格を意味します。 これを利用するためには Docker Hub に対して、認証されたユーザーとしてログインしなければなりません。 プルリクエストの認証方法 を参照してください。 認証されていない(匿名)ユーザーは、IP を通じて制限が課せられます。

  • プルリクエストとは、Registry マニフェスト URL(/v2/*/manifests/*)において、最大 2 つの GET リクエストとして定義されています。
  • 通常のイメージプルは、単一のマニフェストリクエストを行います。
  • マルチアーキテクチャーイメージに対するプルリクエストは、2 つのマニフェストリクエストを行います。
  • HEAD リクエストは数に含めません。
  • 制限は、プルを行うユーザーに対して適用されます。 プルされたイメージやその所有者に対して適用されるものではありません。

Docker においてこのレート制限は 2020 年 11 月 2 日から徐々に導入していきます。

How do I know my pull requests are being limited

When you issue a pull request and you are over the limit for your account type, Docker Hub will return a 429 response code with the following body when the manifest is requested:

You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limits

You will see this error message in the Docker CLI or in the Docker Engine logs.

How can I check my current rate

Valid manifest API requests to Hub will usually include the following rate limit headers in the response:

RateLimit-Limit
RateLimit-Remaining

These headers will be returned on both GET and HEAD requests. Note that using GET emulates a real pull and will count towards the limit; using HEAD will not, so we will use it in this example. To check your limits, you will need curl, grep, and jq installed.

To get a token anonymously (if you are pulling anonymously):

$ TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq -r .token)

To get a token with a user account (if you are authenticating your pulls) - don’t forget to insert your username and password in the following command:

$ TOKEN=$(curl --user 'username:password' "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq -r .token)

Then to get the headers showing your limits, run the following:

$ curl --head -H "Authorization: Bearer $TOKEN" https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest

Which should return headers including these:

RateLimit-Limit: 100;w=21600
RateLimit-Remaining: 76;w=21600

This means my limit is 100 per 21600 seconds (6 hours), and I have 76 pulls remaining.

Remember that these headers are best-effort and there will be small variations.

I don’t see any RateLimit headers

If you do not see these headers, that means pulling that image would not count towards pull limits. This could be because you are authenticated with a user associated with a Legacy/Pro/Team Docker Hub account, or because the image or your IP is unlimited in partnership with a publisher, provider, or open source organization.

プルリクエストの認証方法

以下の節では、Docker Hub にログインして、プルリクエストを認証する方法を説明します。

Docker Desktop

Docker Desktop を利用している場合、Docker Desktop メニューから Docker Hub にログインすることができます。

Docker Desktop メニューから Sign in / Create Docker ID をクリックして、画面内の指示に従って、サインイン操作を完了させます。

Docker Engine

Docker Engine のスタンドアロン版を利用している場合は、ターミナル画面から docker login コマンドを実行して Docker Hub の認証を取得します。 このコマンドの使い方については docker login を参照してください。

Docker Swarm

Docker Swarm を実行している場合、Docker Hub における認証を得るためには -- with-registry-auth フラグを用いる必要があります。 詳しくは docker service create を参照してください。 Docker Compose ファイルを使ってアプリケーションをデプロイしている場合は docker stack deploy を参照してください。

GitHub Action

GitHub の Action を利用して、Docker Hub における Docker イメージのビルドとプッシュを行っている場合は、login action を参照してください。 これとは別の Action を利用している場合、認証と同じようにユーザー名とアクセストークンを追加する必要があります。

Kubernetes

Kubernetes を実行している場合、認証に関する情報は Pull an Image from a Private Registry に示されている手順に従ってください。

サードパーティー製のプラットフォーム

サードパーティー製のプラットフォームを利用している場合は、各プロバイダーから提供される、レジストリ認証を利用する手順に従ってください。

その他の制限

Docker Hub ではアプリケーションやインフラストラクチャーを保護するために、ダウンロードレートの総量制限があります。 この制限は Hub に対するリクエストすべてに適用されるものであり、ウェブページ、API、イメージプルなどを含みます。 制限は IP アドレスごとに行われ、負荷状況などにより時間とともに変化しますが、1 分あたり数千個のリクエスト相当のものです。 レートの総量制限は、アカウントのレベルに関係なく、全ユーザーに等しく適用されます。

この制限が適用されたかどうかは、エラーコードを見ればわかります。 総量制限が適用された場合、単純に429 Too Many Requestsレスポンスが返されます。 プル処理時に発生する制限の場合は、もっと長いエラーメッセージが示され、その中には本ページへのリンクが示されます。

Docker, pull requests, download, limit