Docker注册表和存储库之间的区别


146

我对docker注册表和存储库之间的差异感到困惑。似乎Docker文档会交替使用这两个词。此外,存储库有时也称为图像,例如来自其文档的图像:

为了将存储库推送到其注册表,您需要已命名映像或将容器提交到已命名映像,如此处所示。

现在,您可以将此存储库推送到由其名称或标记指定的注册表。

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


4
docker映像vs docker存储库怎么办?
查理·帕克


1
如果您知道的git话-Docker Registry(默认为hub.docker.com)=> GitHub(github.com); -Docker 存储库 => Git存储库; -Docker 标记 => Git引用(分支/标记)
go2null19年

更好地将Docker映射到Git:•Docker注册表= Git服务器•Docker存储库= Git存储库•Docker标签= Git标签(或多或少)
Simon Woodside

Answers:


169

Docker注册表是一项用于存储Docker映像的服务。

Docker注册表可以由第三方托管,可以是公共或私有注册表,例如以下注册表之一:

或者您可以自己托管Docker注册表
( 有关更多详细信息,请参见https://docs.docker.com/ee/dtr/)。

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

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

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


11
Artifactory是一个要添加到列表中的人;)我们使用它
buildmaestro 2016年


1
docker中的存储库和映像有什么区别?
查理·帕克

1
存储库可以存储由标签标记的多个不同图像。
Nemanja Trifunovic

2
为什么单个图像具有多个标签有意义?
查理·帕克

64

摘自《使用Docker》一书,使用容器开发和部署软件

注册表,存储库,图像和标签

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

登记处

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

资料库

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

标签

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

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


1
所以一个图像可以有多个标签吗?
查理·帕克

1
@charlie是的。例如,现在ubuntu:latestubuntu:16.04具有相同的Image ID,这意味着它们只是同一张图片的多个标签。
wisbucky

发生问题的地方在的文档中docker pull,该文档的内容部分为:“要下载特定的映像或一组映像(例如,存储库),请使用docker pull。如果未提供标签,则Docker Engine将使用该:latest标签作为默认标签。 ” 那么,如何“下载……一组图像(即存储库)”?🤔–
莱尔德·纳尔逊

1
随机信息:默认注册表URL为docker.io
yosefrow 19'Aug

1
我将其形象化为一棵树,其中注册表是具有多个子存储库的根,并且每个存储库都有image:tag作为其子存储库。这些级别中的每个级别都有特定的角色-注册表就像是托管位置,存储库是映像目录。我的理解正确吗?
Ultrablendz

12

补充信息:

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

3
我明白您的意思,但从技术上讲,没有这样的东西image-nameuser-name/repo-name:tag根据Docker文档格式应该是。(我希望Docker使用了更好的术语,这非常令人困惑,并且它们甚至一直都不一致)。
wisbucky

@wisbucky谢谢!我更新了答案。的确,一年前我回答这个问题时文档并不那么好。例如,那时我在docker github存储库上创建了一个问题,因为docker词汇表不包含“ layer”和“ namespace”(!)
Paulo Merson

1
以及当您刚刚输入诸如nimmis / docker-alpine-java:latest之类的东西时,docker如何计算出公共注册表的IP地址
亚当

1
糟糕-– docker info |grep Registry
亚当

2

码头工人,仓库是一个可爱的组合registryimage

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

是相同的

docker tag foo <repository>:<tag>

0

Docker Registry是一项服务,您可以托管自己(Trusted和Private),也可以让Docker Hub作为该服务的主机。通常,如果您的软件是商业软件,则将其托管为“私人和受信任”注册表。对于Java开发人员,这有点类似于Maven Artifactory设置。

Docker Repository是一组“标记”映像。例如,您可能标记了5张ubuntu:latest图像:

a)纳米编辑器(image1_tag:v1)

b)特定软件1(image1_tag:v2)

c)须藤(image1_tag:v3)

d)apache http守护程序(image1_tag:v4)

e)雄猫(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命令将上述每个映像推送到您的存储库”-您不会将映像推送到存储库,而是将存储库推送到注册表。还是我错了?
Impaler

0

Docker Hub和其他第三方存储库托管服务称为“注册表”。注册表存储存储库的集合。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.