一、Docker引擎简介

1.1 Docker引擎定义

Docker引擎用来运行和管理容器的核心软件。Docker引擎采用模块化的设计原则。

1.2 Docker引擎组成

Docker客户端(Docker Client)、Docker守护进程(Docker daemon)、containerd以及runc。

Docker引擎总体逻辑图.drawio

二、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将会退出。