3. 如何组装出一个镜像

什么叫"制作一个镜像"?

Aufs 在Docker中的玩法

上一节好像扯的有点远, 本来是想研究一下Docker是怎么管理这些层级, 以及这些层级分别是干啥的, 结果给扯到镜像ID上去了, 现在必须严肃起来了:

# 用busybox起一个容器
$ docker run -it busybox:latest sh

# 在容器内生成一个 1M 大小的文件
$ dd if=/dev/zero of=test bs=1M count=1

# 随便从容器里删掉一个文件
$ rm bin/find

# 然后用commit的方式生成镜像
$ docker commit a09 xiaohan-building:v2

我们在原有镜像的基础上做出了两个改动, 一个创建操作, 一个删除操作, 来看看按照 aufs 的玩法会发生什么呢? 我们先进入 docker 用来存储镜像的文件夹 /var/lib/docker

# 多出来的 4cd 这个文件夹, 代表我们新产生的层
$ cd /var/lib/docker && ls
ef4da5b601859191dabb3343818295bfaa2112ad # busybox 自带层
4cd218cc42c9b4368543b1dfcd47488145259b1d # 我们Commit所产生的层

$ cd 4cd218cc && ls
test bin root

$ ls -al bin
.wh.find
$ ls -al root
.ash_history

现在一切都真相大白了, 已经完全跟 aufs 一节里提到的知识对接上了, 我们在容器里一共执行了两个动作:

  • [创建] 创建出来的 /test文件, 被原模原样带到镜像里, 等待下次联合挂载的时候带到容器里

  • [删除] 删除的文件会以.wh文件的形式存在, 代表被删除了

如何组装出一个完整的镜像

我们在上一节里提到了, 一个ID唯一的决定一个镜像, 而一个ID是由镜像的配置文件所决定的. 换句话说, 一个完整的, 包含好几层的镜像, 是通过这个json文件组装出来的. 先把镜像整体搞出来, 看看完整的镜像包含那些内容

如何在Overlay2下组装出一个镜像

其实现在Ubuntu的默认选择已经切换成 Overlay2, 原因我们会在下一节介绍overlay2的时候再说, 简单来说是出于效率考虑, 我们先看看overlay2是怎么玩的, 本质上这两者的基本原理都离不开 union mounting , 先把你的容器存储驱动切换成 overlay2 并重启

Last updated

Was this helpful?