Вывоз мусора

Эта страница содержит информацию о размещении вашего собственного реестра с помощью реестр Docker с открытым исходным кодом. Для получения информации о Docker Hub, который предлагает размещенный реестр с дополнительными функциями, такими как группы, организации, веб-перехватчики, автоматические сборки и т.д., см. статью Docker Hub.

Начиная с версии 2.4.0 команда сборщика мусора включена в двоичный файл реестра. Данный документ определяет, что делает эта команда и как и почему её следует использовать.

О вывозе мусора

В контексте реестра Docker сборка мусора — это процесс удаления больших двоичных объектов из файловой системы, когда на них больше не ссылается манифест. Большие двоичные объекты могут включать как слои, так и манифесты.

Данные реестра могут занимать значительный объём дискового пространства. Кроме того, сборка мусора может быть соображениями безопасности, когда желательно гарантировать, что определённые слои больше не существуют в файловой системе.

Вывоз мусора на практике

Уровни файловой системы хранятся по адресу их содержимого в реестре. Это имеет много преимуществ, одно из которых заключается в том, что данные сохраняются один раз и на них ссылаются манифесты. См. здесь для получения более подробной информации.

Таким образом, слои совместно используются манифестами; каждый манифест поддерживает ссылку на слой. Пока на слой ссылается один манифест, он не может быть удален сборщиком мусора.

Манифесты и слои могут быть deleted с API реестра (подробности см. в документации API здесь и здесь). Данный API удаляет ссылки на цель и делает их доступными для сборки мусора. Это также делает их недоступными для чтения через API.

Если слой удален, он удаляется из файловой системы при запуске сборки мусора. Если манифест удаляется, слои, на которые он ссылается, удаляются из файловой системы, если на них не ссылаются никакие другие манифесты.

Пример

В этом примере манифест A ссылается на два уровня: a и b. Манифест B ссылается на слои a и c. В этом состоянии ничего не подходит для сборки мусора:

A -----> a <----- B
    \--> b     |
         c <--/

Манифест B удаляется через API:

A -----> a     B
    \--> b
         c

В этом состоянии слой c больше не имеет ссылки и подходит для сборки мусора. У слоя a была удалена одна ссылка, но сбор мусора не проводился, т. к. на него по-прежнему ссылается манифест A. Большой двоичный объект, представляющий манифест B, подходит для сборки мусора.

После запуска сборки мусора манифест A и его большие двоичные объекты остаются.

A -----> a
    \--> b

Подробнее о сборе мусора

Сбор мусора проходит в два этапа. Во-первых, на этапе «пометки» процесс сканирует все манифесты в реестре. Из данных манифестов он создаёт множество дайджестов адресов контента. Данный множество является «набором меток» и обозначает множество больших двоичных объектов, которые не удаляются. Во-вторых, на этапе «очистка» процесс сканирует все большие двоичные объекты, и если дайджест адреса содержимого большого двоичного объекта не находится в множестве меток, процесс удаляет его.

Примечание

Вы должны убедиться, что реестр находится в режиме только для чтения или вообще не работает. Если вы загружает образ во время работы сборки мусора, существует риск того, что слои образа будут удалены по ошибке, что приведёт к повреждению образа.

Данный тип сборки мусора известен как сборка мусора Stop-the-world.

Запуск сборки мусора

Сборку мусора можно выполнить следующим образом

bin/registry garbage-collect [--dry-run] [--delete-untagged] /path/to/config.yml

Команда сбора мусора принимает параметр --dry-run, который печатает ход выполнения фаз маркировки и очистки без удаления каких-либо данных. Если вам нужно также очистить непомеченные манифесты, вы можете выполнить команду с параметром --delete-untagged. Запуск с уровнем журнала info предоставляет четкое указание на элементы, подлежащие удалению.

Файл config.yml должен иметь следующий формат:

version: 0.1
storage:
  filesystem:
    rootdirectory: /registry/data

Пример выходных данных пробной сборки мусора с уровнем журнала реестра, установленным на info.

hello-world
hello-world: marking manifest sha256:fea8895f450959fa676bcc1df0611ea93823a735a01205fd8622846041d0c7cf
hello-world: marking blob sha256:03f4658f8b782e12230c1783426bd3bacce651ce582a4ffb6fbbfa2079428ecb
hello-world: marking blob sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
hello-world: marking configuration sha256:690ed74de00f99a7d00a98a5ad855ac4febd66412be132438f9b8dbd300a937d
ubuntu

4 blobs marked, 5 blobs eligible for deletion
blob eligible for deletion: sha256:28e09fddaacbfc8a13f82871d9d66141a6ed9ca526cb9ed295ef545ab4559b81
blob eligible for deletion: sha256:7e15ce58ccb2181a8fced7709e9893206f0937cc9543bc0c8178ea1cf4d7e7b5
blob eligible for deletion: sha256:87192bdbe00f8f2a62527f36bb4c7c7f4eaf9307e4b87e8334fb6abec1765bcb
blob eligible for deletion: sha256:b549a9959a664038fc35c155a95742cf12297672ca0ae35735ec027d55bf4e97
blob eligible for deletion: sha256:f251d679a7c61455f06d793e43c06786d7766c88b8c24edf242b2c08e3c3f599