Docker 注册表与存储库的区别

我对 docker 注册中心和存储库之间的区别感到困惑。Docker 文档似乎可以互换地使用这两个词。此外,存储库有时也被称为图像,比如它们的文档中的这个:

为了将存储库推送到它的注册中心,您需要将 一个映像或者将您的容器提交到一个命名映像,正如我们在这里看到的。

现在,您可以将此存储库推送到其 姓名或标签。

如何将存储库推送到注册表? 难道不是将映像推送到存储库吗?

77237 次浏览

Docker 注册表是存储您的 Docker 映像的服务。

Docker 注册中心可由第三方作为公共或私有注册中心托管,如下列注册中心之一:

或者你可以自己托管 Docker 注册表
(详情请参阅 https://docs.docker.com/ee/dtr/)。

Docker 存储库是具有相同名称的不同 Docker 映像的集合,这些映像具有不同的标记。Tag 是存储库中图像的字母数字标识符。

例如,请参阅 https://hub.docker.com/r/library/python/tags/。官方 python 映像有许多不同的标记,这些标记都是 Docker Hub 上的官方 python 存储库的成员。Docker Hub 是由 Docker 托管的 Docker 注册中心。

欲知详情,请阅读:

从书 使用 Docker,开发和部署带有容器的软件

注册表、存储库、图像和标记

有一个存储图像的分层系统。 使用的术语如下:

注册处

负责托管和分发映像的服务。默认注册表是 Docker Hub。

仓库

相关映像的集合(通常提供同一应用程序或服务的不同版本)。

标签

附加到存储库中的图像的字母数字标识符(例如,14.04或稳定)。

因此,命令 docker pull amouat/revealjs:latest将从 Docker Hub 注册中心下载 amouat/revealjs存储库中最新标记的映像。

补充信息:

  • 您通常将存储库推送到注册表(以及作为其一部分的所有映像)。但是您可以将单个图像推送到注册表中。在所有情况下,都使用 docker push
  • 一个图像具有12个十六进制数字的图像 ID,但是也由: namespace/repo-name:tag标识
  • 映像全名可以选择以注册表主机名和端口 myregistryhost:5000/namespace/repo-name:tag作为前缀
  • 一个常见的变数命名原则是使用您的注册表用户名作为我所说的“名称空间”。

Docker 存储库是 registryimage的可爱组合。

docker tag foo <registry>/<image>:<tag>

docker tag foo <repository>:<tag>

Docker Registry 是一个服务,您可以自己托管(受信任的和私有的) ,也可以让 Docker hub 成为此服务的主机。通常,如果您的软件是商业软件,那么您将把它作为“私有和受信任”注册表托管。对于 JavaDevelopers 来说,这有点类似于 MavenArtiFactory 设置。

Docker Repository 是一组“标记”图像,例如你可能标记了5个 ubuntu:latest图像:

A) Nano 编辑器(image 1 _ tag: v1)

B)特定的软件1(image 1 _ tag: v2)

C) Sudo (image 1 _ tag: v3)

D) apache http 守护进程(image 1 _ tag: v4)

E) tomcat (image 1 _ tag: v5)

可以使用 docker push命令将上述每个映像推送到存储库。只要存储库名称匹配,就会成功地推送它们,并显示在您选择的存储库下并正确地进行标记。

现在,您的问题是,“这个存储库在哪里托管/谁来管理服务”?这就是 Docker 注册处出现的地方。默认情况下,您将获得一个 docker hub 注册表(Open Source) ,您可以使用它来保存您的私有/公共存储库。因此,不需要任何修改,您的映像将被推送到 Docker hub 中的私有存储库中。推动图像标签时的输出示例如下:

docker@my-docker-vm:/$ docker push mydockerhub/my-helloworld-repo:my_tag
The push refers to repository [docker.io/mydockerhub/my-helloworld-repo]
bf41e934d39d: Pushed
70d93396f87f: Pushed
6ec525dfd060: Pushed
705419d10b13: Pushed
a4aaef726d02: Pushed
04964fddc946: Pushed
latest: digest: sha256:eb93c92351bce785aa3ec0de489cfeeaafd55b7d90adf95ecea02629b376e577 size: 1571
docker@my-docker-vm:/$

如果您立即输入 docker images --digests -a,您可以确认您的推送图像标记现在正在显示由 docker hub 注册中心管理的私有存储库的新签名。

Docker Hub 和其他第三方存储库托管服务被称为“注册中心”。

由于注册表可以有许多存储库,而存储库可以有同一映像的许多不同版本,这些版本可以单独使用标记进行版本控制。

Docker 映像注册表是存储所有 Docker 映像的地方。映像注册表允许您根据需要推送和拉取容器映像。

注册中心可以是私有的,也可以是公有的。当注册中心是公共的时候,图像将与全世界共享,而在私人注册中心,图像只能在企业或团队的成员之间共享。

注册表使得 Docker 守护进程可以轻松地拉取和运行您的 Docker 映像。

混淆始于标记的这个定义: “附加到存储库中图像的字母数字标识符”

我更愿意称之为字母数字标识符,您现在在后面添加一个’:’标记后缀。当有人说“‘ last’是默认标记”时,就意味着这种标记后缀。

实际上,从技术上讲: last’后缀是标记的一部分。整个名字是一个标签。所有这些都是标签(可能指的是同一张图片) :

我的名字 我的图片名: 最新 用户名/他们的文件名: 1.0 Myrepo: 5000/username/imagename: 1.0

(我在这里说了 image name,只是为了说明造成混淆的另一个主要原因。当然,这是存储库的名称。对不起。)

例子:

A)在构建映像时,如果想为映像命名,可以使用 docker build -t thisname ...——即-t 表示标记,(而不是-n 表示名称)。

B)当你想把图像推送到注册中心时,你需要有完整的 URL (以 registryname 开始,以 tag-affix 结束)作为标签:

docker tag thisname mylocalregistry:5000/username/repoimagething:1.0

现在你按下这个名字的图片,说:

docker push mylocalregistry:5000/username/repoimagething:1.0


给东西命名很难。 唉! 存储库不是你放东西的“容器”(啊... ...) ,那是麻瓜们的想法... ..。