什么是Docker图像“图层”?

我对Docker是全新的,并且正在努力理解Docker 镜像究竟是什么。 从字面上看,Docker镜像的每个定义都使用术语“图层”,但令人惊讶的是,实际上并没有定义图层的含义。 从官方Dockers文档 :

我们已经看到,Docker镜像是从中启动Docker容器的只读模板。 每个图像由一系列图层组成。 Docker使用联合文件系统将这些图层合并为一个图像。 联盟文件系统允许单独的文件系统(称为分支)的文件和目录被透明地覆盖,形成一个统一的文件系统。

所以我问: 什么是一层(确切地说); 有人可以举几个具体的例子吗? 而这些层怎样“拼合在一起”形成一个图像呢?

我可能会迟到,但这是我的10美分(补充ashishjain的答案):

基本上,图层或图像层是图像或中间图像上的变化 。 您在Dockerfile中指定的每个命令( FROMRUNCOPY等)都会导致先前的图像发生更改,从而创build一个新图层。 当你使用git的时候,你可以把它看作分段修改:你添加一个文件的修改,然后是另一个,然后是另一个修改…

考虑下面的Dockerfile:

 FROM rails:onbuild ENV RAILS_ENV production ENTRYPOINT ["bundle", "exec", "puma"] 

首先,我们select一个起始的图像: rails:onbuild ,它依次有很多层 。 我们在起始图像的顶部添加另一个图层,使用ENV命令设置环境variablesRAILS_ENV 。 然后,我们告诉docker运行bundle exec puma (启动rails服务器)。 这是另一层。

在构build图像时,层的概念派上用场。 因为图层是中间图像,所以如果对Dockerfile进行更改,docker将构build已更改的图层以及之后的图层。 这被称为图层caching。

你可以在这里阅读更多。

docker工人容器图像是使用dockerfile创build的。 dockerfile中的每一行都会创build一个图层。 考虑下面的虚拟示例:

 FROM ubuntu #This has its own number of layers say "X" MAINTAINER FOO #This is one layer RUN mkdir /tmp/foo #This is one layer RUN apt-get install vim #This is one layer 

这将创build一个最终的图像,总层数将是X + 3

我认为官方文件给出了一个非常详细的解释: https : //docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/ 。

一个图像由多个通常由Dockerfile生成的图层组成,Dockerfile中的每一行都会创build一个新图层,其结果是一个图像,以repo:tag的forms表示,如ubuntu:15.04

欲了解更多信息,请考虑阅读上面的官方文档。

根据Docker的图像规范

图像由图层组成。 每一层都是一组文件系统的变化。 图层没有configuration元数据,如环境variables或默认参数 – 这些是整个图像的属性,而不是任何特定的图层。

所以,本质上,图层只是对文件系统所做的一系列更改。

从Docker v1.10开始,随着内容可寻址存储的引入,“层”的概念变得非常不同。 图层不具有图像或属于图像的概念,它们仅仅是可以跨图像共享的文件和目录的集合。 图层和图像分离。

例如,在一个基本图像的本地构build的图像上,比方说, ubuntu:14.04docker history命令产生图像链,但是一些图像ID将显示为“missing”,因为构build历史不再被加载。 组成这些图像的图层可以通过find

 docker inspect <image_id> | jq -r '.[].RootFS' 

如果存储驱动程序select是aufs ,则图层内容将存储在/var/lib/docker/aufs/diff 。 但是,这些图层是用一个随机生成的cachingID命名的,出于安全原因,似乎只有Docker Engine才知道图层和cachingID之间的链接。 我仍然在寻找一种方法来找出答案

  1. 图像与其构图层之间的对应关系
  2. 磁盘上图层的实际位置和大小

这个博客提供了很多见解。

谢谢@David Castillo提供有用的信息 。 我认为该图层是可以轻松完成或撤消的图像的一些二进制变化或指令。 它们是一步一步完成的,与图层上的图层一样,所以我们称之为“图层”。

欲了解更多信息,你可以看到像这样的“docker历史”:

docker图片 - 树
警告:' - 树'被弃用,它将很快被删除。 看用法。
 └─511136ea3c5a虚拟大小:0 B标签:scratch:latest
   └─59e359cb35ef虚拟大小:85.18 MB
     └─e8d37d9e3476虚拟大小:85.18 MB标签:debian:wheezy
       └─c58b36b8f285虚拟大小:85.18 MB
         └─90ea6e05b074虚拟大小:118.6 MB
           └─5dc74cffc471虚拟大小:118.6 MB标签:vim:latest