containerd 提供了一组运行容器的 API。Docker 引擎通过调用 GRPC API 来启动执行进程,随后会启动管理器和执行器来负责监控和运行容器。容器最后通过runC来运行,runC 也是 Docker的另一个开源项目,它实现了 OCI 运行时标准。(OCI:开放容器协议,OCI开发了runC)。runC 是一套符合OCI标准的容器引擎;其是一个非常独立,真正创建容器的组件,runC可以独立于dockerd创建、操作容器。
简而言之:
containerd独立负责容器运行时和生命周期(如创建、启动、停止、中止、信号处理、删除等)containerd 只是一个守护进程
容器的实际运行时由 runc 控制
containerd 主要职责是镜像管理(镜像、元信息等)、容器执行(调用最终运行时组件执行)。
containerd-shim 调用runc启动容器,监控容器进程状态,回收容器中的相关进程等
dockerd是docker engine守护进程,dockerd启动时会启动containerd子进程,dockerd与containerd通过rpc进行通信
Docker 如何运行一个容器?
- Docker 引擎创建容器映像
- 将容器映像传递给 containerd
- containerd 调用 containerd-shim
- containerd-shim 使用 runC 来运行容器
- containerd-shim 允许runC在启动容器后退出
docker 简单探索
docker
:Docker 客户端的可执行文件,用于与 Docker 守护进程进行交互。docker-compose
:Docker Compose 的可执行文件,用于定义和管理多个 Docker 容器的应用程序。docker-containerd
:Docker 使用的容器运行时工具,负责管理和执行容器。docker-containerd-ctr
:Docker Containerd 的命令行工具,用于与 Containerd 进行交互。docker-containerd-shim
:Docker Containerd 的 shim 进程,用于将容器的请求传递给 Containerd 容器运行时。dockerd
:Docker 守护进程的可执行文件,负责管理和运行容器。docker-init
:Docker 容器的初始化进程。docker-proxy
:Docker 网络代理,用于处理容器内部和外部网络之间的连接。