全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-21 7 分钟 ✍️ juanwangdev

容器启动全流程

容器启动涉及多层组件调用,下面追踪完整流程。

调用链

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 规范确保不同容器运行时兼容

📝 发现内容有误?点击此处直接编辑

← 上一篇 容器与宿主机内核关系
下一篇 → 存储 IO 性能调优
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库