漫话docker的衰落与kubernetes的兴起
本文首发在OPPO互联网公众号,欢迎点击转载 https://mp.weixin.qq.com/s/wBC4CgAzXeTNURa1YdYmIQ。
伴随着kubernetes 1.20中对于docker的弃用,关于docker的灭亡与kubernetes的兴起的话题再度热了起来。讨论中关于docker灭亡的观点我不敢苟同。docker还远未到达灭亡的程度。相较而言,我觉得更恰当的说法应该是docker的衰落。本文我也就我个人的角度,聊聊我所经历的docker的衰落与kubernetes的兴起。
横空出世——docker的兴起
第一次接触docker,是2014年。当时OpenStack的主要负载还是kvm。而我们也尝试过了更为轻量的lxc,但是以失败而告终了。docker这个集装箱的小图标配上docker container的理念,一下子就吸引住了大家的目光。经历过制作lxc镜像的痛苦,你就会更体会到docker的可贵。繁琐的lxc镜像制作与精简的Dockerfile相比,孰高孰低、孰优孰劣可谓是一目了然。
docker成功的将cgroup、union filesystem、namespace这些较为稳定和成熟的技术结合了起来,辅以docker image的制作工艺,实现了集装箱式的标准交付。这时候的docker,颇有种“举天下之豪杰而莫能与之争”的气势。虽然在生产环节还是或多或少,还有这样那样的问题,但是docker已经跨过了POC(Proof of concept)阶段,进入了pre-product的行列了。在对docker深度定制后,最终我们团队也将OpenStack + docker的组合成功推向了生产。

那两年,知不知道docker、会不会做镜像、懂不懂docker原理成为基础架构领域面试的常见话题。虽然只有少数几个公司敢为天下先,将docker搬上了生产,但是已经没有人可以忽略这颗冉冉升起的新星了。那两年,活跃在各个会议、论坛上的都是docker的话题。大家热衷于讨论生产上docker遇到的坑。大家各出奇招,修修补补,跌跌撞撞,docker总算也是被搬上了生产。而在这时,即使是技术保守、持徘徊观望态度的公司,也都会安排一些人力着手跟进docker的发展与各个公司的实践经验了,这时候的docker真的是风头无两。
生来巨人——kubernetes
时间到了2015年,此时我转而负责进行CaaS(Container as a Service)服务的调研。这时候大家都在说CaaS,但是每个人说的都不一样,其实大家都是摸着石头过河。在此期间,以研究OpenStack的magnum为契机,我接触到了swarm和kubernetes。

swarm是docker公司力推的集群管理方案。docker、swarm和compose组成的三剑客完整覆盖了运行时、集群管理与编排,构成了一个看起来牢不可摧的生态系统。特别是别出心裁的将swarm的api与docker的api进行了拉齐,将集群的管理复杂度与单节点的管理复杂度向用户进行屏蔽,倒是有一种如臂使指的快感。这个设计直到现在我都还觉得立意真的很精巧。

而初出茅庐的kubernetes也来势汹汹。背靠Google的大旗,有Borg的背书,kubernetes在气势上一点不输swarm + compose的组合。伴随着kubernetes 1.0的发布,kubernetes也从幕后走向了台前,开始大规模接受来自全世界的PR提交,在功能、性能和稳定性上快速提升。
到kubernetes 1.2版本,经过我们内部评估,已经具备生产级的品质。而声明式API、简洁的架构、灵活的标签等优秀的设计,在做选型时已经让我们完全没有理由拒绝。而后经过数月紧张的开发,kubernetes + docker的组合被搬上了舞台,并且以极快的速度侵蚀OpenStack + docker的份额。此时的docker已经开始被限制为了容器的运行时和镜像制作工具。捆住了docker的手脚,kubernetes已经没有了可以掰手腕的对手,一统江湖的路上kubernetes再无障碍。
美人迟暮——docker的衰落
时至今日,docker的衰落已经成为了不争的事实。而docker的衰落我觉得是多方面的原因。一部分是docker自身的封闭和固执己见。我曾经记得在当时参与了当时社区多个PR的讨论。新增一个feature的超长的周期,已经可以磨掉多数人的耐心。docker社区在多个观点上略显保守的方式,让大家逐渐失去了参与的热情。
另一方面,也是更为重要的一点,是容器技术本身的门槛已经被突破,已经无法形成技术上的护城河。而对于容器技术之争,已经转化为标准之争。而对于标准上更有发言权的一方,无疑是具有更多用户、更庞大社区和更强大的平台的一方。在短短两三年的时间内,天平就快速地向kubernetes倾斜,其主导的CRI、CNI、CSI标准已经成为了事实上的通行标准。而相较之下,docker力推的CNM等标准则显得曲高和寡。

与此同时,kubernetes并没有放弃主动的进攻。kubernetes的强势和扶植其他容器运行时加速了docker的衰落。在1.6版本弃用docker manager直连docker,转向CRI + dockershim的组合时,就注定了kubernetes会走到完全解耦docker,也就是今天这一步。与此同时,其他容器运行时也开始了瓜分市场份额。如果说gVisor、Kata只是尝试挑战docker在部分场景中的地位,那么红帽的Podman则已经吹响了全面进攻的号角。再结合前两年docker的一些融资和收购传闻,平添了一种英雄末路、美人迟暮的伤感。
世间多少英雄戏,每到收场总伤神
六年回望,其实无论是在当时还是现在来看,docker都是一个革命性的产品。docker的衰落并不是意味着容器运行时不重要了,而是大家越来越习以为常了。时至今日,容器运行时作为一个大部已经被解决的问题,一个相对成熟的模块,已经成为了整个基础架构体系的一部分。而作为上层的平台和更为上层的用户来说,对此将会给予越来越少的关注。这就像现在大多数用户并不会去关心内核了一样。甚至在未来,我预测运行时都有可能会成为一个内核级别的附属模块,会预装到许多的发行版上,其运行也逐渐对大多数用户变得更加透明(实际红帽已经开始向这个方向做了)。而越来越多的用户则会将更多的注意力集中在上层的交付、管理、编排上。至于kubernetes会不会衰落,我觉得在中短期内(五年内)不会。kubernetes已经成为了一个平台级的项目。在这点上,kubernetes作为平台将比工具性质的docker具有更强的生命力。
漫话docker的衰落与kubernetes的兴起的更多相关文章
- 视频课程 | Kubernetes的兴起
视频课程 | Kubernetes的兴起 原创: 京小云 京东云开发者社区 4月3日 京东云开发者社区在3月底于北京举行了以"Cloud Native时代的应用之路与开源创新"为 ...
- 搭建基于Docker社区版的Kubernetes本地集群
Kubernetes的本地集群搭建是一件颇费苦心的活,网上有各种参考资源,由于版本和容器的不断发展,搭建的方式也是各不相同,这里基于Docker CE的18.09.0版本,在Mac OS.Win10下 ...
- kubernetes 实战6_命令_Share Process Namespace between Containers in a Pod&Translate a Docker Compose File to Kubernetes Resources
Share Process Namespace between Containers in a Pod how to configure process namespace sharing for a ...
- Docker CMD ENTRYPOING 和Kubernetes command args对比
Docker CMD ENTRYPOING 和Kubernetes command args对比 exec 模式 使用 exec 模式时,容器中的任务进程就是容器内的 1 号进程 shell 模式 使 ...
- 30分钟学会Docker里面开启k8s(Kubernetes)登录仪表盘(图文讲解)
前言 我们之前搭建了第一个docker项目: windows环境30分钟从0开始快速搭建第一个docker项目(带数据库交互):https://www.cnblogs.com/xiongze520/p ...
- openstack,docker,mesos,Kubernetes(k8s)
作者:张乾链接:https://www.zhihu.com/question/62985699/answer/204233732来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 基于docker和cri-dockerd部署kubernetes v1.25.3
基于docker和cri-dockerd部署kubernetes v1.25.3 1.环境准备 1-1.主机清单 主机名 IP地址 系统版本 k8s-master01 k8s-master01.wan ...
- Docker系列(九):Kubernetes架构深度解析
Kubernetes重要概念 Docker解决了打包和隔离的问题,但我们需要更多:调度的问题,生命周期及健康状况,服务发现,监控,认证,容器聚合. Kubernetes概述 开源DOcker容器编排系 ...
- Docker系列(八):Kubernetes横空出世背后的秘密
Docker与CoreOS的恩怨情仇 2013年2月,Docker建立了一个网站发布它的首个演示版本, 3月,美国加州Alex Polvi正在自己的车库开始 他的 第二次创业 有了第一桶金的Alex这 ...
随机推荐
- IP/TCP/UDP checsum
今天调试bug时, 忘了将原始的check_sum值reset,导致发包-抓包后发现.check-sum 错误. 来看一看check-sum:简单讲就是对要计算的数据,以16bit为单元进行累加,然后 ...
- mysql之分区表
1.分区表概述: 1.分区表的主要意义在于,对于表结构进行划分,不同的数据进入不同的分区中,以便于在查询过程中,只查找指定分区的数据,减少数据库扫描的数据量. 2.虽然从逻辑上看分区表是一张表,但是底 ...
- 01、MyBatis HelloWorld
1. MyBatis简介 1)MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架 2)MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 3)MyB ...
- 我要进大厂之大数据Hadoop HDFS知识点(2)
01 我们一起学大数据 老刘继续分享出Hadoop中的HDFS模块的一些高级知识点,也算是对今天复习的HDFS内容进行一次总结,希望能够给想学大数据的同学一点帮助,也希望能够得到大佬们的批评和指点! ...
- 深度分析:Java 静态方法/变量,非静态方法/变量的区别,今天一并帮你解决!
静态/非静态 方法/变量的写法 大家应该都明白静态方法/字段比普通方法/字段的写法要多一个static关键字,简单写下他们的写法吧,了解的可以直接略过 class Test{ // 静态变量 publ ...
- 【PUPPETEER】初探之获取元素文本值(三)
一.知识点 page.$eval(selector, pageFunction[, ...args]) page.$$eval(selector, pageFunction[, ...args]) i ...
- Python爬虫实现翻译功能
前言 学了这么久的python理论知识,需要开始实战来练手巩固了. 准备 首先安装爬虫urllib库 pip install urllib 获取有道翻译的链接url 需要发送的参数在form data ...
- Mockito 结合 Springboot 进行应用测试
Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试:生成测试数据初始化数据库用于测试:Spring Boot可以跟BDD(Behavier Driven ...
- JQuery案例:折叠菜单
折叠菜单(jquery) <html> <head> <meta charset="UTF-8"> <title>accordion ...
- 超稳攻略!Rancher 2.3手动轮换证书,保护集群安全!
本文转自Rancher Labs 前 言 Rancher 2.3正式发布已经一年,第一批使用Rancher 2.3的用户可能会遇到Rancher Server证书过期,但是没有自动轮换的情况.这会导致 ...