Docker 学习 4. Docker引擎架构
Docker现代架构由五部分构成:Docker Client、Dockerd、Containerd、Runc 和 Shim:
Docker Client
Docker 客户端,用于用户向 Docker 提交命令请求。
Dockerd
Dockerd,即 Docker Daemon。负责镜像构建、镜像管理、REST API、核心网络及编排等。其通过 gRPC 与 Containerd 进行通信。
Containerd
Containerd,即 Container Daemon。负责管理容器的生命周期。不过,其本身不会去创建容器,而是调用 Runc 来创建容器。
Runc
Runc,Run Container,是 OCI 容器运行时规范的实现,Runc 项目的目标之一就是与 OCI 规范保持一致。所以,Runc 所在层也称为 OCI 层。这使得 Docker Daemon 中不用再包含任何容器运行时的代码了,简化了 Docker Daemon。
Runc 只有一个作用一创建容器,其本质是一个独立的容器运行时 CLI 工具。其在 fork 出一个容器子进程后会启动该容器进程。在容器进程启动完毕后,Runc 会自动退出。
Shim
Shim(垫片)是实现“Daemonless Container(无 Docker Daemon 容器)”不可或缺的工 具,使容器与 Docker Daemon 解耦,使得 Docker Daemon 的维护与升级不会影响到运行中的容器。
每次创建容器时,Containerd 同时会 fork 出 Runc 进程与 Shim 进程。当 Runc 自动退出 之前,会先将新容器进程的父进程指定为相应的 Shim 进程。
除了作为容器的父进程外,Shim 进程还具有两个重要功能:
- 保持所有 STDIN 与 STDOUT 流的开启状态,从而使得当 Docker Daemon 重启时,容器不会因为 Pipe 的关闭而终止。
- 将容器的退出状态反馈给 Docker Daemon。