在Docker中,图像和存储库有什么区别?
我是Docker的新手 ,遵循入门教程 。 它在步骤7说
input
docker 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/whalesay
和hello-world
),它只包含一个标记的图像(称为latest
,这意味着实际上没有标记,并显示最新的图像)。
是的,这是非常混淆的术语。
最简单的答案:
图像:单个图像。
储存库:一组图像。
细节:
图像:由Image ID
唯一引用的12位hex代码(例如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
。
图像是1234abcd5678
。 请注意,第二行和第三行具有相同的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这样的公共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
输出的详细解释(这可能是他们应该在文档中放置的):
- 图像ID是图像真实标识符的前12个字符。 你可以创build一个给定的图像的许多标签,但他们的ID都将是相同的(如上)。
- VIRTUAL SIZE是虚拟的,因为它将所有不同底层的大小相加。 这意味着该列中所有值的总和可能远大于所有这些映像使用的磁盘空间。
- REPOSITORY列中的值来自
docker build
命令的-t
标志,或来自docker tag
现有图像。 您可以使用一个对您有意义的术语来自由标记图像,但是要知道,docker会将该标记用作docker push
或docker pull
的registry位置。- 标签的完整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
。- TAG列只是完整标签的[:TAG]部分。 这是不幸的术语。
- 在容器中运行shell脚本并删除它?
- 在Azure应用服务中使用Docker容器时装入卷
- 如何清理/最大限度地减lessdockerfile中构buildopencv的容器的存储使用情况
- kubernetes上的kafka不能产生/消耗主题(ClosedChannelException,ErrorLoggingCallback)
- 在运行在Docker for Windows上的Docker容器中公开的端口上没有接收到UDP通信。 如何debugging?
- Docker:将主机端口映射到多个docker容器
- 为什么我得到'无法解决从registry2docker registry.giantswarm.io“'错误?
- 使用Django 1.11从Docker Selenium运行LiveServerTestCase
- 装入泊坞窗主机卷,但用容器的内容覆盖