ダウンロードレート制限
読む時間の目安: 3 分
Docker では Docker Hub 上でのプルリクエストに対して、ダウンロードレート制限を有効化してきました。 この制限はアカウントの種類により決定されます。 詳しくは リソース消費 FAQ や Docker 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 に示されている手順に従ってください。
サードパーティー製のプラットフォーム
サードパーティー製のプラットフォームを利用している場合は、各プロバイダーから提供される、レジストリ認証を利用する手順に従ってください。
- Artifactory
- AWS CodeBuild
- AWS ECS/Fargate
- Azure Pipelines
- CircleCI
- Codefresh
- Drone.io
- GitLab
- LayerCI
- TeamCity
その他の制限
Docker Hub ではアプリケーションやインフラストラクチャーを保護するために、ダウンロードレートの総量制限があります。 この制限は Hub に対するリクエストすべてに適用されるものであり、ウェブページ、API、イメージプルなどを含みます。 制限は IP アドレスごとに行われ、負荷状況などにより時間とともに変化しますが、1 分あたり数千個のリクエスト相当のものです。 レートの総量制限は、アカウントのレベルに関係なく、全ユーザーに等しく適用されます。
この制限が適用されたかどうかは、エラーコードを見ればわかります。
総量制限が適用された場合、単純に429 Too Many Requests
レスポンスが返されます。
プル処理時に発生する制限の場合は、もっと長いエラーメッセージが示され、その中には本ページへのリンクが示されます。