Kubernetes 入门实战课
罗剑锋
Kong 高级工程师,Nginx/OpenResty 开源项目贡献者
19527 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
Kubernetes 入门实战课
15
15
1.0x
00:00/00:00
登录|注册

加餐|Kubernetes“弃用Docker”是怎么回事?

你好,我是 Chrono。
在“入门篇”学习容器技术的过程中,我看到有不少同学留言问 Kubernetes“弃用 Docker”的事情,担心现在学 Docker 是否还有价值,是否现在就应该切换到 containerd 或者是其他 runtime。
这些疑虑的确是有些道理。两年前,Kubernetes 放出消息要“弃用 Docker”的时候,确确实实在 Kubernetes 社区里掀起了一场“轩然大波”,影响甚至波及到社区之外,也导致 Kubernetes 不得不写了好几篇博客来反复解释这么做的原因。
两年过去了,虽然最新的 Kubernetes 1.24 已经达成了“弃用”的目标,但很多人对这件事似乎还是没有非常清晰的认识。所以今天,我们就来聊聊这个话题,我也讲讲我的一些看法。
图片来自网络

什么是 CRI

要了解 Kubernetes 为什么要“弃用 Docker”,还得追根溯源,回头去看 Kubernetes 的发展历史。
2014 年,Docker 正如日中天,在容器领域没有任何对手,而这时 Kubernetes 才刚刚诞生,虽然背后有 Google 和 Borg 的支持,但还是比较弱小的。所以,Kubernetes 很自然就选择了在 Docker 上运行,毕竟“背靠大树好乘凉”,同时也能趁机“养精蓄锐”逐步发展壮大自己。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kubernetes“弃用Docker”并不意味着不再支持Docker,而是放弃了dockershim这个小组件。文章介绍了Kubernetes为何做出这一举动,解释了CRI的作用,并详细介绍了containerd作为CNCF的托管项目以及其与Kubernetes集成的过程。强调了Kubernetes的这一举动并不会对Docker产生太大影响,因为它们早已将下层改为开源的containerd。文章指出,Docker仍能以其他形式与Kubernetes共存,因为容器镜像格式已被标准化,Docker镜像仍可在Kubernetes中正常使用。此外,Docker还包括了许多服务,如镜像构建、分发、测试等,便利性使其难以被替代。尽管在容器编排战争中落败,Docker仍具有强韧的生命力,拥有众多忠实用户和庞大的应用镜像。最后,文章提出了一个思考题,引发读者思考Docker重构自身、分离出containerd是否算是一种“自掘坟墓”的行为。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kubernetes 入门实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(28)

  • 最新
  • 精选
  • 星垂平野阔
    docker分离containerd是一个很聪明的举动!与其将来被人分离或者抛弃不用,不如我主动革新,把Kubernates绑在我的战车上,这样cri的第一选择仍然是docker的自己人。 一时的退让是为了更好的将来。

    作者回复: great!

    2022-07-13
    2
    30
  • xmr
    1.主要还是docker公司话语权逐渐式微,你没有话语权说你不行就不行,docker不得不换一种方式(containerd)陪在你身边。 2.容器技术本身门槛就不高,形成不了技术壁垒,没有containerd还会有containere、containerf之类的代替者。

    作者回复: great

    2022-07-13
    11
  • psoracle
    老师请教一个问题,很是疑惑。 问题是这样的,runc是一个按OCI规范运行容器的cli工具,如运行时containerd默认使用runc。 我看podman也是通过conmon调用runc运行容器,请问下podman运行容器使用的容器运行时是什么?像docker现在就是通过containerd来调用runc,所以containerd就是docker容器的运行时,从这个角度来看conmon是不是podman容器的运行时?

    作者回复: runc是OCI规范中的容器底层部分,也就是原来docker的libcontainer,它调用namespace、cgroup等系统接口创建容器。 podman不太了解。运行时这个概念比较模糊,从Kubernetes角度来看containerd就是运行时,再往下runc有是运行时。 我觉得概念上不用太纠结,把精力用在更有价值的地方。

    2022-07-14
    2
    5
  • containerd 实现了 CRI 规范,来管理镜像和运行容器,默认和 k8s 绑定,那 k8s 还可以自由替换运行时吗? 做到 可插拔

    作者回复: Kubernetes现在没有默认绑定在containerd上,cri接口通用,换哪个都可以。

    2022-07-13
    4
  • psoracle
    容器运行时只是对Linux的namespace, cgroup, rootfs进行了产品化打包的一种技术,原则上来讲,如果Docker不把运行时containerd分离标准化CRI出来,Kubernetes其实也可以造出新轮子,毕竟现在的容器运行时也有很多,像cri-o, kata, mcr等,当然不知道会不会有啥版权侵犯到moby的。

    作者回复: great

    2022-07-13
    4
  • peter
    请教老师两个问题: Q1:有人提出了这个观点:“数据库不适合用docker,不管是mysql还是ES”,这个观点对吗? Q2:关于容器ID和imageID,我的理解是:容器ID是随机,在同一台宿主机上每次创建的ID都不同,而且同一个镜像在不同机器上创建的ID也不同。但image ID是唯一的、固定的,对于同一个版本,第N次下载和第M次下载的image ID是相同的,同一个image,下载到不同的机器上,image ID也是相同的。 我的理解对吗?

    作者回复: 1.这个不能说全对也全错,我不是数据库专家,但这些产品早都有docker镜像了。 2.镜像是只读的,所以image id必然不可变。

    2022-07-13
    2
    3
  • Demon.Lee
    看完罗老师这篇,再推荐一下隔壁周老师的( https://time.geekbang.org/column/article/351014 )一篇。在两位大佬的加持下,Kubernetes 与 Docker 相爱想杀的故事,想不懂都难 😂

    作者回复: nice!

    2022-11-08归属地:北京
    2
  • 戒贪嗔痴
    为啥突然冒出个containerd让我一时不知所措,它的作用是什么,是作为守护进程存在吗?既然分离出的containerd没有兼容的接口,Google完全可以不用的,可能是不想重复造轮子吧。我就感觉怎么冒出个containerd就挺突然的。

    作者回复: containerd就是原来的docker daemon,是用来管理调度容器的,不是凭空出现。 它是Kubernetes的必备组件container-runtime,不过也可以替换成CRI-O,因为都符合cri。

    2022-07-13
    3
    2
  • lesserror
    课外小贴士中的“正式毕业”是什么意思呢?

    作者回复: 这个应该是cncf基金会的术语,大概意思表示得到了业界的普遍承认,可以用于生产环境,具体的可以再查一下。

    2022-07-13
    2
    2
  • aoe
    放心了

    作者回复: good

    2022-07-13
    2
收起评论
显示
设置
留言
28
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部