0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Docker、Containerd和Kubernetes之间的关系

阿铭linux 来源:阿铭linux 2023-04-08 10:44 次阅读

1)Kubernetes与Docker

Docker是最早出现的那批容器引擎工具,所以它最早占领了市场。Kubernetes主要用来做容器编排,用来管理容器集群,是一个平台。

Kubernetes要想去控制容器,就得借助容器引擎,在早期的Kubernetes版本里,除了选择Docker作为容器引擎外,没更好的选择。所以早期的Kubernetes和Docker深深地绑定了在一起。由于Docker可以在没有Kubernetes的情况下使用,而Kubernetes必须要有容器运行时(Docker引擎)才能进行编排。

这对于Kubernetes来说,绝对是一个非常大的隐患,这相当于是将自己命根子交给了别人,如果哪天Docker翻脸了,Kubernetes必然损失巨大。

好在,Kubernetes发展比Docker更加迅猛,势头远远盖过了Docker,Kubernetes终于有资格自己决定做一些事情了。

2)CRI

为了解决隐患,Kubernetes在1.5版本里,引入了一个新的接口标准:CRI(Container Runtime Interface),它主要用来规定如何调用容器运行时来管理容器和镜像,但这个接口标准和之前的Docker调用标准有不少差异,所以两者完全不兼容。这意味着,Kubernetes可以撇开Docker,使用其它容器运行时(如rkt)。

由于Docker用户非常庞大,Kubernetes也意识到了直接不兼容Docker会有许多不确定风险,当时,Kubernetes用了一个临时方案,在Kubernetes和Docker中间开发了一个Dockershim,主要用来将Docker的接口标准转换成CRI标准。

3)Containerd

Docker意识到Kubernetes的改变,为了迎合Kubernetes,将Docker Engine拆分成多个模块,其中Docker Daemon部分也就是说Containerd捐献给了CNCF。

所以,Containerd实际上是Docker引擎拆出来的一个模块。

Containerd 作为 CNCF 的托管项目,自然是要符合 CRI 标准的。但当时的Docker 出于自己诸多原因的考虑,它只是在 Docker Engine 里调用了 containerd,外部的接口仍然保持不变,也就是说还不与 CRI 兼容。

在当时的Kubernetes版本里,有两种方法调用容器:

第一种是用 CRI 调用 dockershim,然后 dockershim 调用 Docker,Docker 再走 containerd 去操作容器。

第二种是用 CRI 直接调用 containerd 去操作容器。

6de4b732-d5a9-11ed-bfe3-dac502259ad0.png

很明显,第一种方法多了两层调用,性能明显不如第二种方法。所以Kubernetes决定将dockershim移除,所以也就不能直接使用Docker了,在外界看来就像是Kubernetes弃用了Docker。

4)弃用dockershim

2020年Kubernetes发布1.20版本时,对外声明将在后续版本里(实际上是在22年的1.24版本里)移除dockershim,也就是取消对Docker的支持。当时,众多吃瓜群众理解错了意思,认为成了Kubernetes弃用Docker。它实际上只是“弃用了 dockershim”这个小组件,也就是说把 dockershim 移出了 kubelet,并不是“弃用了 Docker”这个软件产品

这个举措对Kubernetes和 Docker 来说都不会有什么太大的影响,因为他们两个都早已经把下层都改成了开源的 containerd,原来的 Docker 镜像和容器仍然会正常运行,唯一的变化就是 Kubernetes绕过了 Docker,直接调用 Docker 内部的 containerd 而已。

5)Kubernetes移除dockershim后对Docker的影响

虽然现在 Kubernetes 不再默认绑定 Docker,但 Docker 还是能够以其他的形式与 Kubernetes 共存的。

首先,因为容器镜像格式已经被标准化了(OCI 规范,Open Container Initiative),Docker 镜像仍然可以在 Kubernetes 里正常使用,原来的开发测试、CI/CD 流程都不需要改动,我们仍然可以拉取 Docker Hub 上的镜像,或者编写 Dockerfile 来打包应用。

其次,Docker 是一个完整的软件产品线,不止是 containerd,它还包括了镜像构建、分发、测试等许多服务,甚至在 Docker Desktop 里还内置了 Kubernetes。单就容器开发的便利性来讲,Docker 还是暂时难以被替代的,广大云原生开发者可以在这个熟悉的环境里继续工作,利用 Docker 来开发运行在 Kubernetes 里的应用。

再次,虽然 Kubernetes 已经不再包含 dockershim,但 Docker 公司却把这部分代码接管了过来,另建了一个叫 cri-dockerd的项目,作用也是一样的,把 Docker Engine 适配成 CRI 接口,这样 kubelet 就又可以通过它来操作 Docker 了,就仿佛是一切从未发生过。

综合来看,Docker 虽然在容器编排战争里落败,被 Kubernetes 排挤到了角落,但它仍然具有强韧的生命力,多年来积累的众多忠实用户和数量庞大的应用镜像是它的最大资本和后盾,足以支持它在另一条不与 Kubernetes 正面交锋的道路上走下去。而对于我们这些初学者来说,Docker 方便易用,具有完善的工具链和友好的交互界面,市面上很难找到能够与它媲美的软件了,应该说是入门学习容器技术和云原生的“不二之选”。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 容器
    +关注

    关注

    0

    文章

    481

    浏览量

    21883
  • 镜像
    +关注

    关注

    0

    文章

    153

    浏览量

    10589
  • Docker
    +关注

    关注

    0

    文章

    437

    浏览量

    11603
  • kubernetes
    +关注

    关注

    0

    文章

    219

    浏览量

    8568

原文标题:Docker、Containerd和Kubernetes之间的关系

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Containerd常见命令操作

    作为接替 Docker 运行时的 Containerd 在早在 Kubernetes1.7 时就能直接与 Kubelet 集成使用,只是大部分时候我们因熟悉 Docker,在部署集群时
    的头像 发表于 08-30 10:08 4097次阅读

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

    查看原文:http://click.aliyun.com/m/42852/背景众所周知,Docker很火,DockerKubernetes(简称k8s)最火。相对物理机、VM,Docker
    发表于 02-28 12:49

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

    查看原文:http://click.aliyun.com/m/42852/背景众所周知,Docker很火,DockerKubernetes(简称k8s)最火。相对物理机、VM,Docker
    发表于 02-28 12:50

    Kubernetes之路 2 - 利用LXCFS提升容器资源可见性

    摘要: 这是本系列的第2篇内容,将介绍在DockerKubernetes环境中解决遗留应用无法识别容器资源限制的问题。本系列文章记录了企业客户在应用Kubernetes时的一些常见问题第一篇
    发表于 04-17 14:05

    RK3399 docker无法加载IMAGE ID是为什么?

    root@ubuntu:~# docker versionClient: Docker Engine - Community Version:20.10.7 API version: 1.41 Go
    发表于 12-30 07:05

    如何在Arm上利用Istio搭建一个基于Kubernetes的Service Mesh平台

    应用拆分成多个微服务,实现各个微服务之间的松耦合,高内聚,如何实现各个微服务的通信,同步等。Service Mesh技术很好的解决了这些问题,Service Mesh通过代理技术,使各个模块之间解耦合
    发表于 03-30 10:59

    为什么有了Docker还要Kubernetes

    “一千个读者眼里有一千个哈姆雷特”。同样的话也适用于 Kubernetes,同样的系统在不同的开发人员眼中也是不同的,甚至在不同阶段对于它的理解也截然不同。
    的头像 发表于 02-12 12:16 2319次阅读
    为什么有了<b class='flag-5'>Docker</b>还要<b class='flag-5'>Kubernetes</b>

    软件容器平台Docker受实体清单限制使用 Docker开源项目应不受影响

    有网友指出此次 Docker 更新的服务协议只是针对 Docker Inc. 相关网站上提供的服务,而大家常提的 Docker(包含 engine、runc 和 containerd
    的头像 发表于 08-19 09:52 2509次阅读

    简单说明k8s和Docker之间关系

    这篇文章主要介绍了k8s和Docker关系简单说明,本文利用图文讲解的很透彻,有需要的同学可以研究下 最近项目用到kubernetes(以下简称k8s,k和s之间有8个字母)。虽然之前
    的头像 发表于 06-24 15:48 3106次阅读

    Kubernetes是什么,一文了解Kubernetes

    不香了。 这时候就需要我们的主角 Kubernetes 上场了,先来了解一下 Kubernetes 的基本概念,后面再介绍实践,由浅入深步步为营。 关于 Kubernetes 的基本概念我们将会围绕如下七点展开: 一、
    发表于 12-21 13:40 1579次阅读
    <b class='flag-5'>Kubernetes</b>是什么,一文了解<b class='flag-5'>Kubernetes</b>

    docker-book DockerKubernetes开源书

    gitee-docker-book.zip
    发表于 04-19 14:22 0次下载
    <b class='flag-5'>docker</b>-book <b class='flag-5'>Docker</b>与<b class='flag-5'>Kubernetes</b>开源书

    Containerd控制runC的守护进程

    ./oschina_soft/containerd.zip
    发表于 05-11 10:05 0次下载
    <b class='flag-5'>Containerd</b>控制runC的守护进程

    什么是Kubernetes容器运行时CRI

    起初,Docker是事实上的容器技术标准,Kubernetes v1.5之前的代码中直接调用Docker API,实现容器运行时的相关操作。
    的头像 发表于 02-20 16:22 1042次阅读
    什么是<b class='flag-5'>Kubernetes</b>容器运行时CRI

    Containerd基础用法

    Docker 1.11 版本开始,Docker 容器运行就不是简单通过 Docker Daemon 来启动了,而是通过集成containerd、runc等多个组件来完成的。 虽然
    的头像 发表于 04-11 10:50 560次阅读

    docker容器与容器之间通信

    Docker是一种轻量级容器化技术,能够将应用程序及其依赖项封装在一个独立、可移植的容器中。而容器化的应用程序通常是以分布式方式设计的,因此实现容器与容器之间的通信至关重要。 本文将详细介绍
    的头像 发表于 11-23 09:36 548次阅读