Docker镜像仓库和仓库之间的区别

189
我对Docker的仓库和注册表之间的区别感到困惑。 Docker文档似乎将这两个词混为一谈。此外,仓库有时被称为镜像,例如在文档中所述:
“为了将存储库推送到其注册表,您需要命名一个图像或将容器提交给命名的图像,如我们在此处看到的。”
“现在,您可以将此存储库推送到其名称或标记指定的注册表。”
那你怎么能将一个仓库推送到注册表呢?难道不是将镜像推送到仓库吗?

6
Docker 镜像与 Docker 仓库之间的区别是什么? - Charlie Parker
1
对于镜像和仓库的区别:https://dev59.com/710Z5IYBdhLWcg3wvSZ2 - wisbucky
4
如果你了解 git,那么:
  • Docker 的“Registry”(默认为 hub.docker.com)等同于 GitHub 上的“Repository”(github.com);
  • Docker 的“Repository”等同于 Git Repository;
  • Docker 的“Tag”等同于 Git 引用(分支/标签)。
- go2null
为了更好地将Docker映射到Git: • Docker Registry = Git服务器 • Docker Repository = Git存储库 • Docker Tag = Git标签(或多或少) - Simon Woodside
8个回答

222

Docker registry是存储您的Docker镜像的服务。

Docker registry可以由第三方托管,作为公共或私有库。以下是一些常见的Docker registry:

或者您也可以自行搭建Docker registry
(详见https://docs.docker.com/ee/dtr/)。

Docker repository是具有相同名称但不同标签的不同docker镜像的集合。 标签是仓库中镜像的字母数字标识符。

例如,请参见https://hub.docker.com/r/library/python/tags/。官方Python镜像有许多不同的标签,这些标签都是Docker Hub上官方Python仓库的成员。Docker Hub是由Docker托管的Docker Registry。

要了解更多信息,请阅读:


12
Artifactory 是可以加入列表的一种工具 ;) 我们使用它。 - buildmaestro
3
这是Artifactory的链接 - https://www.jfrog.com/confluence/display/RTF/Docker+Registry - JBaruch
2
仓库和镜像在Docker中有什么区别? - Charlie Parker
2
在编程中,单个图像有多个标签是有意义的原因是什么? - Charlie Parker
1
这是否意味着当我安装 Docker 并在本地构建时,我拥有一个本地仓库(不是公共的)? - basickarl
显示剩余6条评论

81

从书中 使用Docker,使用容器开发和部署软件

注册表、仓库、镜像和标签

有一个用于存储镜像的层次结构系统。使用以下术语:

注册表

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

仓库

一组相关联的镜像(通常提供相同应用程序或服务的不同版本)。

标签

附加到仓库中镜像的字母数字标识符(例如 14.04 或 stable )。

因此,命令docker pull amouat / revealjs:latest将从Docker Hub注册表下载位于amouat/revealjs仓库中标记为latest的镜像。


1
一个图片可以有多个标签吗? - Charlie Parker
1
@charlie 是的。例如,现在 ubuntu:latestubuntu:16.04 具有相同的“Image ID”,这意味着它们只是同一镜像的多个标签。 - wisbucky
这里出现问题的是 docker pull 的文档,其中部分内容如下:“要下载特定的镜像或一组镜像(即存储库),请使用 docker pull。如果未提供标签,则 Docker Engine 将使用 :latest 标签作为默认标签。” 那么,如何“下载一组镜像(即存储库)”呢? - Laird Nelson
1
随机信息:默认的注册表URL是docker.io。 - yosefrow
1
我将其想象成一个树形结构,注册表是根节点,有多个子节点仓库,每个仓库都有images:tag作为其子节点。每个层级都有特定的角色 - 注册表就像是托管位置,而仓库则是图像目录。我的理解正确吗? - Ultrablendz
混淆始于标签的定义:“附加到图像的标识符…”这是人们在提到标签时最常用的方式。例如,“latest”是默认标签。 - Jürgen Weigert

16

补充信息:

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

4
我理解您的意思,但从技术上讲,并不存在“image-name”这种格式。根据Docker文档 ,格式应该是“user-name/repo-name:tag”。(我希望Docker使用了更好的术语,因为它非常令人困惑,而且有时还不一致)。 - wisbucky
@wisbucky 谢谢!我更新了我的答案。事实上,当我一年前回答这个问题时,文档并不是很好。例如,那时候我在docker的github仓库上创建了一个问题,因为docker词汇表中没有包含“层”和“命名空间”(!) - Paulo Merson
1
当您只输入类似nimmis/docker-alpine-java:latest这样的内容时,Docker如何确定公共注册表的IP地址? - Adam
1
抱歉 - docker info |grep Registry - Adam

4
一个Docker仓库是一个可爱的组合,包括注册表镜像
docker tag foo <registry>/<image>:<tag>

是相同的意思

docker tag foo <repository>:<tag>

1
一个Docker镜像注册表是存储所有Docker镜像的地方。镜像注册表允许您按需推送和拉取容器镜像。
注册表可以是私有或公共的。当注册表是公共的时,镜像将与全世界共享,而在私有注册表中,镜像仅在企业或团队成员之间共享。
注册表使得Docker守护程序能够轻松地拉取和运行您的Docker镜像。

1
Docker Registry是一个服务,您可以自己托管(可信和私有),也可以让docker hub成为此服务的主机。通常,如果您的软件是商业软件,则会将其托管为“私有和受信任”的注册表。对于Java开发人员,这在某种程度上类似于Maven Artifactory设置。
Docker Repository是一组“带标记”的镜像。例如,您可能已经标记了5个ubuntu:latest镜像:
a)Nano编辑器(image1_tag:v1)
b)特定软件1(image1_tag:v2)
c)Sudo(image1_tag:v3)
d)apache http守护程序(image1_tag:v4)
e)tomcat(image1_tag:v5)
您可以使用docker push命令将上述每个镜像推送到您的存储库中。只要存储库名称匹配,它们就会成功推送,并出现在您选择的存储库下并正确标记。
现在,你的问题是:“这个仓库被托管在哪里/谁在管理这项服务?” 这就是Docker Registry发挥作用的地方。默认情况下,您将获得一个Docker Hub注册表(开源),您可以使用它来保留您的私有/公共存储库。因此,不需要进行任何修改,您的镜像将被推送到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 push命令将上述每个镜像推送到您的存储库” - 您不会将镜像推送到存储库,而是将存储库推送到注册表。或者我错了吗? - The Impaler

0

Docker Hub和其他第三方仓库托管服务都被称为“注册表”。注册表存储了一系列的代码仓库。

由于一个注册表可以拥有很多的代码仓库,而每个代码仓库又可以包含许多不同版本的相同镜像,这些镜像是通过标签逐个进行版本控制的。


0
混淆起源于标签的定义:“附加到存储库中图像的字母数字标识符”。
我更愿意暂时称这个带有“:”的字母数字标识符为标签后缀。当有人说“'latest'是默认标签”时,就是指这种标签后缀。
实际上,“:latest”后缀技术上是标签的一部分。整个名称都是一个标签。所有这些都是标签(可能指向同一图像):

myimagename myimagename:latest username/theirimagename:1.0 myrepo:5000/username/imagename:1.0

(我在这里说imagename,只是为了说明另一个主要的混淆源。当然,那就是repositoryname。抱歉。)

示例:

a)当您想要在构建时命名图像时,使用docker build -t thisname ...——即-t表示标签(而不是-n表示名称)。

b)当您想要将该图像推送到注册表时,您需要将完整的URL(以registryname开头,以标记后缀结尾)作为标记:

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

现在,您可以通过以下方式推送称为thisname的图像:

docker push mylocalregistry:5000/username/repoimagething:1.0


给东西命名是很困难的。 哎呀!一个代码库不是一个“容器”(啊啊啊...)你把东西放进去,这是麻瓜们的想法...

我会将“整个东西”称为参考,而不是标签。将标签的定义仅限于冒号后面的部分。 - BMitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接