1. 概述

本文将引导我们学习 Docker 中的标签概念。

Docker 提供了在 Docker Hub 存储库上存储镜像的支持。Docker 标签为 Docker 镜像提供了一个独特的标识。Docker 存储库中的多个相似镜像通过标签具有不同的版本。在这里,我们将学习如何使用 docker builddocker tag 命令为镜像打标签。

2. 了解 Docker 标签

Docker 标签有助于维护构建版本以将镜像推送到 Docker Hub。Docker Hub 允许我们根据名称和标签将镜像分组在一起。多个 Docker 标签可以指向特定的镜像。基本上,Docker 标签类似于 Git 中的特定提交。Docker 标签只是镜像 ID 的别名。

标签名称必须是 ASCII 字符串,并且可能包括小写和大写字母、数字、下划线、点号和破折号。此外,标签名称不能以点或破折号开头,且只能包含 128 个字符。

3. 使用 Docker 标签构建镜像

在继续之前,让我们首先创建一个示例 Dockerfile 来演示打标签:

FROM centos:7
RUN yum -y install wget 
RUN yum -y install unzip 
RUN yum -y install java-1.8.0-openjdk 
RUN yum clean all
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
RUN export JAVA_HOME

在上述 Dockerfile 中,我们使用基于“centos:7”的命令安装 Java。

3.1 使用单个 Docker 标签构建镜像

在 Docker 中,我们可以在构建时为镜像打标签。以下是我们打标签命令的示例:

$ docker build -t baeldung-java:5 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM centos:7
 ---> eeb6ee3f44bd
Step 2/2 : RUN yum -y install wget
 ---> Using cache
 ---> 46ee47a7422d
Successfully built 46ee47a7422d
Successfully tagged baeldung-java:5

在这里,上述命令中,我们为 Docker 镜像提供了“baeldung-java:5”作为标签。Docker 标签在 Docker 中很有用,用于维护构建版本以将镜像推送到 DockerHub。通常,使用任何 Docker 镜像进行部署或回滚到较旧版本时会使用版本化。

我们还可以使用以下语法通过用户名和镜像名称提供标签:

$ docker build -t baeldung/baeldung-java:5 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM centos:7
 ---> eeb6ee3f44bd
....
Successfully built 46ee47a7422d
Successfully tagged baeldung/baeldung-java:5

在这里,上述命令中,我们提供了用户名“baeldung”与镜像名称“baeldung-java”以及标签“5”。

3.2 使用多个 Docker 标签构建镜像

在 Docker 中,我们也可以为镜像分配多个标签。这里,我们将使用 docker build 命令在一个命令中为镜像分配多个标签。

为了演示,让我们查看以下 Dockerfile 的命令:

$ docker build -t baeldung-java:5 -t baeldung-java:6 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM centos:7
 ---> eeb6ee3f44bd
....
Successfully built 46ee47a7422d
Successfully tagged baeldung-java:5
Successfully tagged baeldung-java:6

在这里,我们可以看到为 imageId “46ee47a7422d” 创建了两个标签“baeldung-java:5”和“baeldung-java:6”。

3.3 不带任何标签构建镜像

我们也可以不使用任何标签构建 Docker 镜像。但是为了跟踪镜像,我们应该始终为镜像名称提供标签。让我们查看不使用标签构建镜像的命令:

$ docker build -t baeldung-java .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM centos:7
 ---> eeb6ee3f44bd
...
Successfully built 46ee47a7422d
Successfully tagged baeldung-java:latest

在这里,上述命令中,我们没有使用任何标签构建镜像,因此 Docker 默认为图像提供标签为最新“baeldung-java:latest”。

Docker 总是指向最新稳定发布使用最新标签。旧发布甚至可以被称为最新。但我们无法预测它是主要版本还是次要版本。

4. 使用 docker tag 命令为镜像打标签

到目前为止,我们讨论了使用 docker build 命令为镜像打标签。但是,我们也可以显式地使用 docker tag 命令为镜像打标签。为镜像打标签仅创建了图像名称或 imageId 的别名。在这里,我们将探索这两种方法来为镜像打标签。

Docker 图像名称的一般格式如下:

<user-name>/<image-name>:<tag-name>

在上述片段中,冒号后的组件表示附加到图像的标签。

让我们查看使用图像名称打标签的命令:

$ docker tag baeldung-java:6 baeldung-java:8 

使用 imageId 打标签的命令如下:

$ docker tag 46ee47a7422d baeldung-java:9 

让我们检查所有至今创建的图像:

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
baeldung-java       5                   46ee47a7422d        13 minutes ago      370MB
baeldung-java       6                   46ee47a7422d        13 minutes ago      370MB
baeldung-java       8                   46ee47a7422d        13 minutes ago      370MB
baeldung-java       9                   46ee47a7422d        13 minutes ago      370MB
baeldung-java       latest              46ee47a7422d        13 minutes ago      370MB
centos              7                   eeb6ee3f44bd        7 months ago        204MB

在这里,我们将找到至今创建的所有图像。

5. 使用 docker pull 命令中的标签

Docker 标签对于创建图像或从 Docker Hub 存储库拉取图像非常有用。在我们的 Dockerfile 中,我们使用命令 FROM centos:7。这将拉取公共 centos 版本“7”的公共镜像。

我们也可以带有或不带有标签拉取镜像。

让我们查看带有特定标签的命令:

$ docker pull centos:7

不带任何标签的 docker pull 命令:

$ docker pull centos

上述命令将从公共 Docker Hub 存储库拉取 “centos:latest” 镜像。我们还可以对图像应用多个标签,通常用于指定主版本和次版本。

6. 总结

在本文中,我们学习了如何在 Docker 中创建和管理标签。我们探索了打标签的不同方式。

使用 docker build 命令,我们首先为镜像打标签。之后,我们查看了 docker tag 命令。此外,我们还探索了使用标签的 docker pull 命令。