容器启动全流程
容器启动涉及多层组件调用,下面追踪完整流程。
调用链
Bash
docker run my-app
↓
Docker CLI (客户端)
↓ REST API (HTTP)
Docker Daemon (dockerd)
↓ gRPC
Containerd
↓
Containerd-shim
↓
Runc
↓
Linux Namespace + Cgroups
↓
容器进程
详细流程
1. Docker CLI 解析
JSON
docker run -d --name my-app -p 80:80 nginx
CLI 解析参数,通过 REST API 发送请求给 Docker Daemon。
2. Docker Daemon 处理
Bash
dockerd 接收请求:
1. 检查镜像是否存在
2. 如无则从 Registry 拉取
3. 创建容器配置
4. 调用 Containerd 创建容器
3. Containerd 创建
Bash
Containerd 接收:
1. 创建容器命名空间
2. 准备根文件系统
3. 调用 containerd-shim
4. Runc 启动
text
Runc 接收 OCI Spec:
1. 创建 Namespace
2. 设置 Cgroups
3. 配置 rootfs
4. 执行 pivot_root
5. 启动容器进程
OCI 规范
OCI Runtime Spec
定义容器运行时标准:
text
{
"ociVersion": "1.0.2",
"process": {
"terminal": false,
"user": {"uid": 0, "gid": 0},
"args": ["nginx", "-g", "daemon off;"],
"cwd": "/"
},
"root": {
"path": "rootfs",
"readonly": false
},
"linux": {
"namespaces": [
{"type": "pid"},
{"type": "network"},
{"type": "ipc"},
{"type": "mount"},
{"type": "uts"},
{"type": "user"}
],
"resources": {
"memory": {"limit": 536870912}
}
}
}
OCI Image Spec
定义镜像格式标准:
- 清单 (Manifest)
- 层 (Layers)
- 配置 (Config)
调试启动流程
text
# 查看详细日志
sudo dockerd --debug
# 查看 containerd 日志
sudo journalctl -u containerd
# 查看容器进程树
pstree -p $(docker inspect --format='{{.State.Pid}}' my-app)
手动启动容器
text
# 使用 runc 手动启动
mkdir my-container
cd my-container
# 导出 OCI 配置
docker export $(docker create nginx) | tar -xf -
mkdir rootfs
mv * rootfs/
# 生成 OCI 配置
runc spec
# 启动容器
runc run my-container
要点总结
- docker run 调用链:CLI → dockerd → containerd → shim → runc → 容器
- Docker Daemon 处理镜像、网络、存储等高级功能
- Containerd 负责容器生命周期管理
- Runc 是底层容器创建工具,遵循 OCI Runtime Spec
- OCI 规范确保不同容器运行时兼容
📝 发现内容有误?点击此处直接编辑