尝试理解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的容器吗?为什么?
这些的问题的底层其实都指向共享内核的确切含义,这里记录一下思考过程,以下观点均为个人分析推断,不一定准确,有疑义的小伙伴欢迎指正、探讨。
容器与虚拟机的对比
已经有很多文章对容器、虚拟机的区别进行了详细的对比,这里不再赘述,很多文章对比时都会引用类似如下图片:
左图中是在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内核、各类软件、库及文档组合起来,提供了完整各类常用工具、库(如gcc、dpkg、yum、glibc等),打包在一起作为一个完整的发行版操作系统提供给用户,其关系如下图:
由于不同发行版使用的都是同一个Linux内核,所以在内核的层面并不存在兼容性问题--具体来说对于运行在宿主机上的容器进程分三种情况:
- 相同内核版本的情况下,不存在兼容性问题。
- 宿主机内核版本高于容器发行版内核版本时,由于高版本内核保证向后兼容性(backward compatibility),一般也可以正常运行。
- 宿主机内核版本低于容器发行版内核,若容器中使用了低版本内核中不存在的系统调用,则无法正常运行。
初步总结
回到文章一开始提出的几个问题:
Linux上为什么无法运行windows容器?
因为Linux内核与windows内核完全不是一个东西,windows程序不可能使用Linux内核的系统调用与硬件交互。
Debian上可以运行Ubuntu容器吗?Ubuntu容器又能运行CentOS容器吗?
根据发行版使用的具体内核版本,其可以基于其宿主机内核运行成功则可以,由于linux内核提供向后兼容(backward compatible),一般来说容器发行版内核<=宿主机内核版本的情况都是可以成功的,而>宿主机内核的情况下可能可以成功。
具体发行版Debian 10.0 Linux上能运行低版本如Debian 9.0的容器吗?能运行Debian11.0的容器吗?为什么?
和上面其实是一个分析思路。
转载请注明出处,原文地址: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
尝试理解Linux容器进程与宿主机共享内核到底是什么意思?的更多相关文章
- Docker - 查看容器进程在宿主机的 PID
概述 查看 docker 进程, 在容器外的 pid 背景 docker 中运行的进程, 本质上是运行在 host 上的 这些进程, 在 host 上, 也可以有自己的 pid 如果某种情况下, 连不 ...
- 【解决】修改 docker 容器时间与宿主机不同
修改 docker 容器时间 需求: 这几天,开发提了个需求 "测试需要模拟未来某天的业务,发现容器里面没有修改时间的权限",想在我们 k8s 集群上,调整容器时间 解决方案: 使 ...
- docker 容器时间跟宿主机时间同步
docker 容器时间跟宿主机时间同步 docker cp /etc/localtime 87986863838b:/etc/docker cp /etc/localtime container-na ...
- 同步docker中的容器时间和宿主机相同
同步docker中的容器时间和宿主机相同.cd /etc/ 在容器中修改下/etc/localtime文件的名称,避免冲突. mv localtime localtime_bak cp /usr/sh ...
- VNC怎么和宿主机共享粘贴板
VNC怎么和宿主机共享粘贴板 假设目标主机是linux,终端主机是windows(就是在windows上使用VNC登陆linux) 在linux中执行vncconfig -nowin& 在li ...
- linux下如何映射宿主机中的文件到容器中?
答:在启动容器时使用-v指定宿主机目录和要映射到的容器内部目录,语法如下: docker run -it -v <host_dir>:<container_dir> <c ...
- 在虚拟机上利用宿主机共享目录编译linux程序
#前提条件: 宿主机:windows7 虚拟机:REDHAT 开发环境 qt4.7.4 +vs2010 . 代码在windows7 上编译成功 ,运行正常 在linux下编译需要的第三方库已经编译成功 ...
- Docker容器学习梳理 - 容器时间跟宿主机时间同步
在Docker容器创建好之后,可能会发现容器时间跟宿主机时间不一致,这就需要同步它们的时间,让容器时间跟宿主机时间保持一致.如下: 宿主机时间 [root@slave-1 ~]# date Fri M ...
- Docker 记一次容器内部修改宿主机挂载目录用户权限后宿主机目录变化
一.需求: 因公司需求,需制作mysql5.7.22 docker基础镜像,每个项目以此镜像启动一个数据库容器,并且每个项目挂载一个宿主机目录到镜像中数据存储下面用于数据持久化保存以便后期迁移至阿里云 ...
随机推荐
- 机器学习中 TP FP TN FN的概念
二分类 在二分类问题中,TP FP TN FN 是非常清楚且易于理解的. TP (True Positive) : 预测为 1 ,真实值也为 1 -> 真阳性 FP (False Positiv ...
- Docker组成原理
目录 Docker引擎 OCI容器标准 镜像 启动流程 本文是阅读<深入浅出Docker>的相关学习笔记 起初简单的以为Docker和容器是一种东西,后来才发现Docker是实现了Linu ...
- RPA应用场景-信用卡交易争议后续流程
RPA应用场景-信用卡交易争议后续流程 场景概述 信用卡交易争议后续流程 所涉系统名称 客服系统,邮件 人工操作(时间/次) 4小时 所涉人工数量20操作频率 不定时 场景流程 1.RPA自动接收客户 ...
- Linux shell环境的配置
shell配置文件分类 按生效范围分类:全局和局部 按登录方式分类:交互式和非交互式 按功能分类:profile和bashrc shell配置文件按生效范围分类: 全局配置:针对有所用户有效 /etc ...
- C#/VB.NET 将PDF转为Excel
PDF文档可以避免可防⽌他⼈⽆意中触到键盘修改⽂件内容.但是在避免他人⽆意修改的同时也妨碍了正常的修改.如果你想处理或修改PDF文档中的数据,不妨试试用Excel来实现.Excel拥有强大的数据处理功 ...
- Ubuntu系统iptables安全防护整改计划
端口开放 默认防火墙是开放所有端口的,如果拿来做应用服务器,就很危险,所以要把防火墙用起来,只将需要的端口开放,ubuntu用的是iptables防火墙. iptables处理流程 iptables ...
- python常见的错误提示处理
python常见的错误有 NameError变量名错误 IndentationError代码缩进错误 AttributeError对象属性错误 TypeError类型错误 IOError输入输出错误 ...
- Task.Run(), Task.Factory.StartNew() 和 New Task() 的行为不一致分析
重现 在 .Net5 平台下,创建一个控制台程序,注意控制台程序的Main()方法如下: static async Task Main(string[] args) 方法的主体非常简单,使用Task. ...
- 015(Power string)(哈希表)
题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1457 题目思路: 思路就是预设子串的长度,从1开始,而后一段一段试 试到一个对不上的就打回 如果 ...
- P1189 SEARCH—搜索
将这题加进来的原因 因为他的优化令人眼前一新! 题目传送门() 相似的题目之 血色先锋队 ↑这一题也要用到标记数组 优化!!! 对于一个位置, 如果他在同样的深度再一次被访问,那他接下来所走的路径,所 ...