Сведения о реестрах, репозиториях и артефактах

В этой статье изложены основные сведения о реестрах контейнеров, репозиториях, образах контейнеров и связанных с ними артефактах.

Registry, repositories, and artifacts

Реестр

Реестр контейнеров — это служба, которая хранит и распределяет образы контейнеров, а также связанные с ними артефакты. Docker Hub — это пример общедоступного реестра контейнеров, который служит общим каталогом образов контейнеров Docker. Реестр контейнеров Azure дает пользователям непосредственный контроль над содержимым их контейнеров и оснащен функциями проверки подлинности, георепликации (поддерживающей глобальное распределение и обеспечивающей надежность развертываний в сети), настройки виртуальной сети с Приватным каналом, блокирования тегови многими другими расширенными функциями.

Помимо образов контейнеров, совместимых с Docker, Реестр контейнеров Azure поддерживает ряд артефактов содержимого, в том числе диаграммы Helm и форматы образы Open Container Initiative (OCI).

Репозиторий

Репозиторий — это коллекция образов контейнеров или других артефактов в реестре, имеющих одинаковые имена, но разные теги. Например, три указанных ниже образа находятся в репозитории acr-helloworld.

  • acr-helloworld:latest
  • acr-helloworld:v1
  • acr-helloworld:v2

Имена репозиториев также могут включать пространство имен. Благодаря пространствам имен можно определять связанные репозитории и владельцев артефактов в вашей организации, используя имена, разделенные косой чертой. Однако реестр управляет всеми репозиториями независимо друг от друга, а не в виде иерархии. Например:

  • marketing/campaign10-18/web:v2
  • marketing/campaign10-18/api:v3
  • marketing/campaign10-18/email-sender:v2
  • product-returns/web-submission:20180604
  • product-returns/legacy-integrator:20180715

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

Артефакт

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

Тег

Тег для образа или другого артефакта указывает его версию. Одному артефакту в репозитории можно назначить один или несколько тегов. Кроме того, у артефакта может вообще не быть тегов. То есть вы можете удалить все теги из образа, и при этом данные образа (его слои) останутся в реестре.

Репозиторий (или репозиторий и пространство имен) вместе с тегом определяют имя образа. Образ можно отправлять и получать. Для этого в операции передачи или получения необходимо указать его имя. По умолчанию используется тег latest (если не указать другой тег в командах Docker).

Порядок присвоения тегов образам контейнеров зависит от используемых вами сценариев разработки и развертывания этих образов. Например, рекомендуется использовать стабильные теги для обслуживания базовых образов, а уникальные теги — для развертываемых образов. Дополнительные сведения см. в статье Рекомендации по использованию тегов и управлению версиями образов контейнеров.

Правила именования тегов см. в документации по Docker.

Уровень

Образы контейнеров и артефакты состоят из одного или нескольких слоев. Различные типы артефактов по-разному определяют слои. Например, в образе контейнера Docker каждый слой соответствует строке в файле Dockerfile, определяющем образ:

Layers of a container image

Для артефактов в реестре используются одинаковые слои, что позволяет повысить эффективность хранилища. Например, для нескольких образов в разных репозиториях может использоваться один и тот же базовый слой ASP.NET Core, но только одна копия из этого слоя будет храниться в реестре. Кроме того, совместное использование слоев позволяет оптимизировать распределение слоев по узлам. При этом для нескольких артефактов используются одинаковые слои. Например, если образ, уже находящийся в узле, включает в себя уровень ASP.NET Core в качестве основы, то при последующем извлечении другого образа, ссылающегося на тот же слой, этот слой не будет перемещен в узел. Вместо этого он ссылается на слой, который уже существует на узле.

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

манифеста

Каждый образ контейнера или артефакт, отправляемый в реестр контейнеров, сопоставлен с манифестом. Манифест, создаваемый реестром во время отправки содержимого, уникальным образом идентифицирует артефакт и указывает слои.

Базовый манифест образа Linux hello-world выглядит примерно следующим образом:

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
    "mediaType": "application/vnd.docker.container.image.v1+json",
    "size": 1510,
    "digest": "sha256:fbf289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e"
  },
  "layers": [
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 977,
      "digest": "sha256:2c930d010525941c1d56ec53b97bd057a67ae1865eebf042686d2a2d18271ced"
    }
  ]
}

С помощью команды Azure CLI az acr manifest list-metadata можно получить список манифестов для репозитория.

az acr manifest list-metadata --name <repositoryName> --registry <acrName>

Например, можно отобразить список манифестов acr-helloworld:

az acr manifest list-metadata --name acr-helloworld --registry myregistry
[
  {
    "digest": "sha256:0a2e01852872580b2c2fea9380ff8d7b637d3928783c55beb3f21a6e58d5d108",
    "tags": [
      "latest",
      "v3"
    ],
    "timestamp": "2018-07-12T15:52:00.2075864Z"
  },
  {
    "digest": "sha256:3168a21b98836dda7eb7a846b3d735286e09a32b0aa2401773da518e7eba3b57",
    "tags": [
      "v2"
    ],
    "timestamp": "2018-07-12T15:50:53.5372468Z"
  },
  {
    "digest": "sha256:7ca0e0ae50c95155dbb0e380f37d7471e98d2232ed9e31eece9f9fb9078f2728",
    "tags": [
      "v1"
    ],
    "timestamp": "2018-07-11T21:38:35.9170967Z"
  }
]

Дайджест манифеста

Манифесты идентифицируются с помощью уникального хэша SHA-256 или дайджеста манифеста. Для идентификации каждого образа или артефакта (с тегами или без тегов) используется его хэш. Значение хэша уникально, даже если данные слоя артефакта идентичны данным другого артефакта. Данный механизм позволяет многократно отправлять образы с идентичными тегами в реестр. Например, можно многократно отправлять myimage:latest в реестр, при этом не получая сообщений об ошибке. Это происходит из за того, что каждый образ идентифицируется по уникальному дайджесту.

Чтобы извлечь артефакт из реестра, необходимо указать его хэш в операции извлечения. Некоторые системы можно настроить для извлечения с помощью хэша, так как это гарантирует, что будет извлечена нужная версия образа, даже если позже в реестр будут отправлены образы с такими же тегами.

Важно!

Если вы периодически отправляете измененные артефакты с идентичными тегами, можно создать "потерянные" артефакты — артефакты без тегов, которые тем не менее будут занимать место в реестре. Образы без тегов не отображаются в Azure CLI или на портале Azure при просмотре списка или образов по тегу. Тем не менее их слои по-прежнему существуют и занимают место в реестре. Удаление образа без тегов позволяет освободить место в реестре, когда манифест является единственным или последним и указывает на определенный слой. Сведения о том, как освободить место, используемое образами без тегов, см. в разделе Удаление образов контейнеров в Реестре контейнеров Azure с помощью Azure CLI.

Обращение к артефакту

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

Адрес по тегу: [loginServerUrl]/[repository][:tag]

Адрес по хэшу: [loginServerUrl]/[repository@sha256][:digest]

При использовании Docker или других клиентских средств для отправки артефактов в Реестр контейнеров Azure или их извлечения из этого Реестра используйте полный URL-адрес реестра, также называемый именем сервера входа. В облаке Azure полный URL-адрес Реестра контейнеров Azure имеет формат myregistry.azurecr.io (все буквы должны быть строчными).

Примечание.

  • Вам не удастся указать номер порта, например myregistry.azurecr.io:443, в URL-адресе сервера входа реестра.
  • По умолчанию используется тег latest (если вы не укажете какой-либо другой тег в команде).

Отправить по тегу

Примеры:

docker push myregistry.azurecr.io/samples/myimage:20210106

docker push myregistry.azurecr.io/marketing/email-sender

Извлечь по тегу

Пример:

docker pull myregistry.azurecr.io/marketing/campaign10-18/email-sender:v2

Извлечь по хэшу манифеста

Пример:

docker pull myregistry.azurecr.io/acr-helloworld@sha256:0a2e01852872580b2c2fea9380ff8d7b637d3928783c55beb3f21a6e58d5d108

Следующие шаги

Узнайте больше о хранилище реестров и поддерживаемых форматах содержимого в Реестре контейнеров Azure.

Узнайте, как отправлять и извлекать образы в Реестре контейнеров Azure.