スクエニ ITエンジニア ブログ

コンテナ用プライベートレジストリのキャッシュを簡単構築

スクウェア・エニックスで多分サーバーエンジニアと呼ばれるお仕事をしているBです。 オンプレミス環境でDockerやPodmanのコンテナを利用していると、プライベートレジストリを建てる必要性が出てくる場合があります。 そして、プライベートレジストリを建てると今度は安定した稼働のために、ミラーレジストリ的な何かを建てたくなるかと思います。

今回は、完全なミラーレジストリとはいきませんが、キャッシュレジストリを簡単に建てる方法をご紹介します。

キャッシュレジストリに何を使用するか

レジストリを簡単に建てる方法として、Docker Registry があります。 本当に簡単で、最低限の設定であれば次のコマンドでサービスを立ち上げることができます。

$ docker run -d -p 5000:5000 --name registry registry

このDocker Registryはキャッシュ機能も備わっています。 Mirroring Docker Hub のページを見ると、 次のように設定すれば良いと書いてあります。

Configure the cache

To configure a Registry to run as a pull through cache, the addition of a proxy section is required to the config file. To access private images on the Docker Hub, a username and password can be supplied.

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

一見すると、ページ名と見出しの通り、Docker Hubに対してのみ働くキャッシュ機能のようですが、実はその他のレジストリに対しても認証含めて問題なく機能します。 (この機能があまり知られていないようなので、今回この記事を書いています。)

キャッシュレジストリを構築する

proxy の設定を追加して、Docker Registryを立ち上げます。 この設定は環境変数でも設定可能なので、先ほどのコマンドにオプションを増やすだけで完了です。

$ docker run -d -p 5000:5000 --name registry \
  -e REGISTRY_PROXY_REMOTEURL="https://ORIGINAL_REGISTRY_HOST" \
  -e REGISTRY_PROXY_USERNAME="ORIGINAL_REGISTRY_USERNAME" \
  -e REGISTRY_PROXY_PASSWORD="ORIGINAL_REGISTRY_PASSWORD" \
  registry

※ 今回は簡単のため、キャッシュレジストリ自体に対する認証やTLSの設定は省略しています。
ORIGINAL_REGISTRY_HOST/USERNAME/PASSWORD はプライベートレジストリの情報に置き換えてください。
※ 認証不要の場合は、ORIGINAL_REGISTRY_USERNAME/PASSWORD の環境変数設定は消してください。

クライアントにキャッシュレジストリ参照させる

キャッシュレジストリを使用するクライアント (= コンテナホスト) にも、キャッシュレジストリを参照するための設定追加が必要になります。

Dockerの場合は、次の内容を記述した設定ファイル /etc/docker/daemon.json を用意して、Dockerデーモンを再起動してください。 DockerHubに加えて、キャッシュレジストリがデフォルト (コンテナイメージのパスからレジストリ指定部分を省略した際) で参照されるようになります。

{
  "registry-mirrors": ["http://CACHE_REGISTRY_HOST:5000"]
}

CACHE_REGISTRY_HOST はキャッシュレジストリの情報に置き換えてください。

Podmanの場合は、次の内容を設定ファイル /etc/containers/registries.conf に追記してください。 再起動等は必要ありません。 この設定内容では、コンテナイメージのパスに対して prefix が合致する場合のみ、キャッシュレジストリ (正常に接続できない場合は、プライベートレジストリ本体) に接続させます。

[[registry]]
prefix = "ORIGINAL_REGISTRY_HOST"
location = "ORIGINAL_REGISTRY_HOST"

[[registry.mirror]]
location = "CACHE_REGISTRY_HOST:5000"
insecure = true

以上で、DockerでもPodmanでも、キャッシュレジストリが使用できるようになります。 大本のプライベートレジストリ上のコンテナイメージを (Dockerの場合はレジストリ指定部分を省略した形で) 指定した場合に、キャッシュレジストリからコンテナイメージが取得されるはずです。

キャッシュレジストリにコンテナイメージがキャッシュされたかどうかは、次のコマンドでAPIを叩くことで確認することができます。 キャッシュに成功していれば、そのコンテナイメージ名がレスポンスに含まれています。

$ curl http://CACHE_REGISTRY_HOST:5000/v2/_catalog
{"repositories":["example1","example2"]}

まとめ

Docker Registryを使用して、プライベートレジストリのキャッシュレジストリを構築する方法をご紹介しました。 今回はキャッシュレジストリ側もクライアント側も最も単純な設定のみに絞って書いていますが、他にも設定項目はあります。 確認してみてください。

最後に、コンテナは非常に便利ですが、それを動作させる環境には悩みの種が尽きません。 皆様の安定したコンテナライフに、この記事が多少なりともお役に立てれば幸いです。

この記事を書いた人

記事一覧
SQUARE ENIXでは一緒に働く仲間を募集しています!
興味をお持ちいただけたら、ぜひ採用情報ページもご覧下さい!