12_implementation/12.1_arch.md
Docker 的架构设计简洁而高效,主要由客户端和服务端两部分组成。
Docker 采用了 C/S (客户端/服务端) 架构。Client 向 Daemon 发送请求,Daemon 负责构建、运行和分发容器。
graph LR
C1["客户端"] -->|docker run| D["dockerd
守护进程"]
C1 -->|docker pull| D
D -->|管理| C2["Containers
容器"]
D -->|管理| C3["Images
镜像"]
Docker 的内部架构如同洋葱一样分层,每一层专注解决特定问题:
用户与 Docker 交互的主要方式。它将用户命令 (如 docker run) 转换为 API 请求发送给 dockerd。
Docker 的大脑。
行业标准的容器运行时 (CNCF 毕业项目)。
用于创建和运行容器的 CLI 工具。
每个容器都有一个 shim 进程。
当执行 docker run -d nginx 时,内部发生了什么?
flowchart TD
U["用户"]
K["docker run -d nginx"]
D["Dockerd"]
C["Containerd"]
B["OCI Bundle"]
S["Containerd-shim"]
R["Runc"]
P["容器进程
nginx"]
E["退出"]
U -->|1. REST API| D
K -->|2. gRPC| C
C -->|3. 准备镜像和 Bundle| B
C -->|4. 启动 Shim| S
S -->|5. 执行| R
R -->|6. 创建 Namespaces 和 Cgroups| P
R -->|7. 进程退出| E
S -->|8. 监控 IO 和退出| P
从 Docker Engine v29.x 开始,架构进一步简化和标准化:
dockerd --firewall-backend=nftables,可直接创建 nftables 规则而无需依赖 iptables-nft 转换层。生产环境请谨慎使用。在 macOS 和 Windows 上,因为内核差异,架构稍微复杂:
flowchart TD
subgraph HostOS ["MacOS / Windows"]
CLI["Docker CLI"]
subgraph LinuxVM ["Linux VM (虚拟机)"]
Engine["Dockerd <--> Containerd <--> Runc"]
end
CLI -- "(Socket 映射)" --> Engine
end
| 组件 | 角色 | 关键职责 |
|---|---|---|
| CLI | 指挥官 | 发送指令,展示结果 |
| Dockerd | 大管家 | API 接口,整体调度 |
| Containerd | 经理 | 容器生命周期,镜像管理 |
| Shim | 监工 | 保持 IO,允许无守护进程重启 |
| Runc | 工人 | 真正干活 (创建容器),干完就走 |