嘗試理解Linux容器程序與宿主機共用核心的具體含義

2022-08-29 06:00:38

背景

近期接觸容器技術時,經常看到各類比較容器與虛擬機器器區別的文章中會提到:容器是共用宿主機的核心,而虛擬機器器則是擁有自己獨立的核心,所以不可能在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核心,所以在核心的層面並不存在相容性問題--具體來說對於執行在宿主機上的容器程序分三種情況:

  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的容器嗎?為什麼?
和上面其實是一個分析思路。

轉載請註明出處,原文地址: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