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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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>…