docker中容器的运行离不开image,一个image中都存放有哪些东西呢?这些东西又是以何种方式组织在一起的呢?今天让我们来撕开这层面纱,看看image到底是什么样。
撕
导出tar包
首先我们使用docker save
,将一个docker image保存成tar包,我们以nginx官方镜像
为例
1 | docker images |
走近nginx目录
现在nginx.tar
已经被解开了,接下来就要进入nginx目录一探究竟了。首先tree
一下nginx目录,看看都有什么文件。
1 | tree -L 2 ./nginx |
从目录结构上来看,有三个总体的描述文件repositories
、manifest.json
、4efb2fcdb1ab05fb03c9435234343c1cc65289eeb016be86193e88d3a5d84f6b.json
,还有三个目录,这三个目录的结构基本相同都由json
、layer
、VERSION
组成。
通过这些名字,我们先简单猜测一下,image由很多layer组成,上层layer基于下层layer构建而成,下层layer基于基层layer构成。到底image是不是按我们的猜测构成的呢,让我们来看一看总体描述的三个文件。
manifest.json:
1 | {"Config":"4efb2fcdb1ab05fb03c9435234343c1cc65289eeb016be86193e88d3a5d84f6b.json","RepoTags":["nginx:1.11.3"],"Layers":["80cdba09b091f72276c031bd64488c3da5f82022812bc995f0859abe0855a872/layer.tar","c575e5db41b92dbf9e1814b8ea9cf989ef650e37cfcef12fa402e630db6a581f/layer.tar","01d69dac180439f10b5f2f06b71fa19c9f89fb85cb5fd543dba9bb2ca9b620ef/layer.tar"]}] |
通过manifest.json
文件我们可以看出,nginx:1.11.3
这个image的配置文件是4efb2fcdb1ab05fb03c9435234343c1cc65289eeb016be86193e88d3a5d84f6b.json
,layer一共有三个分别是80cdba09b091f72276c031bd64488c3da5f82022812bc995f0859abe0855a872/layer.tar
,c575e5db41b92dbf9e1814b8ea9cf989ef650e37cfcef12fa402e630db6a581f/layer.tar
,01d69dac180439f10b5f2f06b71fa19c9f89fb85cb5fd543dba9bb2ca9b620ef/layer.tar
。
image的配置文件中都对image进行了哪些配置呢?让我们来看一看
4efb2fcdb1ab05fb03c9435234343c1cc65289eeb016be86193e88d3a5d84f6b.json
1 | { |
看完这个配置文件我惊到了,如此庞大的一个配置文件告诉我们dockerfile能配的我能配,dockerfile不能配的我也能配。。。这个配置文件具体就不分析了。。。
刚刚看完那个累心的配置文件,接下来让我们来说说这三个layer,哪一个layer是入口呢?
repositories:
1 | {"nginx":{"1.11.3":"01d69dac180439f10b5f2f06b71fa19c9f89fb85cb5fd543dba9bb2ca9b620ef"}} |
我们通过查看repositories
可以看出1.11.3
这个版本的layer入口是01d69dac180439f10b5f2f06b71fa19c9f89fb85cb5fd543dba9bb2ca9b620ef
。那么三个layer之间的依赖关系怎样呢?让我们进入各个layer一探究竟吧。
layer 01d69dac180439f10b5f2f06b71fa19c9f89fb85cb5fd543dba9bb2ca9b620ef
该layer中的json
文件描述的本layer的配置信息
json:
1 | { |
我们可以看到parent
字段指出了当前layer的父layer是c575e5db41b92dbf9e1814b8ea9cf989ef650e37cfcef12fa402e630db6a581f
。
当前layer中数据内容请见layer.tar
layer.tar:
1 | tree ./layer |
layer c575e5db41b92dbf9e1814b8ea9cf989ef650e37cfcef12fa402e630db6a581f
该layer中的json
文件描述的本layer的配置信息
json:
1 | { |
该layer中的父layer是80cdba09b091f72276c031bd64488c3da5f82022812bc995f0859abe0855a872
当前layer中的数据内容请见layer.tar
layer.tar:
1 | tree -L 2 ./layer |
layer 80cdba09b091f72276c031bd64488c3da5f82022812bc995f0859abe0855a872
该layer中的json
文件描述的本layer的配置信息
json:
1 | { |
从配置中可以看出,没有parent
字段了。说明这个layer应该就是base layer了。(我十分好奇nginx镜像是用哪个基础镜像做出来的?)
当前layer中的数据内容请见layer.tar
layer.tar:
1 | tree -L 1 ./layer |
1 | cat ./layer/etc/debian_version |
噢,原来nginx镜像是基于debian 8.5做出来的。