- 首先我一直误解一个东西(很蠢),就是我在读《docker容器实战》这本书的时候,看见书上说“容器在退出后并不会更改镜像,如果要持久化数据,就要通过commit保存镜像”,我最开始还以为如果对容器进行操作,退出时做的修改就没有了。后来发现退出容器后在进入停止的容器,做的修改任然存在,只不过是在容器中保存,而没有在以镜像的方式保存。
- 在docker不是特别老的版本中(1.10以后),镜像的ID与目录的
- 我用的是overlay2(默认)的存储驱动,所以容器存储在/var/lib/docker/overlay2目录下,可以看见这个目录有一堆名字很长的文件夹。而且这些和我们的容器的名字和镜像的名字都不一样。
-
下面用一些例子来加深对docker容器技术的理解
- 首先启动一个容器
- 这是我们可以看到/var/lib/docker/overlay2目录下,多了一个名字为f7bcdfc90910~~~~~的文件夹
- 在/var/lib/docker/image/overlay2/layerdb/mounts/目录下也存在一个同样名字的文件夹
- mount-id的文件内容如下:
- 这一串字符就是表示了我们刚才创建的容器的目录,这个目录在/var/lib/docker/overlay2下,这里目录里的内容是
- 其中merged是容器的挂载点,(从字面上比较好理解,就是合并之后的意思),diff目录是容器的可读可写层,初始为空,下面是merged、容器层(upperdir)、镜像层(lowerdir)之间的关系。
- link文件的内容如下
- 这个对应了/var/lib/docker/overlay2/l 文件夹下的目录下对应的文件夹名称。据说他保存了镜像层的短标识,用于解决mount参数中长字符超过页大小限制的问题。
- 下面在根目录下创建一个123132123的文件,内容为history
- 这时再查看diff文件夹和merged文件夹,就能发现多了个文件,其实这两个文件就是同一个,因为diff(可读写层)是挂载到merged目录中的。可以直接手动在diff文件中新建一个文件,再去merged中查看验证一下。
- 验证一下docker的写时复制(其实上面的那个例子就有点意思了)
- 我们更新下系统(这时候会在diff目录多出一堆东西,多出来的东西就是更新系统是对镜像的改变),然后下载个nano编辑器,对/etc/shadow文件进行改变,在最后一行加入注释:this is lp,保存——》退出。
这时候看diff目录下,多了一堆东西,看diff目录下有个/etc/shadow文件,打开看里面的内容和我们修改的一样。
- 然后查看merged目录下的/etc/shadow文件,可以发现与上面文件的内容一样,这也验证了我们前面说的merged挂在的方式,也就是如果容器层与镜像层有相同文件时,容器层的文件会覆盖镜像层的文件。实现修改的作用,这就是写时复制。
-
另外/etc/lib/docker的container目录等其他目录我还不是很理解,如果有人知道,可以一起分享,共同学习,共同进步。哈哈哈哈
本文知识介绍了下,我个人的对overlay2存储驱动的理解,这中存储驱动也是后来docker采取的默认驱动方式,正好刚学到这,写一点以共分享,自己以后忘了,也可以看看。可能文中有不对的地方,望大家一定指出,多谢^_^