20190210.png

如果你已经开始使用docker,你肯定遇到过docker的标签,他们通常看起来像“my_image_name:v1”,其中冒号后面的部分称为标记,标记image时不总是标记,文下会有解释

什么是Docker标签?#

那么,Docker标签到底是什么?简单来说,Docker标签传达有关特定images版本/变化的有用信息。它们是image ID的别名,通常如下所示:965b523dfe25。这种类似与git的提交版本号。

标签发挥作用的两种最常见的情况是:

  1. 构建镜像时,我们使用以下命令:
docker build -t username / image_name:tag_name .

让我们试着分解一下这个命令的作用。我们告诉Docker守护进程获取当前目录中存在的Docker文件(这就是最后 .的目的)。接下来,我们告诉Docker守护程序构建镜像并为其指定标记。如果你运行docker images,你应该看到一个存储库是username/image_name和标签的imagetag_name

username/image_name不是指定image名称的强制格式。当你需要将image推送到Docker仓库时,避免再次标记image,这仅作为一个有用的约定。

你的image可以根据需要命名。对于公共Docker仓库,在命名image时,你被限制为两级层次结构。例如,你的image不能具有名称a/b/c:1.此限制通常不存在于私有仓库中。如前所述,并非强制要求指定一个tag_name.我们将很快看到在这种情况下会发生什么。

2.通过tag命令显式标记image。

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

这个命令只是通过创建的名称的别名(参考)TARGET_IMAGE是指SOURCE_IMAGE.这就是它所做的一切。这就像为现有image指定另一个名称来引用它。注意标签如何在这里被指定为可选的[:TAG]

如果不指定标签会发生什么?#

好的,现在让我们来看看在标记image时没有指定标记时会发生什么。这是latest标签进入image的地方。每当image被标记而没有显式标记时,latest默认情况下会给出标记。这是一个令人遗憾的命名选择,会引起很多混乱。但我喜欢将它视为未指定image时为image指定的默认标记

latest由于期望它是image的最新版本,特别是在Dockerfiles中引起了很多混乱。让我们用一个例子来考虑各种场景:

场景1:#

假设我们的Dockerfile中存在以下语句:

From debian

由于我们没有指定任何标记,Docker将添加latest标记并尝试拉取imagedebian:latest

场景2:#

From debian:9.3

由于此处明确提到了标记,因此Docker将拉出标记为9.3的Debian image

另外要记住的是,没有规则说明image只需要一个标签。image可以有多个标签,它们通常用于指定主要版本和次要版本。例如,参考一下: 20190210-1.png

在撰写本文时,Debian image的最新标记指向9.3版本和9版本。每当主要版本或次要版本碰撞时,image很可能在将来发生变化。

请注意,用于定义版本控制的标记是遵循的约定,但标记不是为此目的而设计的

总之,最新的不是特殊标签#

到目前为止我们所介绍的主要内容是最新版本latest与其他标签一样。开发人员有责任正确标记image,以便latest始终指向image的最新稳定版本。

因此,我们在拉动image时没有在我们的Dockerfiles中明确指定标记,因为我们最终可能会得到与之前使用的基本image完全不同的版本。 无法保证它是否会出现不同版本自己的差异。 即使旧版本也可以标记为最新版本。

学习更多#

学习如何使用Docker CLI命令,Dockerfile命令,使用Bash命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。