简介
在本次实验中,你将学习如何使用 docker image tag
命令有效地管理 Docker 镜像别名。首先,我们会了解 Docker 镜像引用的结构和组成部分,这对于识别和定位特定的镜像版本至关重要。
在对镜像引用有了基础的了解之后,你将通过多种方法为镜像打标签,获得实际操作经验:通过镜像 ID、现有名称,以及名称和标签的组合。最后,你将学习如何专门为私有 Docker 注册表标记镜像,从而能够从自定义位置推送和拉取镜像。
在本次实验中,你将学习如何使用 docker image tag
命令有效地管理 Docker 镜像别名。首先,我们会了解 Docker 镜像引用的结构和组成部分,这对于识别和定位特定的镜像版本至关重要。
在对镜像引用有了基础的了解之后,你将通过多种方法为镜像打标签,获得实际操作经验:通过镜像 ID、现有名称,以及名称和标签的组合。最后,你将学习如何专门为私有 Docker 注册表标记镜像,从而能够从自定义位置推送和拉取镜像。
在这一步中,你将学习 Docker 镜像引用。Docker 镜像引用是指向 Docker 镜像特定版本的名称。当你运行容器或执行其他与镜像相关的操作时,它用于告知 Docker 你想要使用的镜像。
完整的镜像引用通常由几个部分组成:
[registry_hostname[:port]/]image_name[:tag]
下面来详细解析这些部分:
registry_hostname[:port]
:这是存储镜像的 Docker 注册表的主机名和可选端口。如果省略这部分,Docker 默认使用 Docker Hub (docker.io
)。image_name
:这是镜像的名称。它可以包含命名空间(例如,library/ubuntu
或 myuser/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
(镜像名称)、TAG
、IMAGE ID
、CREATED
时间和 SIZE
。IMAGE ID
是镜像内容的唯一标识符。
理解镜像引用对于使用 Docker 至关重要,因为它能让你精确指定想要使用的镜像。
在这一步中,你将学习如何使用镜像 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、现有名称以及现有名称和标签组合为镜像打标签。最后,你学习了如何使用包含私有镜像仓库主机名的引用来为镜像打标签,以便将其推送到自定义镜像仓库。