EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

Docker Registryのクリーンアップ

イートスマートでは、Dockerイメージを管理するため、ローカルネットワークにDocker Registoryを運用しています。 2018年にすべてのアプリケーションをDockerに移行してから約2年が経過し、ストレージの使用量が増加してきました。 今回は、Docker Registryのクリーンアップを行い、ストレージの使用量を減らしてみます。

GCを実行する

docs.docker.com

公式の手順を試してみます。 まずコンテナの起動時に環境変数を指定します。 この設定を行わないと、GCを実行してもファイルが削除されません。

docker run -d \
  --name docker-registry \
  --env="REGISTRY_STORAGE_DELETE_ENABLED=true" \
  registry

次に、config.ymlという設定ファイルを作成します。

version: 0.1
storage:
filesystem:
    rootdirectory: /var/lib/registry

コンテナに入りGCを実行すると、ログが出力されました。

# bin/registry garbage-collect config.yml
~省略~
INFO[0285] Deleting blob: /docker/registry/v2/blobs/sha256/04/049cadc74ece94005779f2024778d22dbb5d1180687769064a4675a0ac187fb9  go.version=go1.7.6 instance.id=e19746de-8a11-4859-8153-b2fa478200d9
blob eligible for deletion: sha256:053d5ff01a9ecdac9fbaf666e0e609dfb1c1b8ec1c06c7f30d2b632b5cafec5a
INFO[0285] Deleting blob: /docker/registry/v2/blobs/sha256/05/053d5ff01a9ecdac9fbaf666e0e609dfb1c1b8ec1c06c7f30d2b632b5cafec5a  go.version=go1.7.6 instance.id=e19746de-8a11-4859-8153-b2fa478200d9
blob eligible for deletion: sha256:445837ba62b8da8508fadcfddb51b0e8391ddbfce89bcb860bae02b2ffe43576
INFO[0286] Deleting blob: /docker/registry/v2/blobs/sha256/44/445837ba62b8da8508fadcfddb51b0e8391ddbfce89bcb860bae02b2ffe43576  go.version=go1.7.6 instance.id=e19746de-8a11-4859-8153-b2fa478200d9
blob eligible for deletion: sha256:815b9554bd27a47bef3a23d81341925830d4fd69b9e79c117592f3ed0ff9aa24
INFO[0286] Deleting blob: /docker/registry/v2/blobs/sha256/81/815b9554bd27a47bef3a23d81341925830d4fd69b9e79c117592f3ed0ff9aa24  go.version=go1.7.6 instance.id=e19746de-8a11-4859-8153-b2fa478200d9

いくつか削除されましたが、dfでストレージの使用量を調べてみても以前とそれほど差がありません。 ファイルを確認しても、それほどファイルが削除されていないようです。 原因を調べてみると、同一のタグを使いまわしているとリポジトリ配下のtagが別れないのでGCで削除が出来ないようです。 イートスマートではイメージをpushする際にタグにバージョンをせずlatestを利用しているのですが、この運用はまさに該当してしまいました。

リポジトリを削除する

つぎに、リポジトリの削除を試してみました。 リポジトリの削除はAPIを利用することも出来ますが、ディレクトリを削除することでリポジトリを削除しました。

# rm/var/share/docker-registry-dev/docker/registry/v2/repositories/eatsmart-docker-image/

削除すると、docker pullで取得出来なくなります。

# docker pull registry:5000/eatsmart-docker-image
Using default tag: latest
Error response from daemon: manifest for registry:5000/eatsmart-docker-image:latest not found

GCを実行すると、前回に比べて大量のログが出力されました。

# bin/registry garbage-collect config.yml
~省略~
INFO[0475] Deleting blob: /docker/registry/v2/blobs/sha256/fc/fc709bdf02c32b035a55ca326f4c2e2690729a61ea66e3b7405e2a36737d7069  go.version=go1.7.6 instance.id=98eae377-7a7d-42b3-bf81-a43749e8b7b8
blob eligible for deletion: sha256:7ac6dd671c054f72bb2c688b15740830d3058ba29343259a88723dc07159f271
INFO[0475] Deleting blob: /docker/registry/v2/blobs/sha256/7a/7ac6dd671c054f72bb2c688b15740830d3058ba29343259a88723dc07159f271  go.version=go1.7.6 instance.id=98eae377-7a7d-42b3-bf81-a43749e8b7b8
blob eligible for deletion: sha256:b028e0e97347fcc71cc92842b7749b8cfe7141b16af4d439e24b202fc048bc86
INFO[0475] Deleting blob: /docker/registry/v2/blobs/sha256/b0/b028e0e97347fcc71cc92842b7749b8cfe7141b16af4d439e24b202fc048bc86  go.version=go1.7.6 instance.id=98eae377-7a7d-42b3-bf81-a43749e8b7b8
blob eligible for deletion: sha256:d8ce74dd159ad8800028e1356c73e8daa7d78047a93ba602f56e199cf80b1502
INFO[0475] Deleting blob: /docker/registry/v2/blobs/sha256/d8/d8ce74dd159ad8800028e1356c73e8daa7d78047a93ba602f56e199cf80b1502  go.version=go1.7.6 instance.id=98eae377-7a7d-42b3-bf81-a43749e8b7b8
blob eligible for deletion: sha256:ed82a71e3c941bba568e960556727a7806eabf702a7d450a1004a54910fc9fcd
INFO[0475] Deleting blob: /docker/registry/v2/blobs/sha256/ed/ed82a71e3c941bba568e960556727a7806eabf702a7d450a1004a54910fc9fcd  go.version=go1.7.6 instance.id=98eae377-7a7d-42b3-bf81-a43749e8b7b8

dfでストレージの使用量を調べてみると、数GB減少していました。 この後、イメージをpushすると問題なくdocker-pullすることが出来、起動することも確認できました。

まとめ

以上の手順で、約200GBの使用量を削減することが出来ました。 今回GCを実行したことで、イメージのタグの管理に課題があることがわかりました。 引き続き、タグの管理を見直したいと思います。