Docker 核心组件详解
全景概览
Docker 的核心组件可以从底层到上层划分为三个层面:
graph TB
subgraph 用户层
CLI[docker CLI]
API[REST API]
Compose[Docker Compose]
end
subgraph 引擎层
Daemon[Docker Daemon dockerd]
containerd[containerd<br/>容器运行时管理器]
runc[runc<br/>OCI 运行时实现]
end
subgraph 内核层
Namespace[Linux Namespaces<br/>隔离]
cgroups[cgroups<br/>资源限制]
UnionFS[UnionFS / OverlayFS<br/>分层文件系统]
NetFilter[Netfilter / iptables<br/>网络规则]
end
CLI -->|发送命令| API
API --> Daemon
Compose --> Daemon
Daemon --> containerd
containerd --> runc
runc --> Namespace
runc --> cgroups
runc --> UnionFS
runc --> NetFilter
组件详表
| 组件 | 角色 | 关键职责 |
|---|---|---|
| dockerd | 主守护进程 | 镜像管理、API 服务、构建引擎 |
| containerd | 容器运行时管理器 | 管理容器生命周期、镜像拉取解压 |
| runc | OCI 运行时 | 真正创建和运行容器进程 |
| docker-proxy | 网络代理 | 端口映射,容器端口对外暴露 |
| Docker CLI | 命令行工具 | 用户交互界面 |
| Docker Compose | 编排工具 | 定义和运行多容器应用 |
| Docker Swarm | 集群管理 | 原生集群和编排方案 |
深入理解各组件
1. dockerd(Docker Daemon)
这是 Docker 架构中的核心守护进程,负责:
# dockerd 启动后监听
# - Unix Socket: /var/run/docker.sock(默认)
# - TCP: 2375(非 TLS)/ 2376(TLS)
# 查看 dockerd 进程
ps aux | grep dockerd
# root ... /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
2. containerd
containerd 是从 Docker 中拆分出来的工业级容器运行时:
graph LR
A[Docker Engine] -->|CRI/grpc| B[containerd]
B -->|task create| C[runc]
B -->|镜像管理| D[镜像存储]
B -->|存储管理| E[快照器 snapshotter]
特点:
– 2017 年捐赠给 CNCF,现已是毕业项目
– Kubernetes 可以通过 CRI(Container Runtime Interface)直接对接 containerd
– 比 dockerd 更轻量,适合嵌入场景
# containerd 的核心命令(通过 ctr 或 nerdctl)
ctr images pull docker.io/library/nginx:alpine
ctr run docker.io/library/nginx:alpine nginx
3. runc
runc 是 OCI(Open Container Initiative)运行时规范的参考实现:
graph TB
subgraph OCI Runtime Spec
S1[ config.json<br/>容器配置]
S2[ rootfs<br/>容器根文件系统]
end
subgraph runc 执行流程
runc -->|读取 config.json| CFG_OK[加载配置]
CFG_OK -->|clone() 系统调用| NS[创建 Namespace]
NS -->|挂载 rootfs| ROOT[设置文件系统]
ROOT -->|exec| PID1[启动容器 PID 1 进程]
end
# runc 直接运行容器(不经过 Docker CLI)
runc run mycontainer
4. docker-proxy
每个需要端口映射的容器都会启动一个 docker-proxy 进程:
# 当执行 docker run -p 8080:80 nginx 后
ps aux | grep docker-proxy
# root ... /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.2 -container-port 80
组件调用链
以 docker run nginx 为例:
sequenceDiagram
participant CLI as docker CLI
participant D as dockerd
participant CTD as containerd
participant R as runc
participant OS as Linux Kernel
CLI->>D: POST /containers/create
D->>D: 解析镜像配置
D->>CTD: Create container (gRPC)
CTD->>CTD: 解压镜像层
CTD->>R: bundle + start
R->>OS: clone(CLONE_NEWNS\|CLONE_NEWPID\|...)
R->>OS: pivot_root (切换文件系统)
R->>OS: exec(nginx command)
R-->>CTD: 容器 PID 返回
CTD-->>D: 容器运行中
D-->>CLI: 返回容器 ID
总结
Docker 的组件设计体现了分层和解耦的思想:
– dockerd — 用户交互层,提供易用的 API
– containerd — 运行时管理层,专注于容器的生命周期管理
– runc — 底层实现层,调用内核特性创建容器
这种分层架构使得 Docker 生态非常灵活——Kubernetes 可以跳过 dockerd 直接使用 containerd,而底层运行时的替换(如 gVisor、Kata)也只需对接 OCI 标准即可。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容