
架构核心组件与流程
-
Docker Client(客户端)
- 用户交互入口:
dockerCLI、Docker Desktop - 发送命令(
run/build/pull)→ 通过 REST API 发给守护进程
- 用户交互入口:
-
Docker Daemon(dockerd,守护进程)
- 核心大脑:管理镜像、容器、网络、卷
- 内部:API Server + 镜像 / 容器 / 网络 / 存储管理器
- 不直接跑容器 → 交给 containerd
-
containerd(高层运行时)
- 容器生命周期管理、镜像分发、存储 / 网络调度
- 调用底层 runc 真正创建容器
-
runc(OCI 标准底层运行时)
- 直接调用 Linux 内核:Namespace(隔离)、Cgroup(资源限制)、Capabilities
- 真正把容器进程跑起来
-
Registry(镜像仓库)
- 存储 / 分发镜像:Docker Hub(公共)、Harbor(私有)
docker pull/push与守护进程交互
-
底层内核技术
- Namespaces:PID、网络、挂载、用户、UTS、IPC 隔离
- Cgroups:CPU / 内存 / IO 配额限制
- UnionFS(如 OverlayFS):镜像分层、写时复制
数据流
docker run→ Client → dockerd → containerd → runc → Linux 内核 → 容器启动
┌─────────────────────────────────────────────────────────────┐
│ 用户层 / 交互层 │
│ ┌─────────────┐ ┌────────────┐ ┌───────────────────────┐ │
│ │ Docker CLI │ │ Docker API │ │ Docker Desktop / UI │ │
│ │ (docker run,│ │ (HTTP API)│ │ │ │
│ │ build,push) │ │ │ │ │ │
│ └─────────────┘ └────────────┘ └───────────────────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Docker Daemon (dockerd) │
│ ┌─────────────┐ ┌────────────┐ ┌───────────┐ ┌─────────┐ │
│ │ API Server │ │镜像管理器 │ │容器管理器 │ │网络/存储│ │
│ │ (接收请求) │ │(pull/push)│ │(生命周期) │ │ 管理器 │ │
│ └─────────────┘ └────────────┘ └───────────┘ └─────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ containerd (容器运行时) │
│ ┌──────────────┐ ┌───────────────┐ ┌───────────────────┐ │
│ │ 镜像分发 │ │容器生命周期 │ │ 任务调度 (supervisor)│ │
│ │ (管理镜像层) │ │(start/stop) │ │ │ │
│ └──────────────┘ └───────────────┘ └───────────────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ runc (OCI 标准运行时) │
│ 真正调用 Linux 内核,创建容器进程 │
│ - Namespace (PID/Net/Mount/User/UTS/IPC) │
│ - Cgroup (CPU/内存/IO 限制) │
│ - Rootfs 挂载、权限控制 │
└───────────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Linux 内核 │
└─────────────────────────────────────────────────────────────┘
各组件详细职责
1. 用户交互层
- Docker CLI 我们常用的
docker run / build / pull / ps / exec等命令。 - Docker APIdockerd 暴露 REST 接口,供外部程序调用。
- Docker Desktop / UI图形化界面,本质还是调用 API。
2. Docker Daemon(dockerd)
Docker 的核心守护进程,负责:
- 接收客户端请求
- 管理镜像、容器、网络、数据卷
- 不直接创建容器,而是把任务交给 containerd
从 Docker 1.11 开始,dockerd 不再直接管理容器,全部下沉到 containerd。
3. containerd(高层容器运行时)
CNCF 项目,Docker 捐赠,现在也是 Kubernetes 默认运行时。负责:
- 镜像管理(下载、解压、分层)
- 容器生命周期(启动、停止、删除)
- 管理 runc 实例
- 提供稳定的运行时接口
4. runc(底层 OCI 运行时)
OCI(开放容器标准)官方实现,真正创建容器的组件。作用:
- 利用 Linux Namespace 实现隔离
- 利用 Cgroup 做资源限制
- 挂载 rootfs
- 启动容器 init 进程
5. Linux 内核支撑技术
- Namespace:6 种隔离PID、Network、Mount、User、UTS、IPC
- Cgroup:资源限制CPU、内存、磁盘 IO、网络带宽
- UnionFS(Overlay2):镜像分层、写时复制
6. 配套外围组件
- Registry:镜像仓库(Docker Hub、Harbor)
- Volume:数据持久化
- Network:bridge/host/overlay/macvlan 等
完整启动流程
docker run→ CLI → dockerd → containerd → runc → Linux 内核 → 容器运行