在Docker中,图像和存储库有什么区别?

我是Docker的新手 ,遵循入门教程 。 它在步骤7说

inputdocker images命令并按回车键。 该命令会列出本地系统上的所有图像。 你应该在列表中看到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 

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

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

这与容器无关。

从官方的Docker文档引用:

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

(请参阅: https : //docs.docker.com/userguide/dockerimages )

这意味着:一个Docker镜像可以属于一个仓库,例如当它被推送到一个Dockerregistry(用docker push my/reporitory:version1 )。 另一方面,存储库包含多个版本的图像(=不同的标签)。 所以当你构build一个新版本的图像时,你可以给它一个标签( 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 

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

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

最简单的答案:

图像:单个图像。

储存库:一组图像。

细节:

图像:由Image ID唯一引用的12位hex代码(例如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

图像是1234abcd5678 。 请注意,第二行和第三行具有相同的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这样的公共registry时非常有用。 例如docker/whalesay 。 否则,将会有很多库名称冲突。

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

  • [1]实际上,完整的图像ID是一个64位的hex代码,截至12位数字,但你不需要关心这一点。

图像是通过运行Dockerfile docker build一个给定的Dockerfile docker build ,并由它们的ID标识。

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

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

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

下面,从这个答案中 ,给出了docker images输出的详细解释(这可能是他们应该在文档中放置的):

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