1.概念
镜像是一种轻量级的、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖
打包好形成一个可交付的运行环境(包括代码,运行时需要的库,环境变量和配置文件等),这个打包好的运行环境
就是image镜像文件。通过镜像文件才能生成Docker容器实例(类似java中new出来一个对象)。
2.镜像为什么是分层的
1.UnionFS是所有容器和镜像层背后的底层文件系统,UnionFS它是一种实现的概念,并不是具体的文件系统类型。
2.UnionFS是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。UnionFS是Docker镜像的基础。镜像可以通过分层来进行继承,基于镜像基础,可以制作各种具体的应用镜像。docker pull 【镜像名:TAG】时,会一次加载多个文件系统,最终形成一个容器实例。
docker inspect tomcat
3.镜像加载原理
3.1bootfs(boot file system,用于系统引导的文件系统)
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
bootfs主要包含bootloader(根加载)和kernel(linux内核)。bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件
系统。
Docker镜像最底层就是引导文件系统bootfs(每一个容器都是一个简易版的linux环境)。
这一层与我们典型的linux系统是一样的,包含bootloader和kernel。当bootloader加载完成之后,整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
3.2rootfs(root file system,根文件系统)
rootfs在bootfs之上。包含的就是典型linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作
系统发行版,比如centos等
4.为什么docker镜像采用分层结构
镜像分层最大的好处就是资源共享,比如有多个镜像都是从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留
一份Base镜像,同时内存中也只需要加载一份Base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以
被共享。Docker镜像层都是只读的,当对一个Base镜像修改或者新增内容时,就会在当前镜像层之上创建新的镜像层。
容器层是可写的。用镜像创建容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作 容器层 , 容器层之下的都叫 镜像层。例:Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似java继承于一个Base基础类,自己再按需扩展新镜像是从base镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层