问题: Docker运行时有哪些组件?

👇 点击展开/折叠 面试背诵模板(建议先背这个) Docker运行时采用分层架构,核心组件包括:Docker Daemon(dockerd)作为后台守护进程管理容器生命周期;containerd作为容器运行时管理程序,负责容器的创建、启动和停止;runc作为轻量级运行时工具,直接与Linux内核交互创建容器;containerd-shim作为轻量级代理进程,管理每个容器的状态并解耦运行时。此外,Docker采用客户端-服务器(C/S)架构,包含Docker Client和REST API。底层依赖Linux内核的命名空间(Namespace)实现隔离、Cgroups实现资源限制、联合文件系统(UnionFS)实现镜像分层存储。
---

一、Docker引擎核心组件

Docker采用客户端-服务器(C/S)架构,由多个核心组件协同工作。

组件 说明
Docker Daemon(dockerd) Docker的后台守护进程,长期运行并管理容器、镜像、网络和卷等资源。负责监听来自Docker客户端的API请求
Docker Client 命令行工具(docker命令),用户通过它与Docker Daemon进行交互
Docker REST API 允许其他应用程序通过HTTP请求与Docker引擎通信

二、容器运行时栈(自顶向下)

Docker的容器运行时经过解耦,形成标准化的分层架构。

① Docker Daemon(dockerd)
Docker守护进程,是用户与容器交互的入口。当执行docker run时,客户端向Docker Daemon发送请求。

② containerd
Docker的容器运行时管理程序,负责容器的创建、启动、停止和销毁等生命周期管理。containerd是一个独立的守护进程,可单独运行,提供容器进程的隔离和管理功能。Docker Engine默认使用containerd管理容器生命周期。

③ containerd-shim
每个容器都会有一个与之关联的containerd-shim轻量级进程。它作为容器运行时和containerd之间的中介,负责监听容器的状态变化并报告给containerd。启动一个容器就会启动一个shim进程。shim允许使用备用运行时而无需更改Docker守护进程的配置。

④ runc
runc是轻量级的容器运行时工具,是OCI(Open Container Initiative)规范的一个参考实现。它直接与Linux内核的cgroups和命名空间功能交互,负责创建和运行容器。containerd默认使用runc作为其容器运行时。

三、底层支撑技术

Docker容器运行依赖Linux内核的以下关键技术:

技术 作用
命名空间(Namespaces) 实现资源隔离,包括进程ID(PID)、网络(Network)、挂载点(Mount)、用户ID(User)、进程间通信(IPC)等
控制组(Cgroups) 对容器的CPU、内存、磁盘I/O等资源进行限制、优先级分配和审计
联合文件系统(UnionFS) 实现镜像的分层存储,多个容器可共享同一份基础镜像层,节省存储空间

四、组件协作流程(docker run为例)

  1. 用户执行docker run命令,Docker Client通过REST API向Docker Daemon发送请求
  2. Docker Daemon调用containerd来创建和启动容器
  3. containerd启动containerd-shim进程,并通过runc创建容器
  4. runc利用Linux内核的命名空间和Cgroups创建隔离的容器进程
  5. containerd-shim持续监听容器状态变化并报告给containerd