Docker Registryのクリーンアップ
イートスマートでは、Dockerイメージを管理するため、ローカルネットワークにDocker Registoryを運用しています。 2018年にすべてのアプリケーションをDockerに移行してから約2年が経過し、ストレージの使用量が増加してきました。 今回は、Docker Registryのクリーンアップを行い、ストレージの使用量を減らしてみます。
GCを実行する
公式の手順を試してみます。 まずコンテナの起動時に環境変数を指定します。 この設定を行わないと、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を実行したことで、イメージのタグの管理に課題があることがわかりました。 引き続き、タグの管理を見直したいと思います。