Docker 與 Containerd 交互機制簡單剖析

#作者:鄧偉

文章目錄

  • 一、背景:Docker 架構的演進之路
    • 1.1 從自研運行時到 OCI 標準化
    • 1.2 現行架構分層模型
  • 二、核心交互組件解析
    • 2.1 通信協議:gRPC 雙向流的應用
    • 2.2 鏡像生命周期管理交互
      • 2.2.1 鏡像拉取流程(以 docker pull 為例)
      • 2.2.2 鏡像存儲格式轉換
    • 2.3 容器運行時交互核心流程
      • 2.3.1 容器創建階段(docker create)
      • 2.3.2 容器啟動階段(docker start)
  • 三、源碼級交互關鍵點解析
    • 3.1 Docker Engine 到 Containerd 的接口映射
    • 3.2 命名空間隔離機制
  • 四、典型問題排查與性能優化
    • 4.1 交互故障診斷工具鏈
    • 4.2 性能優化關鍵點
  • 五、未來演進:后 Docker 時代的 Containerd
    • 5.1 Kubernetes 對 Containerd 的直接支持
    • 5.2 功能對比矩陣
  • 六、總結

一、背景:Docker 架構的演進之路

1.1 從自研運行時到 OCI 標準化

2013 年 Docker 誕生時,采用自研的libcontainer作為容器運行時。隨著容器技術標準化推進,2015 年 OCI(Open Container Initiative)成立,定義了容器運行時規范(CRI)和鏡像規范。關鍵轉折點:

  • 2017 年 Docker 將libcontainer捐贈給 OCI,更名為runc
  • 2019 年 Docker Engine 正式采用Containerd作為底層容器運行時管理組件

1.2 現行架構分層模型

Docker CLI
├─ gRPC通信│  └─ Docker Engine(dockerd)│     ├─ gRPC通信│     │  └─ Containerd(/run/containerd/containerd.sock)│     │     ├─ containerd-shim(容器墊片進程)│     │     └─ runc(OCI運行時)└─ 鏡像倉庫(Docker Hub/私有倉庫)

二、核心交互組件解析

2.1 通信協議:gRPC 雙向流的應用

關鍵接口定義(基于 containerd/api)

// containers/v1/container_service.proto
service ContainerService {rpc Create(CreateContainerRequest) returns (CreateContainerResponse) {}rpc Start(StartContainerRequest) returns (StartContainerResponse) {}rpc Delete(DeleteContainerRequest) returns (DeleteContainerResponse) {}}// images/v1/image_service.proto
service ImageService {rpc Pull(PullRequest) returns (stream PullResponse) {} // 流式拉取鏡像rpc Push(PushRequest) returns (stream PushResponse) {} // 流式推送鏡像
}

通信鏈路抓包驗證

# 監聽containerd socket通信strace -f -e trace=network -p $(pidof containerd)# 使用grpcurl查看服務列表grpcurl -unix /run/containerd/containerd.sock list

2.2 鏡像生命周期管理交互

2.2.1 鏡像拉取流程(以 docker pull 為例)

  1. Docker CLI 解析鏡像名稱,發送ImagePull請求到 Docker Engine

  2. Docker Engine 調用 Containerd 的ImageService.Pull接口

  3. Containerd 執行以下操作:

    • 解析鏡像引用(支持docker.io/library/nginx:alpine格式)

    • 調用distribution庫從 Registry 拉取鏡像層

    • 將鏡像層存儲到/var/lib/containerd/io.containerd.content.v1.content

返回鏈路:通過 gRPC 流返回拉取進度,CLI 顯示下載狀態

2.2.2 鏡像存儲格式轉換

Containerd 使用Content Addressable Storage (CAS)存儲鏡像,而 Docker 傳統格式為aufs/overlay2,通過containerd-shim實現格式適配:

# 查看Containerd存儲的鏡像摘要ctr content ls -q | head -n 1
sha256:1a5c2b3d4e5f6789012abc3def456# Docker鏡像與Containerd內容的映射關系/var/lib/docker/image/overlay2/repositories.json <-> containerd的boltdb元數據

2.3 容器運行時交互核心流程

2.3.1 容器創建階段(docker create)

在這里插入圖片描述

2.3.2 容器啟動階段(docker start)

  1. Containerd 通過containerd-shim啟動容器進程

  2. containerd-shim負責:

    • 保持容器進程與 init 系統的連接

    • 傳遞信號(SIGKILL/SIGTERM)

    • 收集容器狀態信息

1.核心調用鏈:

containerd/runtime/v2/shim/v2/shim.go:Start()└─ runc.Start()└─ syscall.execve() // 執行容器入口進程

三、源碼級交互關鍵點解析

3.1 Docker Engine 到 Containerd 的接口映射

關鍵代碼路徑(Docker 24.0.6 版本)

// docker/daemon/container_engine.go
func (eng *containerEngine) Create(ctx context.Context, req *containerd.CreateContainerRequest) (*containerd.CreateContainerResponse, error) {client, err := eng.client() // 獲取Containerd客戶端連接return client.Containers.Create(ctx, req)}// 客戶端連接初始化
func (eng *containerEngine) client() (*containerd.Client, error) {return containerd.New(eng.config.Containerd.Address, // 默認連接/run/containerd/containerd.sockcontainerd.WithDefaultNamespace("moby"), // Docker專屬命名空間)}

3.2 命名空間隔離機制

Docker 通過moby命名空間與 Containerd 其他租戶隔離:

# 查看Containerd命名空間ctr namespace lsNAME    LABELSmoby    <none>k8s.io  <none>  # Kubernetes專用命名空間

四、典型問題排查與性能優化

4.1 交互故障診斷工具鏈

在這里插入圖片描述

4.2 性能優化關鍵點

  1. 減少 gRPC 調用開銷:

    • 批量處理鏡像操作(如同時拉取多個鏡像層)

    • 使用連接池復用 gRPC 通道

  2. 存儲驅動優化:

# /etc/containerd/config.toml
[plugins."io.containerd.runtime.v2.task"][plugins."io.containerd.runtime.v2.task.structs"][plugins."io.containerd.runtime.v2.task.structs.linux"]shim = "containerd-shim-runc-v2" # 使用v2版本墊片runtime = "runc"
  1. 資源限制傳遞:Docker 通過–cpu-shares/–memory參數傳遞的資源限制,最終由 Containerd 轉換為 cgroups 配置:
// containerd/runtime/v2/runc/options.go
func (o *LinuxOptions) ToSpec() (*specs.Spec, error) {// 解析CPU配額if o.CPUQuota > 0 {spec.Linux.Resources.CPU.CFSQuota = o.CPUQuota}// 解析內存限制if o.MemoryLimit > 0 {spec.Linux.Resources.Memory.Limit = &memory.Limit}}

五、未來演進:后 Docker 時代的 Containerd

5.1 Kubernetes 對 Containerd 的直接支持

自 Kubernetes 1.20 起,可直接使用 Containerd 作為 CRI 運行時,跳過 Docker 中間層:

# kubelet配置文件apiVersion: kubelet.config.k8s.io/v1kind: KubeletConfiguration
runtimeRequestTimeout: "15m"
containerRuntime: remotecontainerRuntimeEndpoint: unix:///run/containerd/containerd.sock

5.2 功能對比矩陣

在這里插入圖片描述

六、總結

Docker 與 Containerd 的交互本質是標準化接口(OCI)+ 分層架構(管理平面與運行平面分離的典型實踐。理解兩者的通信協議(gRPC)、數據流轉(鏡像存儲 / CAS)和生命周期管理(容器創建 / 啟動流程),是解決容器化部署中復雜問題的關鍵。隨著 Kubernetes 生態對 Containerd 的直接支持,掌握這一交互機制也成為云原生工程師的核心能力之一。

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

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

相關文章

C++ Vector 基礎入門操作

一、Vector初始化&#xff1a;5種常用方式 ??1. 默認構造?? 創建空容器&#xff0c;適用于后續動態添加元素&#xff1a; std::vector<int> vec; // 空vector&#xff0c;size0 2. 指定大小和初值?? 預分配空間并初始化元素&#xff1a; std::vector<int>…

社會治理創新平臺PPT(48頁)

社會治理創新背景 社會治理創新旨在加強和完善基層社會管理和服務體系&#xff0c;提升政府效能&#xff0c;強化城鄉社區自治和服務功能。自黨的十六屆四中全會提出“推進社會管理體制創新”以來&#xff0c;社會治理創新已成為政府工作的重要篇章。 社會治理創新現狀與挑戰…

論文筆記:Answering POI-Recommendation Questions using TourismReviews

2021 CIKM 1 intro 根據貝恩公司&#xff08;Bain & Company&#xff09;2019年的一份報告&#xff0c;旅行者在預訂前通常會進行33至500次網頁搜索 部分用戶會訪問超過50個旅游網站&#xff0c;三分之一的上網時間都用于與旅行相關的活動。在某些情況下&#xf…

帶約束的高斯牛頓法求解多音信號分離問題

一、信號模型與優化問題建立 1. 復信號模型 設觀測的復信號由兩個單頻復指數信號加噪聲組成&#xff1a; x [ n ] A 0 e j ( 2 π f 0 n T s ? 0 ) A 1 e j ( 2 π f 1 n T s ? 1 ) w [ n ] , n 0 , 1 , … , N ? 1 x[n] A_0 e^{j(2\pi f_0 n T_s \phi_0)} A_1 e…

Java并發編程中高效緩存設計的哲學

文章目錄 引言詳解緩存的設計和演進基于緩存存儲運算結果鎖分段散列減小鎖粒度異步化提升處理效率原子化避免重復運算小結參考引言 本文將基于并發編程和算法中經典的哈希取模、鎖分段、 異步化、原子化。這幾個核心設計理念編寫逐步推演出一個相對高效的緩存工具,希望對你有…

MATLAB的.mat文件

.mat文件是MATLAB的專有二進制數據文件格式&#xff0c;用于保存MATLAB工作空間中的變量和數據。 主要特點&#xff1a; 1. 存儲內容&#xff1a; 各種類型的變量&#xff08;數組、矩陣、結構體、單元數組等&#xff09;函數句柄、對象稀疏矩陣多維數組 2. 文件特性&#…

ICM-20948 Wake on Motion功能開發全過程(7)

接前一篇文章:ICM-20948 Wake on Motion功能開發全過程(6) 探索工作 深入探索 上一回講到,筆者在InvenSense官網上找到了實現Wake on Motion功能的指導文檔。其中主要步驟如下: 本回就來結合文檔中的步驟,詳細講解每一步。 (1)第1步 —— 初始化所有配置 注意,文檔…

Dipal D1:數字人時代的全新人機關系形態

在科技不斷突破的今天,虛擬與現實之間的界限正變得越來越模糊。Dipal D1 作為全球首款搭載2.5K曲面OLED顯示屏的3D AI數字人硬件產品,不僅是一款情感陪伴設備,更是AI、AIGC、動漫文化與情感科技深度融合下的全新交互入口。它代表著“孤獨經濟”、“創作者經濟”和“虛擬互動…

Linux離線編譯安裝nginx

Linux離線安裝nginx 1.切換到root用戶 #切換到root用戶 su - #退出root用戶 exit2.目錄操作 #切到根目錄 cd / #查看目錄 ls #切目錄 cd /home/... #到對應的目錄下解壓3.安裝Nginx 在有網絡的設備上下載以下文件&#xff1a; Nginx&#xff1a;從 nginx.org/en/download…

Qt PyQt與PySide技術-C++庫的Python綁定

Qt PyQt與PySide技術-C庫的Python綁定 一、概述二、區別于聯系1、PyQt&#xff1a;Riverbank Computing的解決方案a、發展歷程b、許可模式c、技術特點 2、PySide&#xff1a;Qt官方的Python綁定a、發展歷程b、許可模式c、技術特點 三、對比許可證功能與兼容性社區與維護其他差異…

使用.detach()代替requires=False避免計算圖錯誤

解決對一個對象多次BP更新時造成的RuntimeError: you can only change requires_grad flags of leaf variables.問題_解決對一個對象多次bp更新時造成的問題-CSDN博客 代碼中存在一個特征需要參與輔助損失的計算&#xff0c;由于需要反復進行反向傳播更新&#xff0c;計算圖容易…

linux+docker+ollama+git常用指令

1、Linux命令 新建txt文件&#xff1a;touch xxx.txt 給txt文件夾權限&#xff1a;chmod x xxx.txt 查看日志&#xff1a;tail -f xxx.log / less xxx.log 根據關鍵字查看日志&#xff1a;grep "error" 文件名 查看端口狀態&#xff1a;netstat -an|grep xxxxx 查看…

【八股消消樂】消息隊列優化—系統架構設計

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一個正在變禿、變強的文藝傾年。 &#x1f514;本專欄《八股消消樂》旨在記錄個人所背的八股文&#xff0c;包括Java/Go開發、Vue開發、系統架構、大模型開發、具身智能、機器學習、深度學習、力扣算法等相關知識點&#xff…

WebSocket長連接在小程序中的實踐:消息推送與斷線重連機制設計

一、引言&#xff1a;為什么需要WebSocket長連接&#xff1f; 傳統方案的痛點&#xff1a;HTTP輪詢的低效性&#xff08;高延遲、高資源消耗&#xff09;小程序場景需求&#xff1a;實時消息推送&#xff08;如IM、直播彈幕、IoT設備狀態同步&#xff09;技術選型對比&#xf…

MySQL索引使用指南:何時該為字段添加索引?

在MySQL的性能優化中&#xff0c;索引是最常用且有效的手段之一。但“索引不是萬能藥”——盲目添加索引可能導致寫操作變慢、存儲空間浪費&#xff0c;甚至引發索引失效問題。本文將結合原理與實戰場景&#xff0c;幫你理清??“何時該用索引”??的核心判斷邏輯。 一、先理…

AI時代關鍵詞SEO優化

內容概要 在人工智能&#xff08;AI&#xff09;驅動的時代浪潮下&#xff0c;搜索引擎優化&#xff08;SEO&#xff09;正迎來深刻變革&#xff0c;關鍵詞策略已成為流量獲取的核心戰場。本文將系統剖析AI時代關鍵詞優化的前沿方法&#xff0c;涵蓋語義分析的精準研究、用戶意…

GO 語言學習 之 代碼風格

1. 命名規范 字母數字和下劃線組成 以小寫字母、大寫字母或下劃線開頭 不允許包含標點符號、運算符、空白字符&#xff08;空格、TAB、換行&#xff09;等 采用駝峰命名法 &#xff08;大駝峰、小駝峰&#xff09; 見名知義&#xff1a;命名要有實際意義&#xff0c;易讀性&am…

【軟考高級系統架構論文】論云上自動化運維及其應用

論文真題 云上自動化運維是傳統IT運維和 DevOps的延伸,通過云原生架構實現運維的再進化。云上自動化運維可以有效幫助企業降低IT運維成本,提升系統的靈活度,以及系統的交付速度,增強系統的可靠性,構建更加安全、可信、開放的業務平臺。 請圍繞“云上自動化運維及其應用”…

錯誤: 程序包androidx.fragment.app不存在 import android

錯誤: 程序包androidx.fragment.app不存在 import androidx.fragment.app.FragmentActivity; 這個是什么錯?dependencies { //implementation fileTree(dir: libs, include: [*.jar]) implementation project(path: :libscan) //noinspection GradleCompatible implementation…

Java UDP Socket 實時在線刷卡掃碼POS消費機門禁控制板服務端示例源碼

本示例使用的設備&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bYG0BuO&ftt&id17021194999 一、獲取本電腦所有網卡IP public static String getIP() {Enumeration<NetworkInterface> netInterfaces;ArrayList<String>…