現在の Docker プルレートの制限とステータスの確認

使用量ベースの制限への移行を継続すると、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 アカウントに サインアップして、 スタート ガイドをご覧ください。