在上一个实验中我们验证了通过docker commit命令生成镜像时,会在原有的镜像层之上添加一个新的层。接下来我们来看一下通过docker build方式生成的镜像的层次结构。
-
查看镜像层次
我们也用docker inspect命令来查看一下镜像img6-1的层次信息,结果会发现docker build在基础镜像之上构建多个了新的镜像。
docker inspect -f "{
{json .RootFS.Layers}}" img6-1 | jq
-
查看镜像历史
通过docker build生成的镜像。除了docker inspcet之外,还可以通过docker history命令来查看通过Dockerfile定义的镜像的生成方式。我们可以看到docker history命令输出了镜像构建的过程信息,通过这一信息我们能比较清晰的看到镜像作者在制作镜像时的具体操作。
docker history img6-1
-
镜像层次和镜像历史之间的关系
当我们执行上两个步骤的时候,细心的同学可能会发现,docker history中的每一个步骤都会生成一个中间状态的镜像,但是镜像的层数和镜像的步骤并不是严格的一一对应关系。这是因为docker会自动压缩一些没有实际产生数据修改的镜像,将多个临时镜像压缩成一层。比如WORKDIR命令所生成的中间状态。
同样我们可以比较img6-2和img6-3镜像。我们会发现虽然这两个镜像包含了很多的步骤,但是由于没有实际向镜像中写入文件,因此这两个镜像的存储层实际上和基础镜像ubuntu的存储层保持一致,这就以为着这两个镜像并没有在看本地镜像仓库中额外消耗存储控件。
docker history img6-2
docker inspect -f "{
{json .RootFS.Layers}}" img6-2 | jq
docker history img6-3
docker inspect -f "{
{json .RootFS.Layers}}" img6-3 | jq
docker inspect -f "{
{json .RootFS.Layers}}" ubuntu | jq
前面的实验中我们学习了如何通过docker commit命令将一个编辑好的容器,生成一个新的镜像。但是这种方法生成的容器可以查看的只有文件层面的变更内容,容器的使用者往往会搞不清楚在容器制作过程中执行了什么命令,按什么顺序执行了这些命令或者操作。因此除了这种方法之外,Docker还提供了另一种docker build的方式来构建容器。
-
制作Dockerfile文件
要使用docker build的方式制作容器,我们需要先制作Dockerfile文件。D