【Docker】進階之路:(五)Docker引擎

【Docker】進階之路:(五)Docker引擎

  • Docker引擎簡介
  • Docker引擎的組件構成
    • runc
    • containerd

Docker引擎簡介

Docker引擎是用來運行和管理容器的核心部分。Docker首次發布時,Docker 引擎由LXC 和 Docker daemon 兩個核心組件構成。

Docker daemon 是單一的二進制文件,包含諸如 Docker 客戶端、Docker API、容器運行時、鏡像構建等。 LXC 提供了對諸如命名空間(Namespace)和控制組(CGroup)等基礎工具的操作能力,它們是基于 Linux 內核的容器虛擬化技術。

在 Docker 舊版本中,Docker daemon、LXC 和操作系統之間的交互關系。
在這里插入圖片描述
其中,LXC是基于Linux的,存在對外部工具的嚴重依賴關系,對于Docker的跨平臺目標的實現是個問題。因此,Docker公司開發了名為Libcontainer的自研工具,用于替代LXC。Libcontainer的目標是成為與平臺無關的工具,可基于不同內核為Docker上層提供必要的容器交互功能。在Docker 0.9版本中,Libcontainer取代LXC成為默認的執行驅動。同時,Docker的整體性帶來了越來越多的問題。難于變更、運行越來越慢,這對于Docker生態的發展來說弊大于利。Docker公司意識到了這些問題,開始努力著手拆解這個大而全的Dockerdaemon,并將它模塊化。盡可能地拆解出其中的功能特性,并用小而專的工具來實現它。這些小工具可以是可替換的,也可以被第三方拿去用于構建其他工具。目前,所有容器執行和容器運行時的代碼已經完全從daemon中移除,并重構為小而專的工具。

在改進版本中,基于開放容器計劃,Docker引擎采用了模塊化的設計原則,組件是可以替換的。Docker引擎主要由Docker Client、Docker daemon、containerd、runc組成,共同負責容器的創建和運行。
在這里插入圖片描述

Docker引擎的組件構成

runc

在 Docker daemon 進程的拆解和重構時,OCI 也正在著手定義兩個容器相關的規范,即鏡像規范和容器運行時規范,兩個規范均于 2017 年 7 月發布了 1.0 版。

Docker 公司參與了這些規范的制定工作,并貢獻了許多代碼。從 Docker 1.11 版本(2016 年初)開始,Docker 引擎盡可能實現了 OCI 的規范。例如,Docker daemon 不再包含任何容器運行時的代碼——所有的容器運行代碼在一個單獨的 OCI 兼容層中實現。默認情況下,Docker 使用 runc 來實現這一點。runc 是 OCI 容器運行時標準的參考實現,如上面圖5-3中的 runc 容器運行時層。runc 項目的目標之一就是與 OCI 規范保持一致。目前 OCI 規范均為 1.0 版本,我們不希望它們頻繁地迭代,畢竟穩定勝于一切。除此之外,Docker 引擎中的 containerd 組件確保了 Docker 鏡像能夠以正確的 OCI Bundle 的格式傳遞給 runc。其實,在 OCI 規范以 1.0 版本正式發布之前,Docker 引擎就已經遵循該規范實現了部分功能。

runc實質上是一個輕量級的、針對Libcontainer進行了包裝的命令行交互工具。Libcontainer取代了早期Docker架構中的LXC。runc的作用是創建容器,而且速度非常快。不過runc是一個CLI包裝器,實質上就是一個獨立的容器運行時工具。因此,直接下載runc或基于源碼編譯二進制文件,即可擁有一個全功能的runc。但runc只是一個基礎工具,并不提供類似Docker引擎所擁有的豐富功能。

有時也將runc所在的架構層稱為OCI層。關于runc的發布信息見GitHub中opencontainers/runc庫的release。

containerd

在對 Docker daemon 的功能進行拆解后,所有的容器執行邏輯被重構到一個新的名為 containerd(發音為 container-dee)的工具中。Containerd的主要任務是容器的生命周期管理,即start | stop | pause | rm … containerd等。它在 Linux 和 Windows 中以 daemon 的方式運行,從 1.11 版本之后 Docker 就開始在 Linux 上使用。

Docker 引擎技術棧中,containerd 位于 daemon 和 runc 所在的 OCI 層之間。Kubernetes 也可以通過 cri-containerd 使用 containerd。

正如Docker 引擎簡介中所述,containerd 最初被設計為輕量級的小型工具,僅用于容器的生命周期管理。然而,隨著時間的推移,它被賦予了更多的功能,例如鏡像管理等。其原因之一是,這樣便于在其他項目中使用containd。例如,在 Kubernetes 中,containerd 就是一個很受歡迎的容器運行時。然而在 Kubernetes項目中,如果 containerd 能夠完成一些諸如 push 和 pull 鏡像這樣的操作就更好了。因此,如今的 containerd 還能夠完成一些除容器生命周期管理之外的操作。不過,所有的額外功能都是模塊化的、可選的,便于自行選擇所需功能。 Kubernetes項目在使用 containerd 時,可以僅包含所需的功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210870.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210870.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210870.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux驅動開發——內核調試技術

目錄 一、前言 二、內核調試方法 2.1 內核調試概述 2.2 學會分析內核源程序 2.3調試方法介紹 三、內核打印函數 3.1內核鏡像解壓前的串口輸出函數 3.2 內核鏡像解壓后的串口輸出函數 3.3 內核打印函數 四、獲取內核信息 4.1系統請求鍵 4.2 通過/proc 接口 4.3 通過…

算法:有效的括號(入棧出棧)

時間復雜度 O(n) 空間復雜度 O(n∣Σ∣),其中 Σ 表示字符集,本題中字符串只包含 6 種括號 /*** param {string} s* return {boolean}*/ var isValid function(s) {const map {"(":")","{":"}","["…

List截取指定長度(java截取拼接URL)

場景&#xff1a; N多個參數&#xff0c;截取指定個數&#xff0c;拼接URL public static void main(final String[] args) {int count 0;//每頁數量final int pageSize 5;final List<Integer> memberNos ListUtil.toList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13…

python格式化內容

1.字符串格式化: 定義列表 [{"姓名": "張三", "年齡": 18, "性別": "男"}, {"姓名": "里斯李四李斯", "年齡": 18, "性別": "男"}, {"姓名": "斯托夫斯基…

C++知識 抽象基類

抽象基類通常包含至少一個純虛函數&#xff0c;即一個沒有具體實現的虛函數&#xff0c;通過在基類中聲明純虛函數&#xff0c;它強制派生類提供這個函數的具體實現。 通過在類的聲明中使用 virtual 關鍵字和 0 初始化來創建純虛函數&#xff0c;這樣的類就成為抽象基類。以下…

上位機與PLC:ModbusTCP通訊之數據類型轉換

前請提要: 從PLC讀取的數值,不管是讀正負整數還是正負浮點數,讀取過來后都會變成UInt16,也就是Ushort類型 一、ushort(UInt16)轉成 Int32 源代碼方法: //ushort類型轉Int32類型的方法private int ushortToInt32(ushort[] date, int start){//先進行判斷,長度是否正確…

MySQL_6.MySQL常用創建語句

1.數據庫創建,查詢,刪除 (1)創建一個test數據庫 CREATE DATABASE test ; CREATE DATABASE IF NOT EXISTS test; # default character set :默認字符集 CREATE DATABASE IF NOT EXISTS test default character set UTF8; # default collate&#xff1a;默認排序規格 # utf8_g…

前端知識(七)———HTTPS:保護網絡通信安全的關鍵

當談到網絡通信和數據傳輸時&#xff0c;安全性是一個至關重要的問題。在互聯網上&#xff0c;有許多敏感信息需要通過網絡進行傳輸&#xff0c;例如個人身份信息、銀行賬戶信息和商業機密等。為了保護這些信息不被未經授權的人訪問和篡改&#xff0c;HTTPS&#xff08;超文本傳…

AI:大語言模型LLM

LLM 大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一種利用大量文本數據進行訓練的自然語言處理模型&#xff0c;其評價可以從多個方面進行。 以下是一些主要的評價方面&#xff1a; 語言理解和生成能力&#xff1a;評價大語言模型在自然語言理…

模型評價指標

用訓練好的模型結果進行預測&#xff0c;需要采用一些評價指標來進行評價&#xff0c;才可以得到最優的模型 常用的指標&#xff1a; 1.分類任務 ConfusionMatrix 混淆矩陣Accuracy 準確率Precision 精確率Recall 召回率F1 score H-mean值ROC Curve ROC曲線PR …

PostgreSQL pgvector:如何利用向量數據庫提升搜索效率和精度

LLMs模型實戰教程 文章來源&#xff1a;https://zhuanlan.zhihu.com/p/641516393 Kevin 一、介紹 隨著基礎模型的興起&#xff0c;向量數據庫的受歡迎程度也飆升。事實上&#xff0c;在大型語言模型環境中&#xff0c;向量數據庫也很有用。 在機器學習領域&#xff0c;我們經…

天池SQL訓練營(三)-復雜查詢方法-視圖、子查詢、函數等

-天池龍珠計劃SQL訓練營 SQL訓練營頁面地址&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicampsql 3.1 視圖 我們先來看一個查詢語句&#xff08;僅做示例&#xff0c;未提供相關數據&#xff09; SELECT stu_name FROM view_students_info;單從表面上看起來…

C#反射加載程序集并使用

具體實現參考&#xff1a; C# 動態加載DLL通過反射調用參數、方法、窗體_c#反射加載dll并傳入參數-CSDN博客 C#進階學習--反射(Reflection) - 知乎 走進C#反射機制 - 知乎 1.使用過程 //創建數據集 Assembly outerAsm Assembly.LoadFile("D:/your.dll");//獲取…

rancher harvester deploy demo 【部署 harvester v1.2.1】

簡介 Harvester 是一個現代的、開放的、可互操作的、基于Kubernetes的超融合基礎設施(HCI)解決方案。它是一種開源替代方案&#xff0c;專為尋求云原生HCI解決方案的運營商而設計。Harvester運行在裸機服務器上&#xff0c;提供集成的虛擬化和分布式存儲功能。除了傳統的虛擬機…

pgsql存儲過程

由于部分企業數據庫從aws遷移到騰訊云&#xff0c;導致有一個定時任務&#xff08;從詳情表匯總數據到統計表中&#xff09;錯過了觸發&#xff0c;所以這部分企業的數據需要觸發重新刷一下&#xff0c;但是又有規定白天不允許上線&#xff0c;只能把定時任務的邏輯用存儲過程&…

SQL SELECT 語句

SELECT 語句用于從數據庫中選取數據。 SQL SELECT 語句 SELECT 語句用于從數據庫中選取數據。 結果被存儲在一個結果表中&#xff0c;稱為結果集。 SQL SELECT 語法 SELECT column1, column2, ... FROM table_name; 與 SELECT * FROM table_name; 參數說明&#xff1a; …

五花八門客戶問題(BUG) - 用好strace

strace簡介 strace是一個用于跟蹤系統調用和信號傳遞的Linux命令,它是一個集診斷、調試、統計于一體的工具。strace可以監控用戶空間進程和內核的交互,比如系統調用、信號傳遞、進程狀態變更等。它底層使用內核的ptrace特性來實現其功能。 strace最簡單的用法是執行一個指定…

二分查找|雙指針:LeetCode:2398.預算內的最多機器人數目

作者推薦 本文涉及的基礎知識點 二分查找算法合集 滑動窗口 單調隊列&#xff1a;計算最大值時&#xff0c;如果前面的數小&#xff0c;則必定被淘汰&#xff0c;前面的數早出隊。 題目 你有 n 個機器人&#xff0c;給你兩個下標從 0 開始的整數數組 chargeTimes 和 runnin…

Django回顧7

一.Django緩存 1.緩存介紹 在動態網站中,用戶所有的請求,服務器都會去數據庫中進行相應的增,刪,查,改,渲染模板,執行業務邏輯,最后生成用戶看到的頁面. 當一個網站的用戶訪問量很大的時候,每一次的的后臺操作,都會消耗很多的服務端資源,所以必須使用緩存來減輕后端服務器的壓力…

算法:最長公共前綴(橫向掃描和縱向掃描)

橫向掃描 時間復雜度 O(m * n)&#xff0c;空間復雜度O(1) /*** param {string[]} strs* return {string}*/ var longestCommonPrefix function(strs) {// 先把第一個字符串拿出來let str strs[0]// 用 startsWith 檢查數組中每個字符串是否以當前字符串為前綴while(!strs.e…