Docker Engine由Docker Daemon、Docker Client和REST API三大核心组件构成:Daemon负责容器全生命周期管理,Client是用户操作的命令行接口,REST API定义标准化HTTP通信协议,三者通过Unix套接字或TCP+TLS协同工作。

Docker Engine的三大核心组件
Docker Engine不是单个程序,而是由三个协同工作的核心部分构成:
-
Docker Daemon(dockerd):后台长期运行的服务进程,负责实际执行容器创建、镜像拉取、网络配置、卷管理等所有操作。它监听本地 Unix 套接字(
/var/run/docker.sock)或 TCP 端口,接收并处理来自客户端的请求。 -
Docker Client(docker CLI):用户直接使用的命令行工具。输入如
docker run或docker build后,CLI 并不自己干活,而是将请求序列化为 HTTP 请求,发往 Daemon 的 API 端点。 -
REST API:定义了标准化的接口规范(如
POST /containers/create),是 Client 与 Daemon 之间通信的契约。所有第三方工具(如 Portainer、CI/CD 插件)也都通过调用同一套 API 与 Engine 交互。
Client 与 Daemon 的通信方式
默认情况下,Docker Client 通过 Unix 域套接字与本地 Daemon 通信,安全高效,无需网络开销。你也可以显式指定连接方式:
-
docker -H unix:///var/run/docker.sock info(本地 Unix socket) -
docker -H tcp://192.168.1.100:2376 --tlsverify info(远程 TCP + TLS 加密)
通信全程基于 HTTP/1.1 协议,请求体通常是 JSON 格式(如创建容器时传入的 HostConfig、NetworkingConfig),响应也返回结构化 JSON 数据。这种设计使 Docker 天然支持脚本化、API 化和跨语言集成。
Daemon 内部模块协作机制
Docker Daemon 本身是一个模块化服务,收到 API 请求后,会按职责分派给不同子系统处理:
-
Containerd 集成:现代 Docker Engine 将容器生命周期管理下沉给
containerd(一个独立守护进程)。Daemon 负责编排,containerd 负责调用runc实际创建和运行容器进程。 -
Libnetwork:网络配置由
libnetwork模块统一处理,支持 bridge、host、overlay 等驱动;它通过插件机制调用对应网络驱动(如bridge驱动操作docker0网桥和 iptables 规则)。 -
Graphdriver:镜像和层存储由存储驱动(如
overlay2)管理,负责读写联合文件系统、处理层复用与写时复制(CoW)。 - Execdriver 已弃用:旧版中用于执行容器内命令的模块,现由 containerd 完全接管,Daemon 不再直接 fork 进程。
一次 docker run 的完整调用链
以 docker run -d -p 8080:80 nginx 为例,背后发生的关键步骤:
- CLI 构造 POST 请求到
/containers/create,携带镜像名、端口映射、后台运行等参数 - Daemon 接收后检查本地是否存在
nginx镜像;若无,则触发pullJob,从 Registry 下载并存入 graph - 调用 libnetwork 分配 IP、配置
docker0网桥及 NAT 规则(iptables -t nat) - 调用 containerd 创建容器,并传入 OCI runtime spec;containerd 启动 runc 执行 rootfs 中的
nginx进程 - 容器启动成功后,Daemon 返回容器 ID,CLI 输出简短 ID 并退出
整个过程在毫秒级完成,各环节解耦清晰,故障可定位到具体模块(如 pull 失败查 registry 连接,启动失败查 runc 日志)。










