一、Docker引擎简介¶
1.1 Docker引擎定义¶
Docker引擎用来运行和管理容器的核心软件。Docker引擎采用模块化的设计原则。
1.2 Docker引擎组成¶
Docker客户端(Docker Client)、Docker守护进程(Docker daemon)、containerd以及runc。

二、Docker引擎详解¶
2.1 runc¶
runc是一个CLI包装器,实质上就是一个独立的容器运行时工具。直接下载它或基于源码编译二进制文件,即可拥有一个全功能的runc。
runc的作用只有一个,那就是创建容器。
2.2 containerd¶
containerd位于daemon和runc所在的OCI层之间,同时Kubernetes也可以通过cri-containerd使用containerd。
containerd的主要任务是容器的生命周期管理,即start | stop | pause | rm操作。
2.3 shim¶
shim是实现无daemon的容器。
一旦容器进程的父进程runc退出,相关联的containerd-shim进程就会成为容器的父进程。当作为容器的父进程时,shim的部分职责如下: 1、保持所有STDIN和STDOUT流是开启状态,从而当daemon重启的时候,容器不会因为管道(pipe)的关闭而终止。 2、将容器的退出状态反馈给daemon。
2.4 启动一个新的容器-示例¶
执行docker container run --name ctrl -it ubuntu:latest sh命令基于ubuntu:latest镜像启动一个新的容器。
root@zq-virtual-machine:~# docker container run --name ctrl -it ubuntu:latest sh
针对以上启动新的容器,过程如下: 1、Docker客户端向Docker API发出docker container run命令。 2、Docker API在daemon实现的,daemon收到创建新容器命令后,通过gRPC与containerd进行通信。指示containerd启动新容器。 3、containerd自己并不负责创建新容器,而是将Docker镜像转换为OCI bundle后传递给runc,指示runc创建容器。 4、runc收到后,与操作系统内核接口进行通信,基于所有必要工具(Namespace、CGroup等)来创建容器。容器进程作为runc的子进程启动,启动完毕后,runc将会退出。