本文已参与「新人创作礼」活动,一起开启掘金创作之路
Docker镜像讲解
什么是镜像
镜像就是轻量级的,可独立执行的软件包
镜像包含了一个软件运行所需要的所有内容,包括代码,库,环境变量和配置文件
获取镜像
- 从远程仓库下载
- 从别人那里直接拷贝
- 自己制作镜像
Docker镜像加载原理
联合文件系统(
UnionFS)
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。
Docker镜像加载原理
docker的镜像实际上是由一层一层的文件系统构成,这种层级的文件系统UnionFS。
主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的linux/unix系统是一样的,包含boot加载器内核。当boot加载完之后整个内核就都在内存中了,此时内存的使用权已经由bootfs交给内核了,此时系统也会卸载bootfs
rootfs(root file system),在bootfs之上,包含的就是典型Linux系统中的/dev,/porc,/bin,/etc等便准目录和文件
总之就是有共同的地方就直接共同使用,只需要下载不同的地方即可
分层理解
注意我们在下载镜像的时候都是分层下载,一层一层的
这里我们这么理解:所有的Docker在起始的时候都一层基础镜像,比如ubuntu,centos这种类似的系统内核,我们每修改或者添加一个新的文件级的镜像,我们就会有一个记录在已存在的镜像之上,如下图所示:
这里我们的基础镜像是Ubuntu16.04,在此之后我们下载一个python安装包,那么此时在基础镜像上我们会多一个python的记录,这就形成了第二层镜像,此后我们在这个第二层镜像上加一个安全补丁,这样我们就形成了三层镜像
以上是基于镜像层之间的关系,而在真实添加镜像的时候层的内部也是如此
如图:
这里我们的第二层文件遵循原则把与第一层不一样的文件4,5,6保留了下来,至此我们才达到了“重复就共用,不重复就保留”的原则,此时把镜像1,2层压缩就得到了新的镜像,这里的镜像包括了6个文件
上图是第2层的文件5被修改更新后在第三层镜像的文件7就会替换文件5,此时我们把三层镜像压缩就会得到另一个新的镜像
最终镜像打包以后就会形成如下图所示:
特点
Docker的镜像都只是可读的,而我们在启动容器的时候会多一层容器层在镜像层之上,我们所有的操作都是基于这个容器层来进行的