当前位置: 首页 > article >正文

从 Docker 到 runC

 从 Docker 到 runC:容器底层原理详解

 

目录

1. Docker 与 runC 的关系

2. Docker 的核心组件

3. runC 的核心功能

4. 实战示例:从 Docker 到 runC

4.1 示例场景:运行一个简单容器

4.2 Docker 底层调用 runC 的流程

4.3 查看 runC 的调用

4.4 直接调用 runC 创建容器

4.5 验证容器的隔离性

5. runC 的核心代码解析

5.1 创建命名空间

5.2 设置 Cgroups

5.3 挂载文件系统

6. Docker 与 runC 的协作流程图

7. 总结

 

1. Docker 与 runC 的关系

Docker 是一个容器化平台,其核心功能是通过容器运行时(Container Runtime)来创建和管理容器。runC 是 Docker 默认使用的底层容器运行时,它实现了 Open Container Initiative (OCI) 标准,负责与 Linux 内核交互,完成容器的创建、启动和销毁。

Docker 与 runC 的协作流程

  1. Docker 客户端(CLI)向 Docker 守护进程dockerd)发送指令(如 docker run)。
  2. dockerd 将指令转化为容器配置(JSON 格式),并调用 containerd(Docker 的容器管理服务)。
  3. containerd 通过 containerd-shim 调用 runC,由 runC 负责创建容器的命名空间(Namespaces)、控制组(Cgroups)和文件系统挂载。
  4. 容器启动后,containerd-shim 与容器保持通信,确保容器生命周期的管理。
2. Docker 的核心组件

Docker 的架构由多个组件组成,以下是关键部分:

组件作用
Docker CLI用户交互接口,用于执行 docker run 等命令。
DockerdDocker 守护进程,处理 Docker CLI 的请求,管理容器生命周期。
Containerd容器管理服务,负责与 runC 交互,管理容器的创建、运行和销毁。
runC容器运行时,负责与 Linux 内核交互,实现容器的隔离和资源限制。
libcontainerDocker 自研的容器管理库(已逐步被 containerd 替代)。
3. runC 的核心功能

runC 是一个轻量级的容器运行时,支持以下核心功能:

  • Namespaces 隔离:通过 Linux 的命名空间(PID、Mount、UTS、IPC、Network、User)实现容器的隔离。
  • Cgroups 资源限制:通过 Linux 的控制组(CPU、内存、磁盘 I/O)限制容器资源使用。
  • 文件系统挂载:挂载容器的根文件系统(RootFS),通常基于 UnionFS(如 AUFS、OverlayFS)。
4. 实战示例:从 Docker 到 runC

以下是一个完整的示例,演示如何通过 Docker 创建一个容器,并分析 runC 的底层行为。

http://www.lryc.cn/news/2384492.html

相关文章:

  • PET,Prompt Tuning,P Tuning,Lora,Qlora 大模型微调的简介
  • 02-jenkins学习之旅-基础配置
  • 互联网大厂Java求职面试:云原生架构与AI应用集成解决方案
  • Python爬虫实战:研究Crawley 框架相关技术
  • C#实现List导出CSV:深入解析完整方案
  • Appium+python自动化(三)- SDK Manager
  • 3D Gaussian Splatting for Real-Time Radiance Field Rendering——文章方法精解
  • 主成分分析基本概念及python代码使用
  • MCP如何助力智能交通系统?从数据融合到精准决策
  • 什么是抽象类?是所有函数都是纯虚函数吗?
  • 计算机视觉与深度学习 | Python实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据
  • 【Unity实战笔记】第二十四 · 使用 SMB+Animator 实现基础战斗系统
  • C/C++的OpenCV 进行图像梯度提取
  • Redis 缓存使用的BigKey问题
  • 【Java高阶面经:消息队列篇】22、消息队列核心应用:高并发场景下的解耦、异步与削峰
  • 软媒魔方——一款集合多种系统辅助组件的软件
  • Unity场景的加载与卸载
  • 多路径可靠传输协议(比如 MPTCP)为什么低效
  • 塔能高温冰蓄冷技术:工厂能耗精准节能的创新之路
  • 内存优化笔记1
  • 人脸识别,使用 deepface + api + flask, 改写 + 调试
  • 代码管理平台Gitlab如何通过快解析实现远程访问?
  • 基于SpringBoot+Vue的足球青训俱乐部管理后台系统的设计与开发
  • Redis 是否适合像 MySQL 一样当数据库使用?
  • AI是否会取代人类?浔川问答①
  • JDBC-java操作数据库
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取目录大小?
  • 线程调度与单例模式:wait、notify与懒汉模式解析
  • MySQL中TCP和套接字SSL加密连接行为分析
  • php本地 curl 请求证书问题解决