Partager via

关于注册表、存储库和构件

本文介绍容器注册表、存储库、容器映像和相关项目的关键概念。

注册表、存储库和项目

注册表

容器注册表是一项用来存储和分发容器映像和相关项目的服务。 Docker Hub是公共容器注册表的一个示例,用作 Docker 容器映像的一般目录。 Azure 容器注册表提供对容器内容的直接控制,集成身份验证、 异地复制 支持网络关闭部署的全局分发和可靠性、 具有专用链接的虚拟网络配置标记锁定和其他许多增强功能。

除了 Docker 兼容的容器映像,Azure 容器注册表还支持一系列 内容制品,包括 Helm 图表和开放容器倡议 (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:20230604
  • product-returns/legacy-integrator:20230715

存储库名称只能包含小写字母数字字符、句点、短划线、下划线和正斜杠。

工件

注册表中的容器映像或其他项目与一个或多个标记相关联,具有一个或多个层,并由一个清单标识。 了解这些组件之间的关系有助于有效管理注册表。

标记

映像或其他项目的标记指定了其版本。 可以将一个或多个标记分配给存储库中的单个项目。 还可以通过从映像中删除所有标记,而在注册表中保留映像的数据(其层),来“取消标记”制品。

映像的名称由存储库(或存储库和命名空间)和标记进行定义。 可以通过在推送或拉取操作中指定映像名称来推送和拉取映像。 如果未在 Docker 命令中提供标记,则默认使用标记 latest

如何标记容器映像取决于开发或部署容器映像的方案。 例如,使用稳定的标记来维护基本映像,并使用唯一标记来部署映像。 有关详细信息,请参阅有关对容器映像进行标记和版本控制的建议

有关标记命名规则,请参阅 Docker 文档

容器图像和项目由一个或多个 组成。 不同的制品类型以不同的方式定义层。 例如,在 Docker 容器映像中,每个层都对应于 Dockerfile 中定义了映像的一行:

容器映像的层

注册表中的项目共享公用层,从而提高存储效率。 例如,不同存储库中的多个映像可能共享一个常见的 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": "2023-07-12T15:52:00.2075864Z"
  },
  {
    "digest": "sha256:3168a21b98836dda7eb7a846b3d735286e09a32b0aa2401773da518e7eba3b57",
    "tags": [
      "v2"
    ],
    "timestamp": "2023-07-12T15:50:53.5372468Z"
  },
  {
    "digest": "sha256:7ca0e0ae50c95155dbb0e380f37d7471e98d2232ed9e31eece9f9fb9078f2728",
    "tags": [
      "v1"
    ],
    "timestamp": "2023-07-11T21:38:35.9170967Z"
  }
]

清单摘要

清单具有一个名为 清单摘要的唯一 SHA-256 哈希。 每个图像或项目(无论是标记还是未标记)都有自己的摘要。 即使构件的层数据与另一个构件匹配,摘要值仍然是唯一的。 借助此功能,可以将相同标记的映像推送到注册表,而不会出现任何问题。 例如,可以一遍又一遍地推送 myimage:latest 到注册表而不显示错误,因为每个映像都有自己的唯一摘要。

可以通过将项目摘要添加到拉取操作来从注册表拉取项目。 某些系统可能设置为按摘要方式拉取,因为它可以确保您拉取的映像版本,即使您稍后向注册表推送相同标签的映像。

重要

如果重复推送具有相同标记的修改的项目,可能会创建 孤立项目:未标记但仍在注册表中使用空间的项目。 列出或按标签查看图像时,没有标记的图像不会显示在 Azure CLI 或 Azure 门户中。 但是,它们的图层仍然存在,并占用注册表中的空间。 当清单是唯一指向特定层或最后一个映像时,删除未标记的映像会释放注册表空间。 若要了解如何释放未标记映像使用的空间,请参阅 Azure 容器注册表中的“删除容器映像”。

处理人工制品

若要使用 Docker 或其他客户端工具解决用于推送和拉取操作的注册表项目,请合并完全限定的注册表名称、存储库名称(包括命名空间路径(如果适用),以及项目标记或清单摘要。 常规格式为:

按标记进行寻址[loginServerUrl]/[repository][:tag]

按摘要进行寻址[loginServerUrl]/[repository]@[sha256:digest]

使用 Docker 或其他客户端工具将项目拉取或推送到 Azure 容器注册表时,请使用注册表的完全限定 URL,也称为 登录服务器 名称。 在Azure云中,Azure容器注册表的完全限定 URL 采用 myregistry.azurecr.cn 格式(全部小写)。 如果未在命令中提供标记,则默认使用标记 latest

注意

不能在注册表登录服务器 URL 中指定端口号,例如 myregistry.azurecr.cn:443

按标记推送的示例:

docker push myregistry.azurecr.cn/samples/myimage:20230106

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

按标记拉取的示例:

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

按清单摘要(manifest digest)拉取的示例:

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

后续步骤