图片来自 Nigel Poulton的深入浅出Docker
Docker引擎由如下的组件构成
总体逻辑如图
Docker首次发布时,Docker引擎由两个核心组件构成LXC和Docker Deamon.
Docker Deamon是单一的二进制文件,包含诸如Docker客户端,Docker API,容器运行时,镜像构建等.
LXC提供了对诸如命名空间和控制组等基础工具的操作能力,它们是基于Linux内核的容器虚拟化技术.
LXC是基于Linux的,这对于跨平台的项目来说是个问题.
其次核心的组件依赖于外部工具,Docker公司开发了名为Libcontainer的自研工具,用于替代LXC,它的目的是成为平台无关的工具,可基于不同的Docker内核为上层提供必要的容器交互功能.在Docker 0.9 版本中,Libcontainer取代LXC成为默认的执行驱动.
拆解将大而全的Docker deamon进程并将其模块化,即尽可能地拆解出其中的功能特性,并用小而专的工具来实现它.
目前的Docker引擎架构示意图如图
Docker公司进行Docker deamon进程的拆解和重构的时候,OCI也正在着手定义两个容器相关的规范
例如Docker deamon不再包含任何容器运行时的代码,所有的容器运行代码在一个单独的OCI兼容层中实现,默认情况下,Docker使用runc来实现这一点.此外,Docker引擎中的containerd组件确保了Docker镜像能够以正确的OCI Bundle的格式传递给runc.
runc实质上是一个轻量级的,针对libcontainer进行了包装的命令交互工具,有时候将runc所在的那一层称为OCI层
Docker deamon的功能进行拆解后,所有的容器执行逻辑被重构到containerd中,它的主要任务是容器的生命周期管理 start|stop|pause|rm ...
containerd用来指挥runc创建新容器,每次创建容器时,它都会fork一个新的runc实例,一旦容器创建完毕,对应的runc进程就会退出,因此即时运行上百个容器,也无需保持上百个运行中的runc实例.
一旦容器进程的父进程runc退出,相关联的containerd-shim进程就会成为容器的父进程.
shim进程的部分职责如下:
原文:https://www.cnblogs.com/SheezyGuo/p/12773068.html