由于注册表 API 的设计方式,该名称是必需的。docker 中的镜像全部返回到注册服务器上的存储库。存储库是服务器上的一个路径,包含多个图像清单以及其他 blob(图像配置、层和可能由摘要提取的其他数据)。
针对存储库而不是整个注册表运行所有 API 请求的一个关键原因是处理授权。否则,每个对摘要的请求都需要对引用该摘要的所有存储库进行反向查找,并查看用户是否有权访问该摘要。
您也不会针对某个全局注册表命名空间运行请求,因为存在不止一个注册表,并且可以轻松创建新注册表。Docker Hub 可能是最受欢迎的,但也有适用于大多数云提供商、GitHub 和 GitLab 等 CI 提供商的注册表,以及公司网络、他们自己的生产集群和开发人员笔记本电脑上的自托管注册表。因此,该请求可能需要多长时间没有上限,并且需要一种发现方法来查找新的注册中心,包括那些可能已经在您的私有网络中创建的注册中心。
为了更深入地了解,用于拉取的 api将请求:
GET /v2/<name>/manifests/<reference>
name 和 reference 参数标识图像并且是必需的。参考可以包括标签或摘要。
(该文档中引用的“名称”是存储库名称。)
docker 命令反映了这个 API 设计,需要镜像名称。如果您不使用标签或摘要,它将使用“最新”作为默认值。当您不使用注册表名称时,它默认为 Docker Hub。如果您还遗漏了用户名,它会在注册表名称前加上library/
所有官方镜像在 Docker Hub 上的位置。
因此,拉取请求ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
将变成registry-1.docker.io
对存储库的请求(Docker Hub 的注册表 API 服务器),library/ubuntu
并引用您列出的 sha256。
尝试从 pull 中省略存储库名称将导致语法无效(docker 将其称为参考格式),因为它无法从零中推断存储库并且没有默认存储库名称。