1. 概述

本文将展示如何将Docker镜像推送到自托管Docker注册表中。首先,我们将探讨自托管注册表是什么以及它与公共注册表的不同之处。然后,我们将学习如何标记我们想要推送到自托管注册表的镜像。最后,我们将看到如何实际推送这些镜像。

2. 自托管Docker注册表

Docker注册表是一种管理容器镜像存储库的服务。它允许我们创建存储库、推送和拉取镜像,并管理存储库访问权限。虽然有许多注册表作为云服务提供,但注册表也可以自托管。

通过云提供的注册表,我们不必关心其托管和维护。我们只需要与服务注册并使用提供的功能即可。云托管的Docker注册表也称为公共注册表。Docker Hub是公共注册表的一个著名例子。

然而,如果公司有特殊要求,则可能无法使用公共注册表。那些不能使用公共注册表的公司通常会使用可以按需定制以满足其需求的自托管注册表。例如,公司可能会有一个隐私政策要求仅通过公司的内部网络访问存储库。或者公司可能需要对图像执行特定的安全漏洞扫描。

3. 为自托管注册表标记镜像

在将镜像推送到自托管注册表之前,我们必须以特定方式标记镜像。让我们学习如何适当地标记镜像。

3.1. 镜像名称模式

在推送镜像时,镜像名称定义了镜像将被推送到的位置。这就是为什么在将镜像推送到自托管注册表时正确使用命名模式至关重要。镜像名称必须包含注册表主机、端口和存储库名称,并且可选地跟上版本标签:

[registry host]:[registry port]/[repository name]:[tag name]

假设我们有一个运行在 localhost 上并监听端口 5000 的注册表。版本 1.0.0 的一个名为 my-fancy-app 存储库中的示例镜像名称如下所示:

localhost:5000/my-fancy-app:1.0.0

我们将在这个文章的其余部分使用这个示例。

现在我们知道应用什么命名模式后,我们可以为我们的自托管注册表准备镜像。首先,我们将看到如何使用 docker build 命令的 -t 标志构建带有正确名称的新镜像。使用前面部分中的示例,命令如下:

$ docker build -t localhost:5000/my-fancy-app:1.0.0 .

这将新镜像打上正确的名称,后面可选地跟上版本标签。行末的点“.”表示我们在Dockerfile所在的同一目录下执行命令。

3.3. 重新标记现有镜像

如果我们希望将现有的镜像推送到我们的自托管注册表,首先我们需要用符合我们描述的命名模式的新别名来标记该镜像。我们可以通过 docker tag 命令重新标记镜像

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

例如,假设我们希望将名为 my-fancy-app:1.0.0 的现有镜像推送到我们的自托管注册表。我们只需使用 docker tag 命令为该注册表匹配的别名重新标记它:

$ docker tag my-fancy-app:1.0.0 localhost:5000/my-fancy-app:1.0.0

4. 推送镜像

一旦正确标记了镜像,我们就可以将其推送到自托管注册表。

公司通常要求身份验证来保护其自托管注册表。在这种情况下,我们首先需要使用 docker login 命令进行登录:

docker login [OPTIONS] [SERVER]

对于自托管注册表位于 localhost:5000 的情况,命令如下:

$ docker login localhost:5000

登录后,我们使用 docker push 命令将镜像推送到自托管注册表:

docker push [OPTIONS] NAME[:TAG]

让我们查看在上述部分中准备的镜像的推送命令:

$ docker push localhost:5000/my-fancy-app:1.0.0

5. 验证推送

最后一步是验证镜像是否现在可用在我们的自托管注册表中。为此,我们将从注册表中拉取镜像,但在执行 docker image rm 命令之前,我们必须先删除本地缓存的镜像

$ docker image rm localhost:5000/my-fancy-app:1.0.0

让我们通过列出所有本地镜像并检查我们的镜像是否不在那里来验证我们已成功删除了镜像:

$ docker images

接下来,让我们使用 docker pull 命令从自托管注册表中拉取镜像:

$ docker pull localhost:5000/my-fancy-app:1.0.0

再次列出所有本地镜像,我们可以验证我们的镜像已成功从自托管注册表中拉取:

$ docker images
REPOSITORY                  TAG   IMAGE ID     CREATED        SIZE 
localhost:5000/my-fancy-app 1.0.0 d33a5b65c0f5 20 minutes ago 326MB

6. 结论

在这篇文章中,我们了解了自托管Docker注册表是什么以及为何使用它们。我们也探索了如何准备镜像——无论是预存在的镜像还是我们正在构建的新镜像——以便我们可以将其推送到自托管注册表。最后,我们学习了如何将正确标记的镜像推送到示例注册表。