深入理解Docker容器与镜像
镜像
镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,下面的这张图能够帮助读者理解镜像的定义。
从左边我们看到了多个只读层,它们重叠在一起。
除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker内部的实现细节,并且能够在主机(译者注:运行Docker的机器)的文件系统上访问到。
统一文件系统(union file system)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在 用户 的角度看来,只存在一个文件系统(就相当于以一种俯瞰的视角看左边的多个层)。即右图形式。
你可以在你的主机文件系统上找到有关这些层的文件。
需要注意的是,在一个运行中的容器内部,这些层是不可见的。
容器
容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
要点:容器 = 镜像 + 读写层。并且容器的定义并没有提及是否要运行容器。
运行态容器
一个运行态容器(running container)被定义为一个可读写的统一文件系统 + 隔离的进程空间 和 包含其中的进程。
下面这张图片展示了一个运行中的容器(灰色区域为该容器 运行的进程 )。
一个容器中的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层(read-write layer)。
下面这张图展示了这个行为:
镜像层
为了将零星的数据整合起来,我们提出了镜像层(image layer)这个概念。
下面的这张图描述了一个镜像层,通过图片我们能够发现一个层并不仅仅包含文件系统的改变,它还能包含了其他重要信息。
元数据(metadata)就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。
需要注意,只读层和读写层都包含元数据。
除此之外,每一层都包括了一个指向父层的指针。如果一个层没有这个指针,说明它处于最底层。
一个容器的元数据好像是被分成了很多文件,但或多或少能够在/var/lib/docker/containers/目录下找到,就是一个可读层的id。
这个目录下的文件大多是运行时的数据,比如说网络,日志等等。