嘗試理解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的容器嗎?為什麼?
這些的問題的底層其實都指向共享內核的確切含義,這裡記錄一下思考過程,以下觀點均為個人分析推斷,不一定準確,有疑義的小夥伴歡迎指正、探討。

容器與虛擬機的對比

已經有很多文章對容器、虛擬機的區別進行了詳細的對比,這裡不再贅述,很多文章對比時都會引用類似如下圖片:
image

左圖中是在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,其位於用戶程序與系統調用之間,如下圖:
image

Linux發行版與內核的關係

Linux發行版就是一些組織和廠商將Linux內核、各類軟件、庫及文檔組合起來,提供了完整各類常用工具、庫(如gcc、dpkg、yum、glibc等),打包在一起作為一個完整的發行版操作系統提供給用戶,其關係如下圖:
image

由於不同發行版使用的都是同一個Linux內核,所以在內核的層面並不存在兼容性問題–具體來說對於運行在宿主機上的容器進程分三種情況:

  1. 相同內核版本的情況下,不存在兼容性問題。
  2. 宿主機內核版本高於容器發行版內核版本時,由於高版本內核保證向後兼容性(backward compatibility),一般也可以正常運行。
  3. 宿主機內核版本低於容器發行版內核,若容器中使用了低版本內核中不存在的系統調用,則無法正常運行。

初步總結

回到文章一開始提出的幾個問題:
Linux上為什麼無法運行windows容器?
因為Linux內核與windows內核完全不是一個東西,windows程序不可能使用Linux內核的系統調用與硬件交互。
Debian上可以運行Ubuntu容器嗎?Ubuntu容器又能運行CentOS容器嗎?
根據發行版使用的具體內核版本,其可以基於其宿主機內核運行成功則可以,由於linux內核提供向後兼容(backward compatible),一般來說容器發行版內核<=宿主機內核版本的情況都是可以成功的,而>宿主機內核的情況下可能可以成功。
具體發行版Debian 10.0 Linux上能運行低版本如Debian 9.0的容器嗎?能運行Debian11.0的容器嗎?為什麼?
和上面其實是一個分析思路。

轉載請註明出處,原文地址://www.cnblogs.com/AcAc-t/p/linux_container_share_kernel_meaning.html

參考

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