containerd源码分析

本文详细分析了containerd v0.2.4的源码,从ctr调用containerd-api开始,涉及checkpoint、containers、events、state和version等模块。接着,探讨了从containerd-api到supervisor的任务处理流程,再到runtime(runC)的交互,特别是createContainer的代码路径,包括daemon的启动、task监听与处理、以及containerd-shim如何接收并执行runc命令。重点解析了package supervisor中的关键代码,它们负责任务的监控和处理。
摘要由CSDN通过智能技术生成

本文是对containerd v0.2.4的源码分析。

Containerd源码流程图

这里写图片描述

源码接口调用详情

从ctr调用containerd-api

checkpoint(用于快照,docker目前该功能不完善)
ctr cmd containerd-api
list /types.API/ListCheckpoint
create /types.API/CreateCheckpoint
delete /types.API/DeleteCheckpoint
containers
ctr cmd containerd-api
list、state /types.API/State
pause、resume、update /types.API/UpdateContainer
create /types.API/CreateContainer
stats /types.API/Stats
watch /types.API/State, /types.API/Events
exec /types.API/Events, /types.API/AddProcess, /types.API/UpdateProcess
kill /types.API/Signal
start /types.API/Events, /types.API/CreateContainer , /types.API/UpdateProcess
update /types.API/UpdateContainer
events

/types.API/Events

state

/types.API/State

version

/types.API/GetServerVersion –return result

从containerd-api至supervisor任务处理

注:API–server.go –> daemon – supervisor.go(handleTask func)

checkpoint
containerd-api supervisor
/types.API/ListCheckpoint (supervisor.GetContainersTask) getContainers
/types.API/CreateCheckpoint createCheckpoint
/types.API/DeleteCheckpoint deleteCheckpoint
containers
containerd-api supervisor
/types.API/State /types.API/Stats (supervisor.GetContainersTask) getContainers
/types.API/UpdateContainer (supervisor.UpdateTask) updateContainer
/types.API/CreateContainer (supervisor.StartTask) start
/types.API/Events Events
/types.API/AddProcess addProcess
/types.API/UpdateProcess updateProcess
/types.API/Signal signal

从supervisor至runtime(runC)

checkpoint
supervisor runtime
getContainers -
createCheckpoint (runtime)CheckPoint –>exec.Command(c.runtime,arg….)
deleteCheckpoint (runtime)DeleteCheckpoint
containers
supervisor runtime
getContainers -
updateContainer (runtime)Resume Pause UpdateResources–>exec.Command(c.runtime,arg….)
start (runtime supervisor/worker.go) Start –>exec.Command(c.shim,c.id,c.bundle,c.runtime)
addProcess (runtime) exec –> exec.Command(c.shim,c.id,c.bundle,c.runtime)
updateProcess -
signal -

以createContainer为例走读代码

deamon启动监听tasks及startTasks进程

进入main.go main方法调用daemon方法
app.Action = func(context *cli.Context) {
       if err := daemon(context); err != nil {
   
              logrus.Fatal(err)
       }
}
进入main.go daemon方法
for i := 0; i < 
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker 是一个开放源代码项目,你可以在 Docker 的官方 GitHub 仓库中找到其源代码。要进行 Docker 源码分析,你可以按照以下步骤进行: 1. 克隆仓库:在你的本地环境中,使用 Git 命令克隆 Docker 仓库。可以使用以下命令执行克隆操作: ``` git clone https://github.com/docker/docker.git ``` 2. 探索代码结构:进入克隆的仓库目录,浏览仓库中的文件和目录结构。Docker 的核心代码位于 `components/engine` 目录下。 3. 阅读文档:Docker 项目的文档对于理解源代码非常重要。阅读 Docker 的官方文档,特别是关于项目架构和核心概念的部分,可以帮助你更好地理解源代码。 4. 调试和分析:使用你喜欢的集成开发环境(IDE)或文本编辑器打开源代码,并开始进行调试和分析。根据你的兴趣和需求,你可以从以下几个方面入手: - 阅读核心组件:浏览 `components/engine` 目录下的代码,了解 Docker 引擎的实现细节。 - 研究容器运行时:深入研究 `components/containerd` 目录下的代码,了解容器运行时的实现原理。 - 探索网络和存储:查看 `components/network` 和 `components/volume` 目录下的代码,了解 Docker 网络和存储的实现。 - 调查命令行界面:浏览 `components/cli` 目录下的代码,了解 Docker 命令行界面的实现逻辑。 请注意,Docker 项目非常庞大而复杂,因此在进行源码分析时需要有一定的耐心和技术基础。阅读和理解项目的设计和架构是理解源代码的关键。此外,参与 Docker 社区和与其他开发者交流也会对你的源码分析有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值