使用量ベースの制限への移行を継続すると、2020 年 11 月 2 日から、Docker サブスクリプションの各レベルでコンテナー イメージの Docker プルの新しい レート制限 がお客様に表示されます。
匿名の無料ユーザーは6時間あたり100プルに制限され、認証された無料ユーザーは6時間あたり200プルに制限されます。 Docker Pro および Team サブスクライバーは、数量が過剰または乱用でない限り、制限なしに Docker Hub からコンテナー イメージをプルできます。 Docker Pro と Team のサブスクライバーは、24 時間で最大 50,000 回のプルを Docker Hub からコンテナー イメージをプルできます。
この記事では、いくつかのコマンドラインツールを使用して、現在レート制限ポリシー内のどこに当てはまるかを判断する方法について説明します。
現在のレート制限の決定
Docker Hub へのリクエストでは、制限にカウントされるリクエストの応答ヘッダーにレート制限情報が含まれるようになりました。 これらの名前は次のように付けられます。
レート制限-制限
レート制限-残り
ヘッダーには RateLimit-Limit
、6 時間以内に実行できるプルの合計数が含まれています。 ヘッダーには RateLimit-Remaining
、6 時間のローリング ウィンドウの残りのプル数が含まれています。
ターミナルを使用してこれらのヘッダーを見てみましょう。 ただし、Docker Hub に要求を行う前に、ベアラー トークンを取得する必要があります。 次に、curl を使用して特定の画像に要求を行うときに、このベアラートークンを使用します。
匿名の要求
まず、匿名リクエストの制限を見つけることを見てみましょう。
次のコマンドは、ratelimitpreview/テスト・イメージの認証トークンを auth.docker.io 要求し、そのトークンを という名前の TOKEN
環境変数に保存します。 認証されたリクエストの場合のようにユーザー名とパスワードを渡さないことに気付くでしょう。
$ TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq -r .token)
TOKEN
これで、 をデコードして、中身を確認できます。これを行うには、 jwt ツールを使用します。 にあるオンラインツールに貼り付け TOKEN
ることもできます jwt.io
$ jwt decode $TOKEN
Token header
------------
{
"typ": "JWT",
"alg": "RS256"
}
Token claims
------------
{
"access": [
{
"actions": [
"pull"
],
"name": "ratelimitpreview/test",
"parameters": {
"pull_limit": "100",
"pull_limit_interval": "21600"
},
"type": "repository"
}
],
...
}
Token header
セクションの下に、 と pull_limit
pull_limit_interval
が表示されます。これらの値は、匿名ユーザーとしてのユーザーと、要求されているイメージに関連しています。 上記の例では、が pull_limit
100に設定され、が pull_limit_interval
制限の秒数である21600に設定されていることがわかります。
次に、テスト画像をリクエストし、 ratelimitpreview/test
上からを渡 TOKEN
します。
$ curl --head -H "Authorization: Bearer $TOKEN" https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest 2>&1 | grep RateLimit
< RateLimit-Limit: 100;w=21600
< RateLimit-Remaining: 96;w=21600
出力は、JWTの出力で見たように、 RateLimit-Limit
6時間ごとに100プルに設定されていることを示しています。 また RateLimit-Remaining
、この値は、6時間のローリングウィンドウで残りのプルが96個あることを示していることがわかります。 この同じ curl コマンドを複数回実行すると、 RateLimit-Remaining
値が減少します。
認証された要求
認証されたリクエストの場合は、認証されたトークンに更新する必要があります。 以下のコマンドで、必ず Docker ID とパスワードに置き換え username:password
てください。
$ TOKEN=$(curl --user 'username:password' "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq -r .token)
以下は、取得したばかりのデコードされたトークンです。
$ jwt decode $TOKEN
Token header
------------
{
"typ": "JWT",
"alg": "RS256"
}
Token claims
------------
{
"access": [
{
"actions": [
"pull"
],
"name": "ratelimitpreview/test",
"parameters": {
"pull_limit": "200",
"pull_limit_interval": "21600"
},
"type": "repository"
}
],
...
}
認証されたJWTには匿名JWTと同じフィールドが含まれていますが、 pull_limit
値は認証された空きユーザーの制限である200に設定されています。
認証されたトークンを使用してイメージをリクエスト ratelimitpreview/test
しましょう。
$ curl --head -H "Authorization: Bearer $TOKEN" https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest 2>&1 | grep RateLimit
< RateLimit-Limit: 200;w=21600
< RateLimit-Remaining: 176;w=21600
値は RateLimit-Limit
6 時間あたり 200 に上昇し、残りのプルは次の 6 時間で 176 であることがわかります。 匿名要求の場合と同様に、この同じ curl コマンドを複数回実行すると、 RateLimit-Remaining
値が減少します。
エラー メッセージ
Docker のプル レート制限に達すると、結果の応答には http 状態コード 429 が含まれ、次のメッセージが含まれます。
HTTP/1.1 429 Too Many Requests
Cache-Control: no-cache
Connection: close
Content-Type: application/json
{
"errors": [{
"code": "TOOMANYREQUESTS",
"message": "You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit"
}]
}
結論
この記事では、認証されたユーザーか匿名ユーザーかに基づいて、許可されるイメージプルの数を決定する方法について説明しました。 匿名の無料ユーザーは6時間あたり100プルに制限され、認証された無料ユーザーは6時間あたり200プルに制限されます。 レート制限を完全に回避したい場合は、ProまたはTeamサブスクリプションを購入またはアップグレードできます:サブスクリプションの詳細とアップグレード情報は https://docker.com/pricing で入手できます。
詳細と一般的な質問については、 ドキュメントページ と FAQをお読みください。 そしていつものように、Twitter(@docker)または直接私(@pmckee)でお気軽にご連絡ください。
Docker の使用を開始するには、無料の Docker アカウントに サインアップして、 スタート ガイドをご覧ください。