Docker Hub のレート制限を受けないように mirror.gcr.io を使う
概要
Docker Hub のレート制限 が2020/11/01から施行されるようになったらしい。
- Free plan – anonymous users: 100 pulls per 6 hours
- Free plan – authenticated users: 200 pulls per 6 hours
- Pro plan – unlimited
- Team plan – unlimited
レート制限は Docker Hub からコンテナイメージをダウンロードするクライアント側のグローバル IP アドレスに対して適用されるようなので、同一の IP を使いまわしているオフィスなどでは致命的な状況になることが推測できる。 その制限を回避する方法の一つを紹介する。
回避方法
下記のような対応方法が考えられる。
- Docker Hub の有料プランを契約し、各サーバもしくは手元の開発環境で認証情報を利用してダウンロードする。
- 自前でコンテナイメージレジストリをホスティングし、そこを参照するように構成する。
- ダウンロード元のパブリックIPを分散するために、プロキシを自前で構成する。
- ミラーレポジトリ mirror.gcr.io を利用する。
それぞれにメリットとデメリットが存在するが、今回は追加の金銭的コストが発生しない 「ミラーレポジトリ mirror.gcr.io を利用する」 方法を紹介する。
この方法には他にもメリットがあり、 既存のアプリケーション周辺の設定(Dockerfile, CI/CD設定) を変更することなく、 Dockerを実行する環境(サーバ, 手元の開発環境)の設定だけを変えれば対応できるため、 比較的簡単に導入できると思っている。
ミラーリポジトリ mirror.gcr.io を利用するための設定
Linux(Ubuntu) の場合
/etc/docker/daemon.json
に mirror.gcr.io を使うような設定を行い、
docker デーモンを再起動すればよい。
/etc/docker/daemon.json
{
"registry-mirrors": ["https://mirror.gcr.io"]
}
上記のファイルを編集した上で、docker デーモンを再起動する。
$ sudo systemctl restart docker
Docker for Mac の場合
macOS の場合も基本的には上述の Linux(Ubuntu) と同じ。
macOS の画面の上部のツールバーに表示されている Docker のアイコンをクリックし、
Preference
→ Docker Engine
と辿り、
下図のように "registry-mirrors": ["https://mirror.gcr.io"]
を追加し、
Apply & Restart
を行えば良い。

確認方法
$ tcpdump -nni en0 host $(dig mirror.gcr.io +short | head -n 1)
実際に mirror.gcr.io 経由でダウンロードが行われているかどうかは ↑のコマンドを打った状態で、別のターミナルで↓を打つ。
$ docker pull library/busybox
このとき、パケットが表示されれば mirror.gcr.io を利用していることを示している。