分享
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
获课:itazs.fun/16995/
一、 现代 Docker 引擎架构概览
首先,要理解现代 Docker 引擎不再是单一的二进制文件,而是一个由多个组件构成的生态系统,遵循了 OCI(Open Container Initiative) 标准。
text
+-----------------------------------+ +------------------------+
| Docker Client | | containerd-shim |<--(容器进程)
| (docker CLI, docker-compose, etc.)| | (每个容器一个) |
+-----------------------------------+ +------------------------+
| ^
| (通过 gRPC over UNIX Socket) | (管理容器生命周期)
v |
+-----------------------------------+ +------------------------+
| dockerd (Docker Daemon) | | containerd |
| (API Server, Image Management, | |(核心容器运行时管理器) |
| Network, Volumes, Orchestration) | +------------------------+
+-----------------------------------+ ^
| | (通过 runC 操作)
| (管理高阶功能) v
| +------------------------+
+---------------------->| runC |
| (低层次运行时工具) |
+------------------------+
二、 核心模块详解
1. Docker Client (docker)
职责:用户与 Docker 引擎交互的主要命令行界面(CLI)。
功能:
接收用户命令(如 docker run, docker build)。
解析命令和参数。
通过 Docker API 与 dockerd 守护进程通信(通常是本地的 UNIX Socket /var/run/docker.sock 或远程的 TCP 端口)。
接收并格式化 dockerd 返回的结果,展示给用户。
2. Docker Daemon (dockerd)
职责: Docker 引擎的大脑,常驻后台的守护进程,提供完整的容器生命周期管理。
核心子模块:
API Server:暴露 RESTful API 端点,接收来自 Client 或其他工具的请求。这是所有操作的入口。
Image Manager:负责镜像的拉取(Pull)、推送(Push)、构建(Build)、存储和管理。它与存储驱动(Storage Driver) 交互来管理镜像的分层文件系统。
Volume Manager:管理数据卷的生命周期,提供与容器无关的数据持久化存储。与卷驱动(Volume Driver) 交互,支持本地、NFS、云存储等多种后端。
Network Manager:管理容器网络的生命周期(创建、删除、连接)。与网络驱动(Network Driver) 交互,支持 bridge、overlay、macvlan 等多种网络模式。
Orchestration:内置了 Swarm 模式,用于管理容器集群(服务、栈、任务等)。
3. containerd
职责:一个行业标准的核心容器运行时。Docker 将其容器生命周期管理功能剥离出来,形成了 containerd。它更轻量、更专注,现已成为 Kubernetes 等平台的默认容器运行时。
功能:
镜像的传输、存储和管理。
容器的执行和监控(通过 runc)。
存储和网络附加功能的低级接口。
通过 gRPC API 向上层(如 dockerd)提供服务。dockerd 现在更像一个功能丰富的"客户端",而 containerd 是执行引擎。
4. runC
职责:一个轻量级的、符合 OCI 运行时规范 的命令行工具。它是真正创建和运行容器的组件。
功能:
根据 OCI 容器配置规范(config.json) 文件来创建容器。
利用 Linux 内核特性(Namespaces、Cgroups、Capabilities)来生成一个隔离的进程环境。
它本身是一个短命的进程,创建完容器后就会退出。
5. containerd-shim
职责:一个巧妙的设计,用于实现无守护进程的容器(daemonless containers),是 containerd 架构中的关键一环。
为什么需要它?
保持 IO 流:当 containerd 或 dockerd 重启时,shim 可以保证容器的 stdin/stdout/stderr 不会中断,日志也不会丢失。
维护退出状态:shim 会在容器退出后继续存在,收集其退出状态、退出码等信息,并向上汇报,确保不会出现"僵尸"容器。
解耦:它将容器进程与 containerd 守护进程完全解耦,允许升级或重启 containerd 而不影响正在运行的容器。
6. 底层驱动(Drivers)
这些是 dockerd 和 containerd 实现具体功能的插件式模块。
存储驱动(Storage Driver):如 overlay2、aufs、devicemapper。负责实现镜像的分层(Layer)和联合文件系统(Union FS),以及容器可写层的管理。overlay2 是目前推荐的首选。
网络驱动(Network Driver):如 bridge、overlay、host、macvlan。负责实现容器的网络连接、隔离和端口映射等功能。
卷驱动(Volume Driver):如 local、nfs、cifs 以及各种云存储商的驱动(如 azurefile)。负责对接外部存储系统。
7. 容器镜像与 OCI 标准
OCI 镜像规范:定义了容器镜像的格式(Manifest、Layer、Config)。Docker 镜像本质上是一个符合 OCI 规范的压缩包。
OCI 运行时规范:定义了如何运行一个"文件系统包"(即镜像)。runc 是该规范的一个参考实现。
三、 模块间协作流程(以docker run nginx为例)
Client:用户输入 docker run nginx,CLI 解析命令并通过 API 发送给 dockerd。
dockerd:
API Server 接收请求。
Image Manager 检查本地是否有 nginx 镜像,若无则从仓库拉取。
准备容器的配置(网络、卷、环境变量等)。
containerd:dockerd 通过 gRPC 调用 containerd,告知其要创建一个容器。
runc:containerd 调用 runc 命令,并传递根据 OCI 规范生成的 config.json 文件。
runc:runc 使用 Linux 系统调用(clone, setns等)创建新的 Namespace 和 Cgroups,并在这个隔离环境中启动容器进程(如 nginx)。
containerd-shim:runc 退出后,containerd 会启动一个 containerd-shim 进程来接管容器进程。从此,容器进程的父进程是 shim,由 shim 负责其生命周期并与 containerd 通信。
资源管理:整个过程中,Network Manager 和 Volume Manager 会调用相应的驱动来设置容器的网络和存储。
总结
Docker 引擎的核心模块设计体现了关注点分离和模块化的软件工程思想:
docker:用户界面。
dockerd:高阶功能聚合器(API、镜像、网络、卷)。
containerd:核心容器生命周期管理(行业标准)。
runc:低层运行时工具(符合 OCI 标准)。
containerd-shim:实现稳定性和解耦的"胶水"组件。
各种驱动:提供插件式的扩展能力。
这种架构使得 Docker 生态系统更加健壮、灵活,也促进了容器技术的标准化和普及(例如 containerd 被 Kubernetes 直接采用)。
有疑问加站长微信联系(非本文作者))
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信227 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传