Docker Engine 架构
Docker Engine 采用客户端-服务器架构,由多个组件协同工作。
架构组件
Docker CLI
Docker CLI 是用户与 Docker 交互的命令行工具,通过 REST API 与 Docker Daemon 通信。
Docker Daemon (dockerd)
Docker Daemon 是长期运行的后台进程,负责:
- 管理容器生命周期
- 管理镜像和层
- 管理网络和存储
- 处理 API 请求
containerd
containerd 是一个高级容器运行时,提供:
- 镜像管理(拉取、推送、存储)
- 容器生命周期管理
- 快照和存储管理
- 网络命名空间管理
runc
runc 是 OCI (Open Container Initiative) 标准的参考实现,负责:
- 创建和运行容器
- 管理 Linux 命名空间 (Namespaces)
- 管理控制组 (Cgroups)
- 管理文件系统
工作流程
容器启动流程
1. docker run 命令
↓
2. Docker CLI 发送请求到 Daemon
↓
3. Daemon 解析请求
↓
4. containerd 准备容器运行时
↓
5. runc 创建容器
↓
6. 容器运行镜像拉取流程
1. docker pull 命令
↓
2. Daemon 检查本地镜像
↓
3. 如果不存在,从 Registry 拉取
↓
4. containerd 管理镜像层
↓
5. 镜像存储到本地命名空间 (Namespaces)
Docker 使用 Linux 命名空间实现容器隔离:
- PID 命名空间 - 进程隔离
- 网络命名空间 - 网络隔离
- 挂载命名空间 - 文件系统隔离
- UTS 命名空间 - 主机名隔离
- IPC 命名空间 - 进程间通信隔离
- 用户命名空间 - 用户 ID 隔离
控制组 (Cgroups)
Cgroups 用于限制和监控资源使用:
- CPU 限制
- 内存限制
- I/O 限制
- 设备访问控制
存储驱动
存储驱动负责管理镜像和容器的文件系统层。常见驱动:
- overlay2 - 推荐,性能好
- devicemapper - 旧版本使用
- btrfs - 需要 Btrfs 文件系统
- zfs - 需要 ZFS 文件系统