简单的来说容器运行时就是一个工具,是用来运行和管理容器进程、镜像。普遍为大家所熟悉的就是containerd和docker。
docker底层其实也是通过containerd来调用runc构建容器,只不过他的docker客户端对用户操作比较友好,所以大家偏向使用dockers,docker构建镜像的运行逻辑如下
1.docker daemon请求到containerd
2.containerd收到请求后,创建一个containerd-shim的垫片进程
3.containerd-shim垫片经常调用runc创建容器,并接管容器上报状态到containerd
docker其实也是使用containerd来完成容器的创建,构建containerd-shim的进程本质是为了达到一个解耦的效果,如果直接由containerd来做为容器的父进程,会导致如果containerd挂了那这台宿主机所有容器都挂了的现象。containerd-shim作为容器的父进程来管理容器并且收集状态。runc主要完成建容器需要做一些 Namespaces 和 Cgroups 的配置,以及挂载 root 文件系统等操作
那么k8s中创建逻辑是怎么样的呢?
由于前期docker过于火热,以至于导致k8s不得已在内部创建了dockershim垫片来配合docker
由此比较可以看出,真正容器本质都是通过containerd来构建的,如果通过docker则调用连太长,对于k8s来说只要符合CRI,Container Runtime Interface(CRI)
接口规范的容器运行时就都兼容。