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

qnt*_*ntm 30 docker

我是Docker的新手,并遵循入门教程.在第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
Run Code Online (Sandbox Code Playgroud)

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

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

这与容器无关.

wis*_*cky 16

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

最简单的答案:

图像:单个图像.

存储库:图像集合.

细节:

图像:由Image ID12位十六进制代码(例如91c95931e552)唯一引用.[1]

存储库:包含一个或多个图像.因此,hello-world存储库可以包含两个不同的图像:91c95931e5521234abcd5678.

Image alias- 我将定义image alias为表示引用特定图像的别名.a的格式image aliasrepository: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
Run Code Online (Sandbox Code Playgroud)

存储库是:docker/whalesay,hello-world.

这些图像是fb434121fc77,91c95931e552,1234abcd5678.请注意,第2行和第3行具有相同的Image ID,因此它们是相同的图像.

图像别名是:

docker/whalesay:latest
hello-world:latest
hello-world:v1.1
hello-world:v1.0
Run Code Online (Sandbox Code Playgroud)

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

额外细节:

  • Repository nameformat还可以添加可选的用户或命名空间,这在使用Docker Hub等公共注册表时非常有用.例如docker/whalesay.否则,您将遇到大量存储库名称冲突.

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

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


Tho*_*rig 12

引自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包含各种版本(latest,devel,v2相同的图像的):

$ 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
Run Code Online (Sandbox Code Playgroud)

在您的示例中,您有两个存储库(docker/whalesayhello-world),其中只包含一个标记图像(调用latest,这意味着实际上没有标记,并且显示了最新的图像).

  • 术语"存储库"甚至意味着什么?我觉得这很混乱. (3认同)
  • Docker存储库是具有相同名称的不同docker镜像的集合,具有不同的标记.标签是存储库中图像的字母数字标识符. (3认同)

BMi*_*tch 9

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

Image:这是用于以运行容器的方式打包应用程序的文件系统层和元数据。每个图像都必须在 docker 引擎上有一个 ID。

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

注册表:这是一个保存图像的服务器。与 Git 服务器保存源代码或二进制文件的工件服务器的方式类似,注册表是您推入和拉取图像的地方。

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

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


举个例子参考:

registry-server:5000/team/service-a:build-42
Run Code Online (Sandbox Code Playgroud)
  • “registry-server:5000”是您将推/拉此映像的注册服务器名称(和端口)。

  • “registry-server:5000/team/service-a”是存储库。

  • “build-42”是标签。

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

与您推送和拉取到服务器然后指定要在那里发送哪些文件的其他系统不同,将 docker 映像推入和拉出注册表服务器使用包含存储库和标签的引用来定义映像的目标和源姓名。因此,要将图像推送到不同的位置,您可以使用docker tag新的存储库和标签创建对同一图像的新引用(使用命令),然后针对该引用运行推送命令。

通常,当有人提到“映像名称”时,他们指的是存储库名称(如果您想单独指定标签)或可用于拉取或推送映像的完整引用。


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

docker image ls --format '{{.Repository}}' | sort -u
Run Code Online (Sandbox Code Playgroud)

sort -u由于您可能有多个具有相同存储库和不同标签的图像,因此我包含了对输出进行重复数据删除的内容。


Gio*_*uri 7

我将尝试以非常尖锐和清晰的方式解释这一点。

\n

Docker 映像名称\n
Docker 映像本身实际上没有\xe2\x80\x99t 名称。有一个IDRepository和一个Tag根据 Docker 文档,它代表Target Image ,而不是英文单词 tag)。因此,每次我们引用 Docker 镜像名称(创建、运行、删除、拉取等)时,我们实际上引用的是镜像存储库:标签 (目标镜像)
我们经常会忽略标签部分(只写存储库名称,我们将其视为镜像名称),并且当 docker 假定默认标签:latest(即最新目标镜像)时,\xe2\x80\x99s

\n

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

\n

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

\n

PS
\n我们用来调用 Docker Image 名称的方式实际上是(并且可以假设为)Docker Image Repository[:tagname],默认情况下后者是可选的:latest

\n

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

\n

希望这能让更多人了解这个话题。

\n