之所以在之前没有讲什么是镜像和容器是因为如果你没有一个最初的认识,那么你就很难理解镜像和容器以及它们的区别。我相信在前面一章中的讲述中,你应该稍有体会容器是基于镜像构建的,同时构建了容器之后如果不删除就会一直存在,而且我们下载的镜像还可以继续构建更多容器。构建容器并不是把镜像放进容器里,而是容器基于这个镜像产生,容器体积很小,镜像会大一点,你就算本地没有镜像也可以运行容器,因为它会从HUB中下载。在容器中的所有的修改都不会影响镜像。
先用通俗易懂但是不太严谨的例子说明一下,我们用光盘镜像安装一台虚拟机,那个镜像是只读的,这一点和Docker的镜像一样,安装操作系统的过程就可以想象成用镜像构建一个容器。这里不要去拿原理对号入座,而是只要想象一下这个过程,因为毕竟底层不是一个东西。容器就类似装好的电脑,可以让你去操作,也可以写入数据,安装软件、配置网络环境等等,同时也可以保存你修改的数据。从上面这个描述来看和普通的虚拟机也没有区别,大体上你可以这么理解。不过你要知道,安装操作系统镜像会展开到磁盘上,运行容器的话镜像则不会。
顺便提一下,Docker上面的容器是共享宿主机内核的,普通虚拟化的虚拟机是独享内核的。
上面你有了对镜像和容器的大体认识,下面我们来说一下镜像和容器的具体内容。
镜像:
镜像是由文件系统叠加组成的,最底层是一个引导文件系统(bootfs),用户不会和这个文件系统有什么交集,当容器启动以后容器会被移动到内存中,这个引导文件系统就会被卸载。
镜像的第二层是root文件系统(rootfs),这个文件系统可以是一种或多种操作系统。在正常的Linux系统中rootfs只有在引导的时候是只读的,当系统启动以后它就是读写的,而在Dokcer里镜像root文件系统都是只读的,而且一般会有多个只读的rootfs文件系统,这是通过联合文件系统实现的。
也就是说镜像是由一堆的只读层组成的。任何人都可以基于现有镜像再封装一个只读层上去。下层只读层是上层的只读层的父镜像,但是最底层的镜像叫做基础镜像。