首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图像和存储库之间有什么区别?

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

Stack Overflow用户
提问于 2015-06-29 11:57:50
回答 4查看 15.2K关注 0票数 62

我是新来的码头和跟随入门教程。在第七步,上面写着

键入docker images命令并按回车。该命令列出本地系统上的所有图像。您应该在列表中看到docker/whalesay。 $ docker映像库标记映像ID 3小时前创建了虚拟大小坞/whalesay最新fb434121fc77 247MB hello-世界最新91c95931e552周前910B

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

而且,考虑到图像和存储库是不同的,我如何才能列出我的存储库呢?

这与容器无关。

EN

回答 4

Stack Overflow用户

发布于 2015-06-29 12:35:42

引用自正式码头文件:

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

(见: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):

代码语言:javascript
复制
$ 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,这意味着实际上没有标记,并显示了最新的图像)。

票数 15
EN

Stack Overflow用户

发布于 2018-08-09 17:38:01

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

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

Reference:这是指向图像的指针。有不同类型的引用,或者仅仅是图像ID,通常它是一个存储库和标记,有时您将使用sha256散列而不是可变的标记将特定的校验和插入到特定的校验和中。重要的是您可以有多个指向同一图像的指针,并且不需要对图像ID以外的图像有任何引用。当您删除引用时,除非是指向该图像ID的最后一个指针,否则停靠者将只删除该指针。

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

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

标记:存储库中的特定映像。如果您没有指定标签,停靠者将默认为标签名“最新”。这是最后冒号之后的部分,通常用于版本号。

举个例子,参考:

代码语言:javascript
复制
registry-server:5000/team/service-a:build-42
  • “registry :5000”是注册表服务器名称(和端口),您将在其中推/拉此映像。
  • “注册表-服务器:5000/team/service-a”是存储库。
  • "build-42“是标签。
  • "registry-server:5000/team/service-a:build-42“是一个参考。

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

通常,当有人引用一个“图像名”时,他们指的是存储库名称(如果您想单独指定一个标记),或者是一个可以用来拉出或推送图像的完整引用。

我怎么能列出我的存储库呢?

代码语言:javascript
复制
docker image ls --format '{{.Repository}}' | sort -u

我包括了sort -u到dup输出,因为您可能有多个图像,具有相同的存储库和不同的标记。

票数 12
EN

Stack Overflow用户

发布于 2017-05-30 23:30:14

图片是通过使用给定的Dockerfile运行docker build来生成的,并由它们的ID来标识。

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

  • 存储库通常包含多个相关映像。
  • 图像可以进入多个存储库。

这就是答案中的以下内容详细解释了docker images输出(这可能是他们应该放在文档中的内容):

  1. 图像ID是图像的真正标识符的前12个字符。您可以为给定的图像创建许多标记,但是它们的ID都是相同的(如上面所示)。
  2. 存储库列中的值来自docker build命令的docker build标志,或者来自现有图像的docker tag-ing。您可以使用对您有意义的命名来标记图像,但是要知道,停靠者将使用标记作为docker pushdocker pull中的注册表位置。
  3. 标签的完整形式是[REGISTRYHOST/][USERNAME/]NAME[:TAG]。对于上面的ubuntu,REGISTRYHOST被推断为registry.hub.docker.com。因此,如果计划将名为my-application的图像存储在docker.example.com的注册表中,则应该标记该图像docker.example.com/my-application
  4. 标记列只是完整标记的:TAG部分。这是令人遗憾的术语。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31115098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档