开发者学堂课程【Docker 快速入门:Docker 镜像原理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/616/detail/9399
Docker 镜像原理
docker镜像
docker images 是镜像,以前留下过疑问,第一个是 Tomcat 为什么会这么大,第二个是镜像,就是千层饼,是一层套一层的花卷。
1.是什么
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件。搬家和你所在家的整栋楼都搬过去,镜像就是办了整栋楼。直接以镜像生成可运行的实例。
unionFs 联合文件系统:
Union 文件系统( UnionFS )是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( unite several directories into a single virtual
filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性是一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统,(假设花卷外面包了很多层,一个鸡蛋有鸡蛋壳,鸡蛋黄,鸡蛋白,一层嵌套一层一个同心圆一样)联合加载会把各层文件系统叠加起来,这样最终的文件会包含所有的底层文件和目录。
2.docker 镜像加载原理
docker 镜像底层原理是联合文件系统,1 层一层叠加,一个镜像是由多层打包构成
docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统 UnionFS.
bootfs(boot file system) 主要包含 bootloader 和
kernelbootloader 主要是引导加载 kernel,Linux 刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层是 bootfs。这一层与我们典型的 Linux/Unix 系统是-一样的,包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs。
rootfs (root file system),在 bootfs 之上。包含的就是典型 Linux 系统中的 /dev,/proc,/bin,/etc等标准目录和文件。rootfs 就是各种不同的操作系统发行版,比如 Ubuntu,Centos 等等。
Ubuntu,Centos 是 Linux 下具体概念的产品,他们内核相同只是定制的软件不一样
docker 实际而言真正干活的是 docker 上的容器,那些容器每一个都是精简版的Linux 系统,Boot 文件系统实际上就是一个 Linux 内核。
Docker 下面可以跑一个两百多兆精简版的 centos,他为什么这么小呢,因为内核部分够用,其他部分硬件不加载,只有这两个,对于一个精简的 os roptfs 可以很小,只需要包括最基本的命令工具和程序库就可以了,因为底层直接用 host 的kernel,自己只需要提供 roptfs 就行了,言下之意,Rootfs 是 centos,docker 就弄成 centos,如果是 Ubuntu 就是 unbuntu,由此可见,对于不同的 Linux 发行版 bootfs 基本是一致的,rootfs 会有差别,因此不同的发行版可以共用 bootfs。
3.分层的镜像
以 pull 为例,在下载的过程中可以看到 docker 的镜像好像是在一层一层的在下载,原来讲过 docker pull hello-world,这时是一个镜像,根据所讲,一个镜像最终干活的镜像 docker images,还是用 hello world 进行讲解
最外面暴露的镜像 ID 是 3535063d 9957,但是下载了两个,说明 hello world 最终镜像模板也是有多层构成的,例如在下载一个 centos
可以看到 hello world 是两层,也相类似,这就可以回答大家的第一个问题,为什么 hello world 这么大,为什么 tomcat 这么大还没启动?
Tomcat 大家都明白,一般情况下不会 400 多 M。
里面椭圆形是 kernel 内核,内核就是 Ubuntu,Tomcat 要装在 Linux 上,但是在tomcat 运行时在需要,在 JAVA 学习过程中,一定要先学 JAVA 再学同步Tomcat,Kernel 是最底层的,上面装的是 centos,centos 上面再包一层,就像千层饼叠花卷一样 Tomcat 需要有 JAVA jdk8,联合系统文件一层套一层,最外面暴露的是 tomcat 镜像,但这个 tomcat 镜像要全部用起来,需要有内核 kennel,centos,Jdk 8, tomcat,最终变成了 tomcat image,然后跑到集装箱里面,就是 docker。
在表面上看,tomcat 应该不大,但是为什么会有四百多兆呢,到最后可以看到,他们看一套实际上是由多层文件构成的,一层在一层上面打包,最终是 jdk 加centos 加 Tomcat 构成的精简版的基于 Linux 平台的 Tomcat,所以他有四百多兆,这时就可以理解联合系统花卷了。
分层镜像在拉的时候,每个前面都有组件 ID,每一个都是一层,例如 mangodb 也拉了很多层。
可以看到很多层,这是相当于一圈一圈包圆了,这就是 docker 镜像文件基于联合文件系统的分层原理。
接下来解释为什么 docker 镜像要采用这种分层结构,分层结构最大的好处是共享资源,因为多个镜像都有同的 base 镜像构建而来,宿主机只需要在磁盘上保存一份 base 镜像,同时内存中也只需要加载一份 base 镜像,就可以为所有容器服务,而且镜像的每一层都可以被共享。
上面加载了很多,可以明显的感觉到,第一次下载第一个镜像时非常慢,但是后续如果删除或者再下载会非常快,因为这时有了缓存,就是为了后续共享资源,所有的镜像都可以从 base 下载。
4.特点
docker 镜像都是只读的,因为镜像不能修改,最外层读的是 tomcat
当容器启动时,一个新的可写层被加载到镜像的顶部,(要启动运行的是最外层,拿一个鸡蛋,大家都知道是由三层构成的,鸡蛋黄,鸡蛋白鸡蛋壳,正常情况下先接触的都是蛋壳,不能隔着档口去取物先去操作里面)这一层通常被称为容器层,容器层之下的都叫做镜像层(花卷一定先吃最外面一层,这一层才是可写的,内部是封装好的,外层暴露的才是能看到的)