结构

图片

简介

最开始容器项目有很多公司在做像 Google 和其他厂商,但是就 docker 的容器项目最终成活下来, docker 自从统一了容器领域,但是由于过垄断, docker 迫于压力由Google , CoreOS , Redhat成立一个中立基金,,docker当年的被拆分出了几个标准化的模块 docker-client ,dockerd,containerd,docker-shim,runc 等,自己的容器运行时LibContainer捐出,改名为RunC. 并制定了一套镜像和容器的标准和规范( OCI ).由于 OCI 的成立.让其他公司可以不依赖与 docker 来实现自己的docker 运行时。

  • docker-cli: docker的前端,提供docker 命令,如docker run 、docker build等
  • dockerd(docker daemon):docker的服务端,其实就是docker-client的后台
  • containerd:容器服务,这也是docker的核心组件,负责容器的增删改等操作,这里containerd之所以作为一个单独的服务,而没有和dockerd集成到一块,是为了让其他的项目可以定义自己的客户端,比如kubernetes通过CRI客户端来访问containerd
  • runc:是一个命令行工具端,他根据oci(开放容器组织)的标准来创建和运行容器,containerd会调用runc命令来运行镜像。

    container

    我们核心的是 container, 最新k8s 绕过dockerd 直接调用 container 减少了一层, container 主要负责的是拉取和解压镜像, 上传和制作镜像是由 dockerd来负责的. 所以docker 的 container 与 k8s 的 container 是同一个.所以理论上,只要满足 OCI 的规范.无论是什么工具编译的镜像都能被 container 拉取、编译与运行。containerd是一个工业级别标准的容器运行时,它强调简单性、健壮性和可移植性,几乎囊括了单机运行一个容器运行时所需要的一切:执行、分发、监控、网络、构建、日志等。主要作用是:
    1)、管理容器的生命周期(从创建容器到销毁容器)
    2)、拉取/推送容器镜像
    3)、存储管理(管理镜像及容器数据的存储)
    4)、调用runC运行容器(与runC等容器运行时交互)
    5)、管理容器网络接口及网络dockerd实际真实调用的还是containerd的api接口,containerd是dockerd和runC之间的一个中间交流组件。 docker 镜像和 containerd 镜像通用。但组织方式和存放目录不同,导致docker与ctr命令不通用,各自管理自己的镜像和容器。此外k8s还有客户端命令crictl,用法与docker基本相同,可crictl -h查看用法。

参考资料


汝何不上九霄
4.7k 声望1.6k 粉丝