如何使用 docker image tag 命令管理镜像别名

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本次实验中,你将学习如何使用 docker image tag 命令有效地管理 Docker 镜像别名。首先,我们会了解 Docker 镜像引用的结构和组成部分,这对于识别和定位特定的镜像版本至关重要。

在对镜像引用有了基础的了解之后,你将通过多种方法为镜像打标签,获得实际操作经验:通过镜像 ID、现有名称,以及名称和标签的组合。最后,你将学习如何专门为私有 Docker 注册表标记镜像,从而能够从自定义位置推送和拉取镜像。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/tag("Tag an Image") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/pull -.-> lab-555163{{"如何使用 docker image tag 命令管理镜像别名"}} docker/tag -.-> lab-555163{{"如何使用 docker image tag 命令管理镜像别名"}} docker/images -.-> lab-555163{{"如何使用 docker image tag 命令管理镜像别名"}} end

理解 Docker 镜像引用

在这一步中,你将学习 Docker 镜像引用。Docker 镜像引用是指向 Docker 镜像特定版本的名称。当你运行容器或执行其他与镜像相关的操作时,它用于告知 Docker 你想要使用的镜像。

完整的镜像引用通常由几个部分组成:

[registry_hostname[:port]/]image_name[:tag]

下面来详细解析这些部分:

  • registry_hostname[:port]:这是存储镜像的 Docker 注册表的主机名和可选端口。如果省略这部分,Docker 默认使用 Docker Hub (docker.io)。
  • image_name:这是镜像的名称。它可以包含命名空间(例如,library/ubuntumyuser/myapp)。如果在 Docker Hub 上的官方镜像未指定命名空间,则默认使用 library/ 命名空间(例如,ubuntu 等同于 library/ubuntu)。
  • tag:这是一个可选标签,用于指定镜像的特定版本或变体。如果未指定标签,Docker 默认使用 latest 标签。

下面来看一些示例:

  • ubuntu:这指的是 Docker Hub 上官方 ubuntu 镜像的 latest 标签版本。
  • ubuntu:20.04:这指的是 Docker Hub 上官方 ubuntu 镜像的 20.04 标签版本。
  • myuser/myapp:这指的是 Docker Hub 上 myuser 仓库中 myapp 镜像的 latest 标签版本。
  • myuser/myapp:v1.0:这指的是 Docker Hub 上 myuser 仓库中 myapp 镜像的 v1.0 标签版本。
  • myregistry.example.com:5000/myuser/myapp:v1.0:这指的是位于 myregistry.example.com 端口 5000 的私有注册表中 myuser 仓库里 myapp 镜像的 v1.0 标签版本。

为了了解镜像引用在实际中的使用方式,下面使用镜像引用拉取一个镜像。我们将拉取 hello-world 镜像,这是一个用于测试 Docker 安装的非常小的镜像。

docker pull hello-world

你应该会看到表明 Docker 正在拉取镜像的输出。

Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

此命令从 Docker Hub 拉取了 hello-world 镜像的 latest 标签版本。输出确认了完整的引用 docker.io/library/hello-world:latest

现在,列出你已下载的镜像。

docker images

你应该会看到列出的 hello-world 镜像。

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    <image_id>     <created_time>   <size>

输出显示了镜像的 REPOSITORY(镜像名称)、TAGIMAGE IDCREATED 时间和 SIZEIMAGE ID 是镜像内容的唯一标识符。

理解镜像引用对于使用 Docker 至关重要,因为它能让你精确指定想要使用的镜像。

使用镜像 ID 为镜像打标签

在这一步中,你将学习如何使用镜像 ID 为 Docker 镜像打标签。为镜像打标签可以为其赋予新的名称和/或标签,从而创建一个指向相同镜像内容的新引用。这对于创建别名、进行版本控制或准备将镜像推送到不同的注册表非常有用。

为镜像打标签的基本命令是 docker tag,其语法如下:

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

你可以使用镜像 ID、名称或名称和标签的组合来指定源镜像。在这一步中,我们将使用镜像 ID。

首先,再次列出镜像,以获取上一步中拉取的 hello-world 镜像的镜像 ID。

docker images

在输出中找到 hello-world 镜像,并记录其 IMAGE ID。它将是一串十六进制字符,例如 bf756fb1cdb1。你只需使用 ID 的前几个字符,只要它们在你的镜像中是唯一的即可。

现在,使用镜像 ID 为 hello-world 镜像打标签。我们将为其赋予一个新名称 my-hello-world 和标签 v1.0。将 <image_id> 替换为你从 docker images 输出中记录的实际镜像 ID。

docker tag < image_id > my-hello-world:v1.0

如果命令成功执行,将不会有输出。

现在,再次列出镜像,查看新标签。

docker images

你现在应该会看到一个新条目,其仓库名为 my-hello-world,标签为 v1.0。注意,它的 IMAGE ID 与原始的 hello-world 镜像相同。这证实了新标签只是指向相同镜像内容的一个指针。

REPOSITORY       TAG       IMAGE ID       CREATED        SIZE
hello-world      latest    <image_id>     <created_time>   <size>
my-hello-world   v1.0      <image_id>     <created_time>   <size>

你已成功使用镜像 ID 为镜像打标签。这是管理 Docker 镜像的一项基本操作。

使用镜像名称为镜像打标签

在这一步中,你将学习如何使用镜像名称为 Docker 镜像打标签。这是打标签时引用镜像的另一种常见方式。当你仅使用镜像名称而不指定标签时,Docker 会默认你指的是带有 latest 标签的镜像。

使用镜像名称打标签的语法与之前相同:

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

这次,我们的 SOURCE_IMAGE 将是镜像的名称。我们将再次使用 hello-world 镜像。由于我们没有为源镜像指定标签,Docker 将使用 hello-world:latest

让我们为 hello-world 镜像添加一个新名称 another-hello-world 和标签 v2.0

docker tag hello-world another-hello-world:v2.0

同样,如果命令执行成功,将不会有输出。

现在,让我们列出镜像以查看新标签。

docker images

你现在应该会看到一个新条目,其仓库名为 another-hello-world,标签为 v2.0。与上一步一样,这个新标签也指向与原始 hello-world 镜像相同的 IMAGE ID

REPOSITORY          TAG       IMAGE ID       CREATED        SIZE
hello-world         latest    <image_id>     <created_time>   <size>
my-hello-world      v1.0      <image_id>     <created_time>   <size>
another-hello-world v2.0      <image_id>     <created_time>   <size>

你已成功使用镜像名称为镜像打标签。这是为镜像的 latest 版本创建新标签的便捷方法。

使用镜像名称和标签为镜像打标签

在这一步中,你将学习如何使用镜像的名称和标签为 Docker 镜像打标签。这是在打标签时引用镜像特定版本的最精确方式。

语法保持不变:

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

这次,我们的 SOURCE_IMAGE 将同时指定其名称和标签。我们将使用上一步中创建的 my-hello-world:v1.0 镜像。

让我们为 my-hello-world:v1.0 镜像添加一个新名称 yet-another-hello-world 和标签 release

docker tag my-hello-world:v1.0 yet-another-hello-world:release

如果命令执行成功,将不会有输出。

现在,让我们列出镜像以查看新标签。

docker images

你现在应该会看到一个新条目,其仓库名为 yet-another-hello-world,标签为 release。这个新标签也指向与原始 hello-world 镜像以及我们创建的其他标签相同的 IMAGE ID

REPOSITORY              TAG       IMAGE ID       CREATED        SIZE
hello-world             latest    <image_id>     <created_time>   <size>
my-hello-world          v1.0      <image_id>     <created_time>   <size>
another-hello-world     v2.0      <image_id>     <created_time>   <size>
yet-another-hello-world release   <image_id>     <created_time>   <size>

你已成功使用镜像的名称和标签为镜像打标签。当你想基于镜像的特定已标记版本创建新标签时,这种方法很有用。

为私有镜像仓库的镜像打标签

在这一步中,你将学习如何为 Docker 镜像打标签,以便将其推送到私有镜像仓库。为私有镜像仓库的镜像打标签时,你需要在目标镜像引用中包含镜像仓库的主机名和可选端口。

打标签的语法保持不变:

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

现在,TARGET_IMAGE 将包含镜像仓库信息:

[registry_hostname[:port]/]image_name[:tag]

假设我们有一个运行在 myregistry.example.com 主机、端口为 5000 的私有镜像仓库。我们将为 hello-world 镜像(使用其 latest 标签)打标签,以便将其推送到这个假设的镜像仓库。我们将为其命名为 my-hello-world 并添加标签 prod

docker tag hello-world:latest myregistry.example.com:5000/my-hello-world:prod

如果命令执行成功,将不会有输出。

现在,让我们列出镜像以查看包含镜像仓库名称的新标签。

docker images

你现在应该会看到一个新条目,其仓库名为 myregistry.example.com:5000/my-hello-world,标签为 prod。这个标签也指向与原始 hello-world 镜像相同的 IMAGE ID

REPOSITORY                                TAG       IMAGE ID       CREATED        SIZE
hello-world                               latest    <image_id>     <created_time>   <size>
my-hello-world                            v1.0      <image_id>     <created_time>   <size>
another-hello-world                       v2.0      <image_id>     <created_time>   <size>
yet-another-hello-world                   release   <image_id>     <created_time>   <size>
myregistry.example.com:5000/my-hello-world prod      <image_id>     <created_time>   <size>

你已成功为镜像打标签,标签引用中包含了私有镜像仓库的主机名和端口。在使用 docker push 命令将镜像推送到该镜像仓库之前,这是必要的一步。

总结

在本次实验中,你学习了 Docker 镜像引用,了解了其结构,包括可选的镜像仓库主机名、镜像名称和标签。你看到了如何使用这些引用来唯一标识 Docker 镜像仓库中的特定镜像版本并拉取它们。

接着,你探索了如何使用 docker image tag 命令为现有镜像创建别名。你练习了使用镜像 ID、现有名称以及现有名称和标签组合为镜像打标签。最后,你学习了如何使用包含私有镜像仓库主机名的引用来为镜像打标签,以便将其推送到自定义镜像仓库。