我是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
但是第一栏明确说明"存储库",而不是例如"图片名称"。我也注意到在其他人的机器上,因为图像可以有多个标签,所以这个列表通常包含重复的条目 - 每个标签一个。这是一个图像列表,一个存储库列表,一个图像标签组合列表或其他什么?图像和存储库之间有什么区别?
另外,鉴于图像和存储库是不同的东西,我怎么才能列出我的存储库?
这与容器无关。
答案 0 :(得分:15)
是的,这是非常令人困惑的术语。
最简单的答案:
图片:单张图片。
存储库:图像集合。
<强>详细信息:强>
图像:由Image ID
唯一引用的12位十六进制代码(例如91c95931e552)。 [1]
存储库:包含一个或多个图像。因此hello-world
存储库可能包含两个不同的图像:91c95931e552
和1234abcd5678
。
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/whalesay
,hello-world
。
图片为fb434121fc77
,91c95931e552
,1234abcd5678
。请注意,第2行和第3行具有相同的Image ID
,因此它们是相同的图像。
图像别名为:
docker/whalesay:latest
hello-world:latest
hello-world:v1.1
hello-world:v1.0
因此hello-world:latest
和hello-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
的存储库,其中包含同一图像的各种版本(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/whalesay
和hello-world
),其中只包含一个标记图像(称为latest
,这意味着实际上没有标记和最新图像显示)。
答案 2 :(得分:2)
docker build
运行Dockerfile
来构建图片,并通过其ID进行标识。
存储库和标记只是在有意义的层次结构/体系结构中命名和组织图像的方法。
存储库通常包含多个相关图像
图片可以进入多个存储库
以下内容来自this SO answer,详细解释了docker images
输出(这可能是他们应该在文档中添加的内容):
IMAGE ID是图像的真实标识符的前12个字符。您可以创建给定图像的许多标记,但它们的ID会 都是一样的(如上所述)。
REPOSITORY列中的值来自
-t
命令的docker build
标志,或来自docker tag
现有图像。 您可以使用有意义的命名法自由标记图像 您,但知道docker将使用该标记作为注册表位置docker push
或docker pull
。- 标记的完整形式为
[REGISTRYHOST/][USERNAME/]NAME[:TAG]
。对于上面的ubuntu
,REGISTRYHOST被推断为registry.hub.docker.com
。因此,如果您计划存储您的图像 在my-application
的注册表中docker.example.com
,您应该标记 那张图片docker.example.com/my-application
。- TAG列只是完整标记的[:TAG]部分。这是一个不幸的术语。
醇>
答案 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 标签。
希望这可以进一步阐明该主题。