尝试理解Linux容器进程与宿主机共享内核的具体含义

背景

近期接触容器技术时,经常看到各类比较容器与虚拟机区别的文章中会提到:容器是共享宿主机的内核,而虚拟机则是拥有自己独立的内核,所以不可能在Linux上用容器运行windows,但是用虚拟机则可以。
乍看下去,觉得Linux上无法运行windows是很自然的结论,然后突然升起一个疑问:Linux上无法运行windows容器,那Debian上可以运行Ubuntu容器吗?Ubuntu上又能运行CentOS容器吗?
从自己实际使用上看,Debian上确实有运行CentOS的docker容器,CentOS上确实也有运行Ubuntu的docker容器,那无法运行windows容器却能运行不同发行版Linux的根本原因是什么呢?
进一步探究:具体发行版Debian 10.0 Linux上能运行低版本如Debian 9.0的容器吗?能运行Debian11.0的容器吗?为什么?
这些的问题的底层其实都指向共享内核的确切含义,这里记录一下思考过程,以下观点均为个人分析推断,不一定准确,有疑义的小伙伴欢迎指正、探讨。

容器与虚拟机的对比

已经有很多文章对容器、虚拟机的区别进行了详细的对比,这里不再赘述,很多文章对比时都会引用类似如下图片:

尝试理解Linux容器进程与宿主机共享内核的具体含义

左图中是在Host OS上运行Hypervisor(虚拟机监控器,virtual machine monitor),在Hypervisor提供的硬件模拟基础上运行有有多个Guest OS,每个Guest OS均有自己的独立内核,相当于为GuestOS提供了一个完全模拟的虚拟裸机,GuestOS其实无感知自身是运行在物理机上还是虚拟硬件上。
而右图中container是作为一个普通进程运行于Host OS上,所有进程共享Host OS的内核,而container的运行、编排则由中间的docker engine实现。

内核究竟是什么

Linux内核

Linux® 内核是 Linux 操作系统(OS)的主要组件,也是计算机硬件与其进程之间的核心接口。它负责两者之间的通信,还要尽可能高效地管理资源。
之所以称为内核,是因为它在操作系统中就像果实硬壳中的种子一样,并且控制着硬件(无论是电话、笔记本电脑、服务器,还是任何其他类型的计算机)的所有主要功能,主要包括内存管理、进程管理、设备驱动程序、系统调用和安全防护,单纯的linux内核并不算我们传统意义上说的一个完整操作系统。

系统调用 && glibc

那么内核在整个系统中的具体作用到底是什么呢?
内核对上层屏蔽了底层硬件操作的细节,对其提供了统一的系统调用对硬件进行统一的操作。
但是系统调用接口一般比较原始,涉及和操作系统相关的细节,不同操作系统之间的系统调用基本完全不同,哪怕同系列的Linux与UNIX都不相同。
基于以上原因,一般应用程序是通过标准的运行库来使用系统调用,运行库的优点是本身是语言级别的,设计比较友好,标准、形式统一,不会随着操作系统或编译器的变化而变化。
Linux上的运行库即是glibc,其位于用户程序与系统调用之间,如下图:

尝试理解Linux容器进程与宿主机共享内核的具体含义

Linux发行版与内核的关系

Linux发行版就是一些组织和厂商将Linux内核、各类软件、库及文档组合起来,提供了完整各类常用工具、库(如gcc、dpkg、yum、glibc等),打包在一起作为一个完整的发行版操作系统提供给用户,其关系如下图:

尝试理解Linux容器进程与宿主机共享内核的具体含义

由于不同发行版使用的都是同一个Linux内核,所以在内核的层面并不存在兼容性问题–具体来说对于运行在宿主机上的容器进程分三种情况:

  1. 相同内核版本的情况下,不存在兼容性问题。
  2. 宿主机内核版本高于容器发行版内核版本时,由于高版本内核保证向后兼容性(backward compatibility),一般也可以正常运行。
  3. 宿主机内核版本低于容器发行版内核,若容器中使用了低版本内核中不存在的系统调用,则无法正常运行。

初步总结

回到文章一开始提出的几个问题:
Linux上为什么无法运行windows容器?
因为Linux内核与windows内核完全不是一个东西,windows程序不可能使用Linux内核的系统调用与硬件交互。
Debian上可以运行Ubuntu容器吗?Ubuntu容器又能运行CentOS容器吗?
根据发行版使用的具体内核版本,其可以基于其宿主机内核运行成功则可以,由于linux内核提供向后兼容(backward compatible),一般来说容器发行版内核

转载请注明出处,原文地址:https://www.cnblogs.com/AcAc-t/p/linux_container_share_kernel_meaning.html

参考

https://zh.wikipedia.org/zh-cn/Hypervisor
https://cloudacademy.com/blog/docker-vs-virtual-machines-differences-you-should-know/
https://www.redhat.com/zh/topics/linux/what-is-the-linux-kernel
https://book.douban.com/subject/3652388/
https://www.cnblogs.com/blog-yejy/p/9373850.html
https://stackoverflow.com/questions/32756988/what-is-meant-by-shared-kernel-in-docker
https://stackoverflow.com/questions/32841982/how-can-docker-run-distros-with-different-kernels
https://en.wikipedia.org/wiki/Linux_distribution

Original: https://www.cnblogs.com/AcAc-t/p/linux_container_share_kernel_meaning.html
Author: 及时
Title: 尝试理解Linux容器进程与宿主机共享内核的具体含义

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/643987/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 基础设施公募REITs介绍

    一、REITs的发展历史 作为舶来品,REITs的发行和投资在海外市场已较为成熟,REITs也是大类资产配置中的重要品种。 在欧美的语境下,REITs即房地产信托投资基金,是通过汇…

    技术杂谈 2023年5月31日
    079
  • centos初始配置

    vsftpd安装配置 Last login: Tue Aug 12 08:21:26 2014 from l-001812.lan[root@oracledb ~]# chkcon…

    技术杂谈 2023年5月31日
    0105
  • 干货合集│最好用的 python 库都在这

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月11日
    078
  • P2P的原理和常见的实现方式(为libjingle开路)

    参考原文 为了项目的IM应用,最近在研究libjingle,中间看了也收集了很多资料,感慨网上很多资料要么太过于纠结协议(如 STUN、ICE等)实现细节,要么中间有很多纰漏。最后…

    技术杂谈 2023年6月1日
    0103
  • [转帖][转]五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年5月30日
    0104
  • Aerospike配置

    Aerospike配置 posted on2022-02-09 17:43 duanxz 阅读(66 ) 评论() 编辑 Original: https://www.cnblogs…

    技术杂谈 2023年5月30日
    074
  • 搭建Redis一主两从三哨兵

    实践 – 搭建Redis一主两从三哨兵 原因: 最近在复习Redis的时候,学习到了为了提高Redis集群的 高可用性,有一个模式为 哨兵模式。 哨兵模式的作用是为了在…

    技术杂谈 2023年6月21日
    0102
  • 设计模式 14 模板模式

    模板模式(Template Pattern)属于 行为型模式 在生活中常常会遇到这样的情况,做某一件事情,有些步骤是固定的,有些步骤的变化的。 比如去医院看病, 挂号和 排队这两个…

    技术杂谈 2023年7月25日
    082
  • 功能测试点大全

    一、 输入框测试 字符型输入框: (1)字符型输入框:英文全半角、数字、空或者空格、特殊字符”~!@#¥%……&*?[]{}&#8221…

    技术杂谈 2023年7月23日
    075
  • tcprstat和tcpstat性能监控

    tcprstat是percona用来监测mysql响应时间的。不过对于任何运行在TCP协议上的响应时间,都可以用。 下面是一个监控示例,监控分析mysql的3306端口。 根据上面…

    技术杂谈 2023年5月31日
    0114
  • Windows下提升进程权限

    windows的每个用户登录系统后,系统会产生一个访问令牌(access token) ,其中关联了当前用户的权限信息,用户登录后创建的每一个进程都含有用户access token…

    技术杂谈 2023年5月31日
    086
  • 【6】2022年8月

    8月21日 OMG!!我真的是懒骨头!不到最后一刻丝毫不紧张!! 兄弟,八月底了阿!! 你为了明年的计划,要想同一时间内赚5万和成功上岸,这太不可思议了! 你压力好大的,别到最后放…

    技术杂谈 2023年7月10日
    073
  • UVA12130 Summits(BFS + 贪心)

    UVA12130 Summits(BFS + 贪心) 题目大意:给你一个h ∗ w 的矩阵,矩阵的每一个元素都有一个值,代表这个位置的高度。 题目要求你找出这个图中有多少个位置是峰…

    技术杂谈 2023年5月31日
    084
  • Map–部分方法

    1.Map.values()方法:获取Map集合中的所有键值对象 获取 Map 集合中的所有键值对象,这些键值对象将存放在另一个集合对象中 2.getOrDefault() 方法 …

    技术杂谈 2023年7月24日
    085
  • CF Workers反向代理并修改请求

    用于访问被墙的api请求 async function handleRequest(event) { const request = event.request const hos…

    技术杂谈 2023年6月21日
    082
  • 如何禁用笔记本自带键盘

    将笔记本自带键盘禁用之后,就可以把课本放在键盘上而不按键了 搜索cmd,选择命令提示符,右键,以管理员身份运行(否则会无法访问),随后输入: 重启即可 如果想要重新启用自带键盘,输…

    技术杂谈 2023年7月25日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球