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

来源:https://www.cnblogs.com/AcAc-t/archive/2022/08/29/linux_container_share_kernel_meaning.html
-Advertisement-
Play Games

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是在FDCB里使能串列NOR Flash的QPI/OPI模式。 我們知道 Flash 讀時序里有五大子序列 CMD + ADDR + MODE + DUMMY + READ,前面的文章中痞子衡講過《串列NOR Flash的Continuo ...


背景

近期接觸容器技術時,經常看到各類比較容器與虛擬機區別的文章中會提到:容器是共用宿主機的內核,而虛擬機則是擁有自己獨立的內核,所以不可能在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的容器嗎?為什麼?
和上面其實是一個分析思路。

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

簽名:擁抱開源,擁抱自由
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄 一.OpenGL ES 圖像亮度調節 1.原始圖片 2.效果演示 二.OpenGL ES 圖像亮度調節源碼下載 三.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ...
  • 前言 今天想聊一聊冪等相關的知識,以及實現一個冪等公共組件需要重點涉及和思考的點。 概念 首先,什麼是冪等,在實際代碼生產過程中有什麼作用呢? 在編程中一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。 舉個例子,假如有個方法,用於修改一個訂單的狀態為已完成,只改一個狀態欄位,要 ...
  • 摘要:本文主要講解灰度線性變換。 本文分享自華為雲社區《[Python圖像處理] 十五.圖像的灰度線性變換》,作者:eastmount。 一.圖像灰度線性變換原理 圖像的灰度線性變換是通過建立灰度映射來調整原始圖像的灰度,從而改善圖像的質量,凸顯圖像的細節,提高圖像的對比度。灰度線性變換的計算公式如 ...
  • JSP概述 什麼是 jsp JSP(全稱 Java Server Pages)是由 Sun 公司專門為瞭解決動態生成 HTML 文檔的技術。 Servlet 程式輸出 html 頁面 在 jsp 技術之前,如果我們要往客戶端輸出一個頁面。我們可以使用 Servlet 程式來實現。具體的代碼如下: p ...
  • 一、事件背景 大家好,我是馬哥python說。 演員張天愛於2022.8.25號在網上爆出一段音頻 "慣犯,希望所以女孩擦亮眼睛。" 至今已有2.5億次觀看量,瞬間衝上熱搜。 二、微熱點分析 以下數據來源:微熱點 從輿情分析網站上來看,從熱度指數的變化趨勢來看,"張天愛"的熱度在08月25日22時達 ...
  • 參考自 https://www.cnblogs.com/leoxjy/p/10201046.html#5095270 Centos報這個問題,Asp.NetCore 3.1 HttpClient 請求 Https 報錯的SSL證書異常的問題,請使用以下方法解決。 export DOTNET_SYST ...
  • 概述 本文描述WPF的拖放功能(Drag and Drop)。 拖放功能涉及到兩個功能,一個就是拖,一個是放。拖放可以發生在兩個控制項之間,也可以在一個控制項自己內部拖放。假設界面上有兩個控制項,一個TreeView,一個ListView,那麼可能發生的拖動有以下幾種情況: 1、TreeView -> L ...
  • 以下介紹Ubuntu下搭建用於HC32L110系列MCU的GCC工具鏈和VSCode的開發環境. AS06-VTB07H 產品頁鏈接. 這個開發板有新舊兩個版本. 4.0使用的是STM8, 5.0使用的是HC32L110, 現在能買到的都是後者, pin腳全部引出, 有預留燒錄口, 有一個功能按鈕,... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...