什么是镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境的开发软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
联合文件系统(unionFS)
联合文件系统是一种分层、轻量级并且高性能的文件系统。它支持对文件文件系统的修改作为一次提交来层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
- 联合文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像
Docker镜像原理
什么是docker镜像
一个完整的docker镜像可以支撑一个docker容器的运行,在docker容器运行过程中主要提供文件系统视角。
插话(理解Linux内核和ubuntu镜像的区别):
传统虚拟机安装ubuntu包含两部分:
- 某个Linux内核的发行版本,比如Linux3.8版本的内核
- 某个特定的Ubuntu发行版,这部分内容不包含Linux内核,但包含Linux之外的软件管理方式、软件驱动。
Docker镜像原理
Linux系统
Linux系统一般有内核、shell、文件系统和应用程序共4部分组成。
Linux文件系统由bootfs和roorfs两部分组成
- bootfs(boot file system):包含boot loader(引导加载程序)和kernel(内核)。用户不会修改这个文件系统。实际上,在启动(boot)过程完成后,整个内容都会被加载进内存,此时bootfs会被卸载掉从而释放出所占用的内存。同时也可以看出,对于同样内核版本的不同Linux发行版的bootfs都是一致的
- rootfs(root file system):包含典型的目录结构,包括/dev,/proc,/bin,/etc,/lib,/usr及/tmp等再加上要运行用户应用所需要的所有配置文件,二进制文件和库文件。这个文件系统在不同的Linux发行版中是不同的。而且用户可以对这个文件进行修改。
docker镜像
docker镜像实际上由一层一层的文件系统组成(层叠的只读文件系统)
联合加载(union mount)
- Docker镜像是由特殊的文件系统叠加而成
- 最底端是 bootfs,并使用宿主机的bootfs(引导文件系统)
- 第二层是 root文件系统rootfs,称为base image(基础镜像)
- 然后再往上可以叠加其他的镜像文件
- 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
根据镜像原理解决了下面的问题
Docker 镜像本质是什么?
- 是一个分层文件系统
Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
- Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层
Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
- 由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB
docker镜像为什么采用这种分层的结构
最大的好处是 ——共享资源
当有多个镜像都从相同的base镜像构建而来时,宿主机只需要在磁盘上保存一份base镜像,同时内存也需要加载一份base镜像,就可以为所有服务器服务了。而且镜像的每一层都可以被共享。
docker镜像内容
docker镜像的内容主要包含两部分:
镜像层文件内容
镜像json文件
容器是一个动态的环境,每一层镜像中的文件属于静态内容,然而dockerfile中的ENV、VOLUME、CMD等内容最终都需要落实到容器的运行环境中,而这些内容均不可能直接坐落到每一层镜像所包含的文件系统内容中,此时每个docker镜像还会包含json文件记录与容器之间的关系