2015-06-29 40 views
11

我是Docker的全新产品,并遵循Getting Started tutorial。在步骤7它说在Docker中,图像和存储库有什么区别?

类型docker images命令并按RETURN。该命令会列出本地系统上的所有图像。您应该在列表中看到docker/whalesay

$ docker images 
REPOSITORY   TAG   IMAGE ID   CREATED   VIRTUAL SIZE 
docker/whalesay  latest  fb434121fc77  3 hours ago  247 MB 
hello-world   latest  91c95931e552  5 weeks ago  910 B 

但第一栏清楚地写着 “仓库”,而不是如“图像名称”。我也注意到在其他人的机器上,因为图像可以有多个标签,这个列表通常包含重复条目 - 每个标签一个。那么这是图像列表,存储库列表,图像标签组合列表还是其他内容?图像和存储库有什么区别?

此外,鉴于图像和存储库是不同的东西,我怎么才能列出我的存储库?

这与容器无关。

+0

[泊坞图像VS容器]的可能重复(http://stackoverflow.com/questions/23735149/docker-image-vs-container) – Vitor

+0

不要混淆** **图像和* *图像的名称**。图像可以有许多名称:一个(唯一的)图像ID,它是一个散列,以及许多不同的存储库标签组合。 (这太令人困惑了,因为“存储库”对于图像名称的第一部分来说是一个非常糟糕的命名选择。) –

+1

@LutzPrechelt我仍然困惑“repostiory”这个词应该是什么意思。这是一个本地的东西还是与特定图像有关?在这一点上,我甚至可能会混淆“图像”这个词甚至意味着什么。 –

回答

6

从官方多克尔文档引用:

阿库可能保持图像的多个变体。

(参见:https://docs.docker.com/userguide/dockerimages

这意味着:阿泊坞图像可以属于一个存储库,例如当它被推送到一个Docker注册表(与docker push my/reporitory:version1)。另一方面,存储库包含多个版本的图像(=不同的标签)。因此,当您构建新版本的图像时,可以给它一个标签(docker tag 518a41981a6a my/reporitory:version2)并将其作为下一个版本(docker push my/reporitory:version2)推送到您的存储库。

下面是Docker文档示例(请参阅上面的链接)。正如你所看到的,它显示了一个名为ouruser/sinatra一个存储库包含同一图像的不同版本(latestdevelv2):

$ docker images ouruser/sinatra 
REPOSITORY   TAG  IMAGE ID  CREATED  VIRTUAL SIZE 
ouruser/sinatra  latest 5db5f8471261 11 hours ago 446.7 MB 
ouruser/sinatra  devel 5db5f8471261 11 hours ago 446.7 MB 
ouruser/sinatra  v2  5db5f8471261 11 hours ago 446.7 MB 

在你的榜样,你有两个仓库(docker/whalesayhello-world)只包含一个标记的图像(称为latest,这意味着实际上没有标记并显示最新的图像)。

+0

那么即使它们具有相同的ID,这三个图像也可能有所不同吗? – qntm

+0

是的。您可以执行以下操作:您的图像ID为“5db5f8471261”。现在,您可以使用一些新版本标记此映像:'docker tag 5db5f8471261 ouruser/sinatra:myversion'。这会为现有的存储库('ouruser/sinatra')添加一个新版本('myversion')。如果你调用docker images,你会看到另外一个条目,但是由于图像没有改变,它只有一个“新名字”,所以图像ID将是相同的('5db5f8471261')。 –

+0

版本和标签有什么区别? – qntm

1

图片通过运行docker build与给定的Dockerfile建成,并通过它们的ID进行标识。

存储库和标签只是在有意义的层次结构/体系结构中命名和组织图像的方法。

  • 存储库通常包含多个相关图像

  • 的图像可以进入多个仓库

下,从this SO answer,给人docker images输出的详细说明(这可能是什么他们应该把文件):

  1. 图像ID是图像真实标识符的前12个字符。你可以创建一个给定图像的很多标签,但是它们的ID将会与 一样(如上所述)。
  2. 虚拟尺寸是虚拟,因为它将所有不同底层的尺寸相加。这意味着该列中所有 值的总和可能远大于所有这些映像使用的磁盘空间 。
  3. REPOSITORY列中的值来自docker build命令的-t标志,或来自docker tag-现有映像。 您可以使用自己的名称自由标记图像,但您知道该图像会使用该标签作为 或或docker pull中的注册表位置。
  4. 标签的完整格式是[REGISTRYHOST/][USERNAME/]NAME[:TAG]。对于上面的ubuntu,REGISTRYHOST被推断为 registry.hub.docker.com。因此,如果您计划将名为 my-application的图像存储在注册表docker.example.com的注册表中,则应标记 图像0​​。
  5. TAG列只是完整标签的[:TAG]部分。这是不幸的术语。
2

是的,这是非常混淆的术语。

简单的答案:

图片:单个图像。

存储库:一组图像。

详细说明:

图片:由Image ID独特引用,则12位十六进制代码(例如91c95931e552)。 [1]

存储库:包含一个或多个图像。所以hello-world存储库可以包含两个不同的图像:91c95931e5521234abcd5678

Image alias - 我打算将image alias定义为引用特定图像的别名。 image alias的格式是repository:tag。这样,您可以使用人性化的别名,例如hello-world:latest而不是12位代码。

例子:

比方说,我有这些图片:

REPOSITORY   TAG   IMAGE ID 
docker/whalesay  latest  fb434121fc77 
hello-world   latest  91c95931e552 
hello-world   v1.1  91c95931e552 
hello-world   v1.0  1234abcd5678 

的仓库是:docker/whalesayhello-world

的图像是fb434121fc7791c95931e5521234abcd5678。请注意,第2行和第3行具有相同的Image ID,因此它们是相同的图像。

图像别名:

docker/whalesay:latest 
hello-world:latest 
hello-world:v1.1 
hello-world:v1.0 

所以hello-world:latesthello-world:v1.1只是对同一图像的两个别名。

其他细节:

  • Repository name格式也可以在前面加上可选的用户或命名空间,使用公共注册表像泊坞集线器时,这是非常有用的。例如。 docker/whalesay。否则,您将遇到很多存储库名称冲突。

  • 如果在引用图像别名时忽略了tag,它会自动添加:latest。所以当你指定hello-world时,它将被解释为hello-world:latest。警告:latest实际上并不意味着什么特别的东西,它只是一个默认标签。

  • [1]实际上,完整的图像ID是一个64位十六进制代码,被截断为12位数字,但你不需要关心这一点。

相关问题