#docker pull <image_name>:<tag>
docker pull ubuntu:22.04

#docker pull <image_name>@<digest>
docker pull ubuntu@sha256:bace9fb0d5923a675c894d5c815da75ffe35e24970166a48a4460a48ae6e0d19

如果我们使用上述第一种使用标签的方法,则无法保证确定性部署。使用标签时,无法保证拉取到完全相同的镜像,因为镜像可能已针对CVE进行了修补,因此标签保持不变,但摘要会发生变化。更多信息请见此处

引言

在使用Docker容器时,拉取和管理Docker镜像是至关重要的一个方面。Docker镜像作为容器的构建块,包含了运行应用程序所需的一切。在本文中,我们将探讨通过标签和摘要拉取镜像之间的差异,并了解每种方法适用的场景。

1. 通过标签拉取:

Docker镜像通常带有版本或标签,以区分应用程序的不同发布或变体。通过标签拉取镜像是最常见且最直接的方法。

通过标签拉取的好处:

  • 易于使用:只需使用docker pull命令,后跟镜像名称和标签,即可拉取镜像。
  • 语义化版本控制(Semantic versioning):标签通常遵循版本控制方案,允许用户指定镜像的特定发布或版本。
  • 灵活性:标签可以表示镜像的不同变体,如不同的操作系统、架构或配置。

然而,使用标签时需要考虑以下几点:

  • 可变引用(Mutable references): 标签是可变的(mutable),这意味着相同的标签随着时间的推移可能指向不同的镜像。这可能导致使用之前用过的标签拉取镜像时出现意外变化。
  • 可能出现破坏性更改(breaking changes):使用“latest”这样的标签看似方便,但如果最新镜像引入了破坏性更改或错误,则可能导致兼容性问题。

2. 通过摘要拉取:

摘要是根据镜像内容生成的唯一标识符,为镜像提供不可变的引用。它是使用加密哈希函数(SHA256)计算的,并且除非镜像本身被修改,否则保持不变。

通过摘要拉取的优势:

  • 保证不变性(Guaranteed immutability):通过摘要拉取镜像时,可以确保检索到具有特定内容的准确镜像,而无论标签发生任何变化。
  • 增强安全性(Enhanced security): 摘要作为镜像的指纹,更易于验证其完整性,并确保使用的是未经篡改的预期镜像。

使用摘要时需要考虑的因素:

  • 复杂性:摘要是一长串复杂且不易于人类阅读的字符。与标签相比,这可能使它们更不便于使用。
  • 可发现性有限:虽然标签提供了一种有意义的方式来识别镜像,但摘要不包含任何语义信息,因此更难搜索或记忆。

结论:

选择通过标签或摘要拉取Docker镜像取决于您的特定需求和偏好。标签提供灵活性和易用性,适用于大多数场景。然而,如果您优先考虑不变性和安全性,并确保镜像的准确内容,那么使用摘要将提供一个可靠的选择。

在决定使用哪种方法时,请考虑便利性和不变性之间的权衡。无论您选择标签还是摘要,了解这些概念都将使您能够高效地管理Docker镜像,并创建一致且可靠的容器部署。