根据官网containerd.io的简介,可以得知 containerd 作为容器的生命周期管理。其在整个容器生态的组织架构中的职责如下:
architecture

如下分析 containerd 的启动流程

基于 containerd-v1.7.0 版本分析

入口代码其实比较简单,具体如下:

1
2
3
4
5
6
7
8
// cmd/containerd/main.go
func main() {
app := command.App()
if err := app.Run(os.Args); err != nil {
fmt.Fprintf(os.Stderr, "containerd: %s\n", err)
os.Exit(1)
}
}
  • command.App 关键逻辑如下:
    • flags 构造
    • 注册插件,重点在于 plugin.Init 初始化构造
    • 启动 TCPServer、GCPServer、TTRPCServer

流程图大纲如下:
containerd-run

后续会结合具体的插件进行明细示例分析。