我们已经学会了如何 buildrun docker 镜像,现在是我们学习 share 的时候了。这里分享的重点是把我们本地机器上的docker镜像推送过来,让其他人也可以使用。这也是docker的一个重要特性。此共享功能不仅使您,而且每个人都可以使用您的图像,在他们的本地计算机上运行它。机器与环境之间没有缝隙。如果它在您的机器上运行,它也将在他们的机器上运行。

使用 docker 镜像注册表

什么是注册表?要回答这个问题,首先,我们必须知道,当我们在本地机器上运行映像时,并且本地没有该映像,docker 必须从某处的服务器下载它。

集中存储 docker 镜像的服务器称为 docker registry。 docker 引擎使用docker hub作为默认注册中心,这意味着它将成为 docker 查找本地不可用镜像的第一个地方。

Docker 镜像需要一个名称。因为如果图像没有名称,docker如何找到我们正在寻找的确切图像? Docker 镜像名称有时由一两个部分组成,例如 express-appcantdocpp/express-app。那么,让我们在这里看看 docker image 的解剖结构:

docker.io/cantdocpp/golang:latest

docker.io 是我们存储图像的注册表的域。 Docker 集线器是默认设置。

cantdocpp 是图片所有者的帐户。它可以是个人用户或组织。

golang 是用于应用程序名称的图像存储库名称。一个存储库可以存储多个版本的映像。

latest* 是用于版本控制或定义应用程序变体的图像标签。 Latest 是默认标签。

正如我们所看到的,docker 为我们提供了一些默认值,以防我们不提供图像引用的值。默认注册表是 docker hub,默认标签是 latest

如果我们使用 docker hub 作为我们的 docker 镜像注册表,我们不必指定域。例如,我们可以输入:

docker pull cantdocpp/golang:latest

并且 docker 将搜索 docker hub 作为默认注册表并将其拉到我们的本地机器上。我们甚至不必登录 docker hub,因为我们可以在 docker hub 中拉取任何公共镜像。

推送docker镜像到_docker hub_

为了将 docker 镜像推送到 Docker hub,我们将需要 docker hub 帐户。因此,如果您没有帐户,您可以在 docker hub 中注册它。

我们需要做两件事来将镜像推送到 Docker 注册表。首先,我们必须使用终端或命令行登录到 docker hub,以便 docker 可以授权用户是否有权推送图像。其次,我们需要引用我们将要推送的图像,其中还包括我们有权推送的帐户的名称。

因此,我们将使用以下命令从终端/命令行登录:

docker login --username {yourusername}

之后,docker 会要求您输入密码(以防万一,当您输入时,docker 不会显示密码)。如果登录成功,您将收到类似“登录成功”的响应。

之后,我们将提供我们计划推出新参考的本地图像。因为我们的旧本地镜像没有帐户引用,所以我们将提供它。图像也可以有多个参考。以下是如何为本地图像提供新参考的示例:

docker image tag golang cantdocpp/golang:v1

所以现在我们有一个带有两个参考的图像。不同之处在于,一个图像中有一个帐户和版本号。现在让我们使用以下命令检查我们的图像列表:

docker image ls --filter reference=golang --filter reference='*/golang'

您会看到这两个图像具有相同的 ID。而且,关于图像大小,您会看到它们的大小也相同。但这只是虚拟大小。实际上,这两个图像与我们在这里学到的共享相同的图像层。

现在我们已经有了用于登录 docker hub 的带有 docker id 的镜像引用,我们可以开始推送镜像了。与我们用于将图像下载到本地计算机的 pull 命令相反,这次我们将使用 push 命令。这是命令:

docker image push cantdocpp/golang:v1

我们已经看到我们正在使用我们刚刚创建的新图像。我们还可以看到我们已经指定了帐户名称、图像名称和标签。所以我们必须确保我们真的在推动我们刚刚创建的图像。

从我们的终端/命令行中,我们可以看到其实 docker 是在推送镜像层。因此,我们的形象在物理上确实只是一回事,但实际上,我们的形象由许多层组成。这就是为什么我们必须花时间优化我们的 Dockerfile这里的原因。

如果我们的图像注册表中没有任何匹配的图层哈希,则上传到注册表的图层。例如,如果我们过去将相同的层推送到我们的注册表,那么这次将不再推送层。究竟发生了什么,docker 列出了我们注册表中的所有层哈希,如果有匹配,它不会被推送。就像 docker 在说“我只需要这个、这个和这个。因为我这里已经有了这个”。

推完之后。我们可以在我们刚才使用的 docker hub 账户中查看镜像。如果我们没有这个镜像的存储库,docker hub 会自动为我们创建它。默认情况下,存储库将具有公共权限。

Docker hub 也不是互联网上唯一可用的注册表。大多数云都有自己的注册服务。