containerd源码分析:创建容器

在上一篇文章中我们介绍了containerd如何创建任务,当任务创建完成后,将返回一个响应给ctr。接着,ctr会调用任务的Start方法来启动容器。

然后,ctr调用containerd的/containerd.services.tasks.v1.Tasks/Start接口来创建任务。我们可以进入containerd查看提供该服务的插件。

经过containerd各个插件的层层调用,最终会到达containerd.task.v2.Task.Start ttrpc服务。提供containerd.task.v2.Task.Start服务的是containerd-shim-runc-v2。

调用Container.Start启动容器进程后,runc init将退出,容器的主进程将交由runc init的父进程shim。

通过这样的处理,容器进程就与containerd无关,不再受containerd的影响,仅与其shim有关,由shim管理。这也是引入shim的原因。

从上述containerd创建容器的分析可以看出,containerd中插件之间的调用是分层的。containerd的架构如下:

containerd创建容器的示意图如下:

ctr创建的container的交互流程图如下:

containerd源码分析系列文章介绍了containerd是如何创建容器的,完整了从kubernetes到容器创建这一条线。

标签:游戏攻略