docker中的图层和图像有啥区别?

Posted

技术标签:

【中文标题】docker中的图层和图像有啥区别?【英文标题】:What's the differences between layer and image in docker?docker中的图层和图像有什么区别? 【发布时间】:2015-12-20 16:39:04 【问题描述】:

我知道图像由许多层组成。 例如,如果你运行“docker history [Image]”,你可以得到一个id的序列,并且最上面的ID与图像id相同,其余的ID都是层ID。

在这种情况下,这些休息层 ID 是否对应于其他一些图像?如果是真的,我可以将图层视为图像吗?

【问题讨论】:

【参考方案1】:

Layers 是 Docker 镜像和 Docker 容器的文件系统。

感谢层,当您pull a image 时,您最终不必下载其所有文件系统。如果您已经有另一个图像,其中包含您拉取的图像的某些层,则实际上只会下载缺少的层。

这些休息层 ID 是否对应于其他一些图像?

是的,它们就像图像,但没有任何标签来识别它们。

我可以将图层视为图像吗?

是的


展示案例

docker pull busybox
docker history busybox
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
d7057cb02084        39 hours ago        /bin/sh -c #(nop) CMD ["sh"]                    0 B
cfa753dfea5e        39 hours ago        /bin/sh -c #(nop) ADD file:6cccb5f0a3b3947116   1.096 MB

现在从层 cfa753dfea5e 创建一个新容器,就像它是一个图像一样:

docker run -it cfa753dfea5e sh -c "ls /"
bin   dev   etc   home  proc  root  sys   tmp   usr   var

【讨论】:

【参考方案2】:

图层和图像并非严格意义上的同义词。 https://windsock.io/explaining-docker-image-ids/

当您从 Docker 中心拉取图像时,“层”具有“”个图像 ID。 当您提交对本地构建的图像的更改时,这些层将具有图像 ID。直到你推送到 Dockerhub。只有叶图像具有所有其他用户拉取您上传的图像的图像 ID。

【讨论】:

【参考方案3】:

来自docker documentation:

Docker 映像是只读模板。例如,图像可能包含安装了 Apache 和 Web 应用程序的 Ubuntu 操作系统。镜像用于创建 Docker 容器。 Docker 提供了一种构建新镜像或更新现有镜像的简单方法,或者您可以下载其他人已经创建的 Docker 镜像。 Docker 镜像是 Docker 的构建组件。 每个图像由一系列层组成。 Docker 利用联合文件系统将这些层组合成一个图像。联合文件系统允许不同文件系统(称为分支)的文件和目录透明地叠加,形成一个单一的连贯文件系统。

Docker 如此轻量级的原因之一是这些层。当您更改 Docker 映像时(例如,将应用程序更新到新版本)时,将构建一个新层。因此,不像您对虚拟机所做的那样替换整个映像或完全重建,只需添加或更新该层。现在您无需分发全新的镜像,只需更新即可,让 Docker 镜像的分发更快更简单。

我喜欢看待这些事情的方式就像备份类型。我们可以创建完整备份,然后创建增量备份。完整备份不会更改(尽管在某些系统中为了减少每次增量备份后的还原时间,完整备份会更改以包含更改,但对于本次讨论,我们可以忽略这种情况)并且仅以单独的方式备份更改。所以我们可以有不同的备份层,就像我们有不同的图像层一样。

编辑: 查看以下链接了解更多信息:

Docker image vs container

Finding the layers and layer sizes for each Docker image

【讨论】:

以上是关于docker中的图层和图像有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

alpine docker image 和 busybox docker image 有啥区别?

修改 resnet 模型中的图层

VM 镜像和 Docker 镜像有啥区别? [复制]

Docker 中的“公开”和“发布”有啥区别?

在 App Engine 和 Compute Engine 中启动 docker 容器有啥区别?

使用图层和混合模式制作的 Paper.js 橡皮擦工具