图像和存储库之间有什么区别?

时间:2015-06-29 11:57:51

标签: docker

我是Docker的新手并且遵循Getting Started tutorial。在第7步它说

  

键入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

但是第一栏明确说明"存储库",而不是例如"图片名称"。我也注意到在其他人的机器上,因为图像可以有多个标签,所以这个列表通常包含重复的条目 - 每个标签一个。这是一个图像列表,一个存储库列表,一个图像标签组合列表或其他什么?图像和存储库之间有什么区别?

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

这与容器无关。

5 个答案:

答案 0 :(得分:15)

是的,这是非常令人困惑的术语。

最简单的答案:

图片:单张图片。

存储库:图像集合。

<强>详细信息:

图像:由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 Hub等公共注册表时非常有用。例如。 docker/whalesay。否则,您将遇到许多存储库名称冲突。

  • 如果在引用图片别名时遗漏tag,则会自动添加:latest。因此,当您指定hello-world时,它将被解释为hello-world:latest。警告:latest实际上并不意味着什么特别的,它只是一个默认标记。

  • [1] 实际上,完整的图像ID是64位十六进制代码,截断为12位数,但您无需关心。

答案 1 :(得分:11)

引自Docker官方文档:

  

存储库可能包含图像的多个变体。

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

这意味着: Docker镜像可以属于存储库,例如当它被推送到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,这意味着实际上没有标记和最新图像显示)。

答案 2 :(得分:2)

通过使用给定docker build运行Dockerfile来构建

图片,并通过其ID进行标识。

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

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

  • 图片可以进入多个存储库

以下内容来自this SO answer,详细解释了docker images输出(这可能是他们应该在文档中添加的内容):

  
      
  1. IMAGE ID是图像的真实标识符的前12个字符。您可以创建给定图像的许多标记,但它们的ID会   都是一样的(如上所述)。

  2.   
  3. REPOSITORY列中的值来自-t命令的docker build标志,或来自docker tag现有图像。   您可以使用有意义的命名法自由标记图像   您,但知道docker将使用该标记作为注册表位置   docker pushdocker pull

  4.   
  5. 标记的完整形式为[REGISTRYHOST/][USERNAME/]NAME[:TAG]。对于上面的ubuntu,REGISTRYHOST被推断为   registry.hub.docker.com。因此,如果您计划存储您的图像   在my-application的注册表中docker.example.com,您应该标记   那张图片docker.example.com/my-application
  6.   
  7. TAG列只是完整标记的[:TAG]部分。这是一个不幸的术语。
  8.   

答案 3 :(得分:2)

在这里定义几个术语是最容易的,因为它们都是相互关联的:

图片:这是文件系统层和元数据,用于打包应用程序以运行容器。每个映像在Docker引擎上必须具有一个ID。

参考:这是指向图像的指针。引用的类型不同,或者只是图像ID,通常是存储库和标签,有时您将使用sha256哈希而不是可变标签固定到特定的校验和。重要的部分是您可以有多个指向同一图像的指针,并且除图像ID之外,没有其他对图像的引用。当您删除引用时,docker只会删除该指针,除非它是该图像ID的最后一个指针。

注册表:这是一个保存图片的服务器。类似于Git服务器保存源代码或用于二进制文件的工件服务器的方式,注册表是您在其中来回推送图像的地方。

存储库:注册表服务器上映像目录的路径是存储库。如果您未使用默认的Docker Hub注册表,则其中包括注册表主机名和端口。在图像参考中,此存储库是最后一个冒号和标签之前的部分。

标签:存储库中的特定图像。如果您未指定标签,则docker将默认使用标签名称“ latest”。这是最后一个冒号之后的部分,通常用于版本号。


以示例为例:

registry-server:5000/team/service-a:build-42
  • “ registry-server:5000”是您要在其中推/拉该映像的注册表服务器名称(和端口)。

  • “注册表服务器:5000 / team / service-a”是存储库。

  • “ build-42”是标签。

  • “ registry-server:5000 / team / service-a:build-42”是参考。

与其他系统不同,在其他系统中,您将服务器映像推入和拉出,然后具体指定要发送到该服务器的文件,将Docker映像往返注册表服务器推入和拔出使用定义了映像的目标和源,该引用包括存储库和以该名称标记。因此,要将图像推送到其他位置,您可以使用新的存储库和标签(使用docker tag命令创建对同一图像的新引用,然后针对该引用运行push命令。

通常,当某人引用“图像名称”时,他们指的是存储库名称(如果要单独指定标签)或可以用来拉入或推入图像的完整引用。


  

我怎样才能列出我的存储库?

docker image ls --format '{{.Repository}}' | sort -u

我添加了sort -u来消除输出的重复,因为您可能具有带有相同存储库和不同标签的多个图像。

答案 4 :(得分:1)

我将尝试以非常清晰明确的方式对此进行解释。

Docker映像名称
Docker Image实际上本身没有名称。它具有 ID 存储库 标记 >(根据Docker文档,代表 Ta rget Ima g e,而不是英文单词标签)。因此,每次我们引用Docker映像名称(创建,运行,删除,拉出它等等)时,我们实际上都引用 Image Repository:Tag (目标图像)
我们经常碰巧省略标签部分(只需编写存储库名称,我们将其视为图像名称),那就是docker假定默认标签为:latest(即最新的目标图片)

Docker存储库
Docker在构建/创建映像时,会为该映像创建存储库和本身的 Image ,然后将当前(:latest标签)映像添加到该存储库中。根据 Marko Luksa Kubernetes in Action ,图像标签使我们能够在同一图像名称下拥有同一图像的多个版本(标签)。因此,我们可能将 myapp:latest myapp:v1 myapp:v2 都放在一个标识符下,并且此处的每个标记都将引用一个特定的目标映像,即同一应用程序的特定快照/版本。
这就是为什么docker命名映像存储库并将区分工作留给标记的原因,因为一个存储库可能(并且必须)包含不同的版本相同的应用

因此,如果我们运行docker build -t A .,则docker实际上会创建一个 映像存储库A 和映像本身(使用:latest 标签)。然后,它将把该图像添加到存储库A中。稍后,我们将能够推/拉该图像的特定快照。

P。 S.
我们习惯称呼Docker映像名称的方式是(并且可以假定为) Docker Image Repository [:tagname] ,默认情况下,后者是可选的:latest

您可以测试所有这些并通过尝试删除图像而不指定标签来证明自己,并且该图像存储库中没有默认的:latest图像。只需运行docker rmi myimage,您就会看到,该码头工人会抱怨说,Error: No such image: myiamge默认情况下(当您不提供标签时)假定并暗示 :latest 标签。

希望这可以进一步阐明该主题。