☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython
一、引言
我们都知道,运行的容器就是一个独立的Linux进程,当通过docker run 指令运行一个Docker容器时,首先找到镜像文件,然后根据镜像的配置信息,创建一个新的运行时容器。
本文来详细分析一下镜像、容器和Linux系统之间的具体关系。
二、linux的内核空间、用户空间、rootfs
由于容器比较特殊,它既是一个特殊的Linux的进程,又保持封闭和独立。在分析之前,我们需要先总结一下linux的内核空间、用户空间、bootfs、rootfs的相关知识:
- Linux 操作系统由内核空间kernal 和 用户空间组成,用户空间不能直接访问内核空间;bootfs和rootfs则是两个不同的文件系统,rootfs本质上是用户内存空间的一部分,它可以映射到磁盘空间
- 内核是操作系统的核心,不同Linux的内核差别不大,内核空间负责管理系统的硬件和软件资源,控制着系统硬件和软件的运行。它提供了各种系统服务和资源管理功能,如进程管理、内存管理、设备驱动程序、文件系统等,内核空间由bootfs负责引导加载
- 用户空间是一个相对内核空间而言虚拟的概念,它指的是用户在使用计算机时所能看到的和操作的环境,包括Shell终端、文件系统、应用程序、系统库和配置文件等,是运行用户应用程序的环境,以及用户可以在其中进行文件和目录的创建、删除、修改等操作的空间。
- Bootfs(引导文件系统)b是存储在磁盘上的一个独立的文件系统,通常被置于磁盘的开头的扇区或分区,存储系统启动时需要的文件和数据,主要包含引导加载器和内核映像、启动参数、自定义启动脚本等,负责在系统启动时加载内核和引导参数等数据。在系统启动时,BIOS或UEFI会首先加载bootfs到内存中,并将控制权交给引导加载器,引导加载器再加载内核映像和启动参数等数据,以便系统能够正确地启动。一旦系统启动完成,bootfs就会被卸载,最终将控制权交给内核
- Rootfs(根文件系统)为系统的根文件系统,是一个最小化的内存文件系统,不依赖于硬盘上的文件系统,只包含运行Linux所必需的文件和目录,主要用于存储系统根目录下的文件和子目录、一些系统工具和备份数据,以及其他必需的资源和配置文件。例如/bin、/dev、/etc、/proc、/sys、/tmp和/var等目录
- Rootfs是用户空间的基础,在系统启动后,rootfs会被挂载到内存中的系统根目录下,将用户空间中的程序和数据加载到内存中,成为用户空间和内核空间之间的桥梁,以便用户空间能够正确地运行。因此rootfs是用户空间的基础,它提供了用户空间所需的文件和目录等资源,并与内核空间相互协作,共同维护着系统的稳定运行。不同 Linux 发行版的区别主要就是 rootfs。比如 Ubuntu 14.04 使用 upstart 管理服务,apt 管理软件包;而 CentOS 7 使用 systemd 和 yum。这些都是用户空间上的区别,Linux kernel 差别不大。所以 Docker 可以同时支持多种 Linux 镜像,模拟出多种操作系统环境。
三、Docker容器镜像、Docker运行时用户空间和Linux内核之间的关系
理解了kernal、rootfs、用户空间的概念和关系,我们再来介绍容器镜像、容器运行时的用户空间以及操作系统内核之间的关系:
- 由于不同发行版本的Linux内核差别不大,所有Docker容器运行时的底层都直接使用 Host 的 kernel,因此容器是复用宿主机的Linux内核,只要提供DOCKER运行时的用户空间
- 用户空间是构建在rootfs基础之上的,因此每个容器都有一个独立的rootfs文件系统
- 容器镜像就是为容器运行时提供rootfs,也就是说rootfs是构建在Docker镜像之上的
容器镜像确实是容器构建rootfs和用户空间的基础。容器复用了Linux内核,这意味所有容器共享内核,从而节省了空间。同时,容器的独立用户空间挂载的rootfs与Linux内核交互,这使得容器的镜像无需关注Linux内核的版本。
此外,容器通过提供镜像构建的rootfs和用户空间,保持了容器的独立性和安全性。每个容器都有自己的文件系统和用户空间,可以运行不同操作系统版本的rootfs和用户空间,而不会相互干扰。同时,由于容器与底层主机系统隔离,因此容器提供了一定程度的安全性。
四、小结
容器镜像是容器构建rootfs和用户空间的基础,容器是镜像的运行态。容器复用Linux内核,通过容器独立用户空间挂载的rootfs与Linux内核交互,这样既使得容器的镜像无需关注Linux内核的版本,又节省了空间,同时容器通过提供镜像构建的rootfs和用户空间又保持了容器的独立性和安全性。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
更多云计算相关方面的介绍请参考《云计算与公有云服务》专栏的介绍。
关于老猿的付费专栏
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。