# containerd教程 - 1 containerd简介
学习本课程,最好先学习 Docker基础教程 (opens new window)
我™刚学完 Docker,现在告诉我 Kubernetes 自 1.24 版本后不支持 Docker 了,默认的容器运行时变成 containerd 了。
What the f**k。
我先简单说一下来龙去脉。
K8s 刚出来的时候, Docker 是大腿,而且当时也没有其他的容器runtime(运行时),所以 K8s 就内置了代码来适配 Docker。后来又出现了其他的容器runtime,那么 K8s 也内置了代码来适配其他的容器runtime,但是后面其他的容器runtime工具越来越多,K8s 发现这样不行啊,总不能来一个内置一个吧,所以就开发了一个 CRI (Container Runtime Interface)的容器运行时接口的通信标准,对这些容器管理工具说”你们实现这个标准就可以和我通信了,如果你们不符合CRI标准,弄一个转接口也行,转接口叫shim吧“。后来很多容器runtime就实现了CRI标准,就可以直接和 K8s 通信,但是 Docker 我牛逼啊,我凭什么开发CRI接口将就你 K8s 啊,CRI接口我不开发,符合CRI接口的 shim 我也懒得弄。没办法,K8s 还不够牛逼啊,只能内置了连接 Docker 的代码叫做 dockershim
。后来 K8s 牛逼了,我又不是非你 Docker 不行,所以1.24版本就把 dockershim
移除了,Docker 不能再作为 K8s 的容器runtime了。如果要非想让 Docker 作为 K8s 的runtime的话,那么就必须要找一个符合CRI标准的转接口了,这个就是 cri-docker
,它是一个符合 CRI 标准的 shim(转接口),它可以作为一个转接口连接 K8s 和 Docker。但这种架构的缺点是调用链更长,效率低。
所以 K8s 1.24 版本开始不再支持 Docker 了,而是使用 containerd 作为容器运行时。containerd 是一个符合 CRI 标准的容器运行时,它提供了与 Docker 类似的容器生命周期管理功能,但更加轻量级和可插拔。因此,对于使用 Kubernetes 的用户来说,如果之前使用的是Docker作为容器引擎,那么在升级到 1.24 版本后,需要将 Docker 节点迁移至 containerd 节点。
那我 Docker 是不是白学了?
倒也不是。
因为 Docker 实现的功能由下面几个部分组成的:
- docker-client:Docker客户端, 用户与Docker交互的命令行工具或API,用于创建、管理和操作Docker容器。
- dockerd:Docker守护进程, 运行在主机上的守护进程,负责接收Docker客户端的请求,并管理本地或远程的Docker容器和镜像。
- containerd:是一个核心的容器运行时,负责实际的容器生命周期管理,包括容器的创建、运行、暂停、停止和删除等操作。Docker的高层操作通常通过 containerd 完成。
- dockershim:在一些旧版本的Docker中存在,用于兼容容器运行时的接口,使其与containerd进行交互。
- runc:是一个轻量级的工具,用于创建和运行容器,它实现了 OCI(Open Container Initiative)规范。Docker使用 runc 来实际运行容器内的进程。
所以 containerd 是Docker的基础组件之一,Docker 对容器的管理和操作基本都是通过 containerd 完成的。但是Docker作为一个完整的容器平台,包含了许多 K8s 并不需要的功能,导致资源浪费。另一方面,K8s本身提供了容器编排和调度的功能,与Docker重叠,造成了一定程度上的冲突。
containerd 也是由 Docker团队开发的,一开始是集成在 Docker 引擎中的,后来从 Docker 引擎中剥离出来,作为独立的开源项目发展。它专注于提供轻量级、高性能的容器运行环境。作为一个纯粹的容器运行时,containerd 被设计为更加符合 K8s 的架构和需求。它具有更小的资源占用,性能更好。所以 K8s 使用 containerd 作为默认容器运行时也就顺理成章了。
containerd 并不是直接面向最终用户来使用的,更多的是作为容器运行时,承载容器的运行,从而集成到更上层的系统里,例如 Docker、 K8s,由上层应用来使用 containerd 完成容器的编排,对于上层应用来说,是需要使用 containerd + runc。containerd 以守护进程的方式运行,通过暴漏底层的 gRPC API,由上层应用来调用,完成容器的管理。
学了 Docker 以后再学习 containerd ,很多命令都是相似的,学起来也得心应手。
话不多说,开始吧。