一、什么是 Container Runtime?
Container Runtime(容器运行时)是实际负责创建和管理容器生命周期的底层程序。它负责启动容器进程、设置文件系统、网络、命名空间、Cgroups 等 Linux 隔离机制。
Docker 早期采用 monolithic 架构,将运行时功能直接集成在 Docker Daemon 中。随着容器技术的发展,Docker 引入了分层架构,主要使用 containerd 和 runc 作为容器运行时。
二、常见的容器运行时组件
1. runc
-
OCI(Open Container Initiative) 标准参考实现。
-
用于启动和运行容器的低层工具,直接操作 Linux namespace 和 cgroup。
-
Docker、containerd、Kubernetes 等项目默认使用 runc。
2. containerd
-
高层运行时,介于 Docker Daemon 与 runc 之间。
-
负责管理容器的整个生命周期,如创建、启动、暂停、销毁容器。
-
也支持镜像管理、存储驱动、网络接口等功能。
-
Docker Daemon 将大多数容器管理任务交由 containerd 完成。
3. shim(如 containerd-shim)
-
在 containerd 与 runc 之间,负责将容器进程与 containerd 解耦。
-
确保 containerd 崩溃不会影响正在运行的容器。
三、工作流程示意
Docker Client → Docker Daemon → containerd → containerd-shim → runc → 容器
四、容器运行时的职责
-
创建和启动容器进程
-
配置容器文件系统挂载点
-
设置网络、设备、命名空间等隔离机制
-
管理容器资源限制(CPU、内存等)
-
运行后监控容器状态,处理容器日志、退出码等
五、兼容其他运行时(Kubernetes 背景)
Docker 支持 OCI 标准容器运行时,因此也可以集成替代 runc 的运行时:
-
crun:速度更快、资源开销更小,支持 cgroup v2
-
gVisor:提供用户态隔离,增强安全性
-
Kata Containers:结合虚拟化与容器的安全性与隔离性
六、与 Docker 的关系
组件 | 关系说明 |
---|---|
Docker Daemon | 调用 containerd 和 runc 来完成容器创建和运行任务 |
containerd | Docker 的默认高层容器运行时,管理容器生命周期 |
runc | 实际启动容器进程的底层工具,符合 OCI 容器标准实现 |
Docker Compose | 间接使用 Docker Daemon,触发 containerd 管理容器的过程 |
七、总结
容器运行时是容器技术体系中至关重要的一层,直接决定了容器的启动、运行效率和隔离效果。Docker 通过 containerd 和 runc 实现容器的高效运行与标准化部署,为现代云原生应用打下了坚实基础。