Docker Hub のミラーリング

使用例

皆さんの環境に、複数の Docker を動かすインスタンスがあると仮定します(例:Docker デーモンが複数の物理マシンあるいは仮想マシン上で動作)。イメージを使おうにも、どちらも毎回パブリックな Docker レジストリ(Docker Hub)から取得しなくてはいけません。ローカルにレジストリのミラーを設置することで、ローカルネットワーク上でイメージ取得により発生するトラフィックを抑制できるでしょう。

あるいは

あるいは、頻繁に使うイメージ群がありませんでしょうか。単純にそれをローカル上のプライベートなレジストリから取得することも可能です。

それ以外にも、イメージは Docker Hub にあるものではなく、全てが自家製の場合もあるでしょう。そのような場合、単純にローカルにあるレジストリでイメージを管理したいと思いませんか。これが最も簡単なシナリオです。

捕捉

現時点では、特定のプライベート・レジストリをミラーする機能がありません。Docker Hub のみミラー可能です。

解決策

レジストリは pull (イメージの取得)時、キャッシュするように設定可能です。このモードでは Registry は通常の全ての docker pull に応答し、全てのイメージをローカルに保管します。

どうしますか?

ローカルのレジストリ・ミラーに対して初めてイメージのリクエストがあると、Registry はパブリック Docker レジストリ(Docker Hub)からイメージを取得し、ローカルに保管した後、そのイメージを返します。引き続きリクエストがあれば、ローカルのレジストリ・ミラーは自分自身の保存領域からイメージのデータを提供します。

Docker Hub のイメージ内容が変わったら?

イメージの pull 時にタグを付けると、Registry はリモートの Docker Hub 上の最新版と内容が一致するかどうか確認します。もし一致しなければ、最新版の内容を取得し、ローカルにキャッシュします。

ディスクはどうですか?

利用頻度が高い環境では、古いデータがキャッシュとして残り続けるかもしれません。Registry にキャッシュしているデータを取得して利用している場合、ディスク容量を節約するため、定期的に古いデータを削除したほうが良いでしょう。キャッシュしているデータを消したとしても、またリクエストがあればリモートから取得し、再度キャッシュ化します。

Registry のベストなパフォーマンスやキャッシュの正常性を確保するには、ストレージに filesystem ドライバを使うべきでしょう。

Registry のキャッシュを通して実行する

Registry を通してキャッシュしたイメージを取得できるようにするには、公式 Registry イメージを実行する方法が最も簡単です。

おなじバックエンド上に複数の Registry キャッシュをデプロイ可能です。1つめの Registry はリクエストを処理するだけでデータを取得しません。他の Registry のキャッシュ・クラスタが適切にデータを取り扱います。

キャッシュの設定

Registry が取得(pull)する時、キャッシュを通すように設定します。設定ファイルに proxy セクションを追加する必要があります。

Docker Hub のプライベート・イメージにアクセスが必要であれば、ユーザ名とパスワードも指定できます。

proxy:
  remoteurl: https://registry-1.docker.io
  username: [username]
  password: [password]

警告

ユーザ名とパスワードを指定するときは、プライベート・リソースに対する理解が非常に重要です。ユーザはあなたのミラーを通して Docker Hub のイメージにアクセス可能になります。そのため、リソースの非公開を保つために、ミラーに認証を取り入れるなど、安全を保つことが非常に重要です。

Docker デーモン・オプションの設定

Docker デーモンの起動時に --registry-mirror オプションを指定する必要があります。

docker --registry-mirror=https://<my-docker-mirror-host> daemon

例えば、 http://10.0.0.2:5000 をミラーとして使いたい場合は、次のように実行します。

docker --registry-mirror=https://10.0.0.2:5000 daemon

注釈

どのようにセットアップするかは、ローカルホスト上の設定に依存します。環境によっては /etc/default/dockerDOCKER_OPTS 環境変数に --registry-mirror を追加します。

参考

Registry as a pull through

https://docs.docker.com/registry/nginx/