Docker 和 Kubernetes:容器化时代的崛起与演变

在过去的十年间,容器化技术彻底改变了软件开发和部署的面貌。
Docker 的登场无疑是这场变革的催化剂,它将应用和服务的打包、分发、部署流程标准化,让开发者的生活变得更加简单。
紧随其后,Kubernetes 作为容器编排的领军者,它不仅极大地增强了容器的管理能力,更成为了云原生理念下不可或缺的组成部分。
本文将探讨 Docker 和 Kubernetes 的前世今生,它们之间的紧密联系,以及随着时间演进这两大技术所经历的演变。

容器化的崛起

背景和影响:

在理解 Kubernetes 弃用 Docker 之前,我们需要先回溯到容器化技术的发展历程。

  • 容器技术允许开发者打包应用及其依赖项到一个轻量级的、可移植的容器中,并在任何支持容器的系统上以一致的方式运行它们。
  • Docker 到来之前,虚拟机(如 VMware 和 VirtualBox)是主要的隔离手段,但容器化提供了更高效的资源利用率,因为它不需要为每个应用提供一个完整的操作系统。

容器化技术的鼻祖是 Linux 容器(LXC),它提供了一种轻量级的隔离方式,使得应用可以在隔离的环境中运行。
然而,LXC 的使用并不友好,直到 Docker 的出现,容器化才真正进入了主流视野。

Docker 提供了易于理解的接口,隐藏了容器管理的复杂性,使得打包、分发、运行应用程序变得前所未有的简单。
Docker 的出现,不仅推动了开发和运维(DevOps)文化的发展,而且催生了一系列基于容器的工具和服务。

 

根据 2021 年的 Sysdig 报告,93% 的容器化实例运行在 Docker 上,这显示了 Docker 在容器运行时的主导地位。

案例研究:

Netflix 是容器化技术的早期采用者,他们使用容器来支持其全球流媒体服务的快速部署和伸缩需求。
Netflix 的经验表明,容器化可以帮助企业在全球范围内快速扩展服务。

Kubernetes 的诞生

Google 有着丰富的容器管理经验,它内部的 Borg 系统可以说是 Kubernetes 的前身。
Borg 系统极大地影响了 Kubernetes 的设计,特别是在大规模集群管理、自动修复和部署方面。

2014 年,Google 发布了 Kubernetes,一个开源的容器编排平台,旨在解决在生产环境中自动部署、扩展和操作容器化应用的问题。
随着 2015 年 Kubernetes 1.0 版本的发布,它很快成为了业界领先的容器编排平台。

 

Docker 和 Kubernetes 的结合

初期的 Kubernetes 是围绕 Docker 构建的,因为当时 Docker 已经成为了业界容器格式和平台的事实标准。

早期版本的 Kubernetes 直接调用 Docker 作为其容器运行时,依赖 Docker 来创建、启动和停止容器等。
这种深度集成确保了 Kubernetes 能够利用 Docker 提供的强大能力,如镜像管理和容器生命周期管理,同时也使得在 Kubernetes 上部署基于 Docker 的应用变得简单方便。

互补关系:

  • Docker 提供了一个方便的容器格式和运行时,而 Kubernetes 提供了容器编排。两者配合,能够提供一个完整的解决方案来管理容器化应用。

转折点:

  • Kubernetes 的一个关键转折点是在 1.2 版本引入的 Deployment 对象,它简化了滚动更新和回滚策略的实施。

Kubernetes 的发展和对多运行时的支持

技术转变:

  • CRI 的引入使得 Kubernetes 能够支持多种容器运行时,这包括 Docker、containerd、CRI-O 等。

随着 Kubernetes 的不断成熟和社区的迅速壮大,它开始支持更多的容器运行时,不再仅限于 Docker。

这种变化始于 Kubernetes 1.5 版本,其中引入了多个关键特性,增强了系统的可扩展性和灵活性。
Kubernetes 开始支持如 rkt 这样的其他容器运行时,这是通过新增的容器运行时接口(Container Runtime Interface, CRI)实现的。
CRI 定义了一个标准的接口,使得 Kubernetes 可以插拔式地支持不同的容器运行时。

CRI 的引入是一个重要的转折点,因为它标志着 Kubernetes 从一个只支持 Docker 到支持多种容器运行时的过渡。
这个新的架构抽象允许 Kubernetes 不必知道底层容器是如何运行的,而只需要与符合 CRI 的运行时进行交互。
这不仅为 Kubernetes 的未来发展打开了新的可能性,也为整个容器生态系统的多样性铺平了道路。

Kubernetes 引入 CRI 后,持续吸引了更多的贡献者,体现了其不断增长的社区活力,GitHub 上 Kubernetes 相关项目的 Star 数量也在稳步上升,这表明了社区的活跃度和项目的流行度。

Kubernetes 弃用 Docker 的真相

进入 1.20 版本后,Kubernetes 宣布弃用对 Docker 的支持,这引发了广泛的关注和讨论。需要强调的是,Kubernetes 并没有弃用容器本身,而是弃用了 Docker 作为容器运行时的中间层,即 Docker shim。

这一决定背后有多方面的原因,首先是 Docker shim 在设计上存在局限性,它不直接实现 CRI,而是通过另一个适配层与 Kubernetes 通信,这增加了额外的复杂性和维护成本。此外,其他如 containerd 和 CRI-O 这样的容器运行时更为轻量级,更直接地实现了 CRI,它们被视为更适合 Kubernetes 的选择。

Kubernetes 社区对于去除 Docker shim 的反应是复杂的。一方面,这被视为 Kubernetes 向更高效、更标准化的未来迈进的必要步骤;另一方面,也引发了对 Docker 已被“抛弃”误解的担忧。然而,实际上 Docker 依旧是开发者构建和分享容器镜像的首选工具,只是在运行容器的时候,Kubernetes 选择使用其他更适合其架构的运行时。

代码示例:

如果你是 Kubernetes 集群的管理员,您可能需要切换到使用 containerd 作为容器运行时,以下是一个配置 Kubernetes 使用 containerd 的简单示例:

# 以下命令在 Kubernetes 节点上执行
# 安装 containerd
sudo apt-get update
sudo apt-get install -y containerd# 配置 Kubernetes 使用 containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml# 重启 containerd
sudo systemctl restart containerd# 告诉 kubelet 使用 containerd
sudo kubeadm init --cri-socket /run/containerd/containerd.sock

Docker 的挑战与机遇

面对 Kubernetes 的这一决定,Docker 遇到了新的挑战与机遇。

挑战在于,Docker 不再是 Kubernetes 集群中的容器运行时的唯一选择,这可能会影响其在容器运行时市场的地位。
然而,机遇也同样明显,Docker 可以集中精力优化自身的核心优势:作为容器镜像的创建和分发的平台。
通过专注于开发者体验和集成 CI/CD 工具链,Docker 有机会继续在容器化生态系统中扮演关键角色。

使用 Docker 构建和推送镜像到 Docker Hub 的示例:

# 登录 Docker Hub
docker login --username your-dockerhub-username# 构建镜像
docker build -t your-dockerhub-username/your-image-name .# 推送镜像到 Docker Hub
docker push your-dockerhub-username/your-image-name

推荐一个学习 Docker 教程专栏

  • 01、什么是 Docker
  • 02、为什么要用 Docker
  • 03、CentOS 安装Docker
  • 04、Docker如何获取镜像
  • 05、Docker 创建镜像
  • 06、Docker镜像的实现原理
  • 07、启动Docker容器
  • 08、Docker 备份、恢复、迁移数据卷
  • 09、Docker外部访问容器
  • 10、Docker快速配置指南

结论

Docker 和 Kubernetes 在容器化生态系统中各自扮演着不可或缺的角色。
Kubernetes 的选择,抛弃 Docker shim,是向着更加标准化和专业化发展的一步。
尽管这一决定引起了广泛讨论,但这反映了一个健康且成熟的开源社区应有的演变过程。
就像生物进化一样,技术领域的变革往往是为了适应环境,优化生存策略。

本文已收录于,我的技术网站 小郑说编程,有大厂完整面经,工作技术,架构师成长之路,等经验分享

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@小郑说编程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/247411.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【通讯录案例-一些细节的补充 Objective-C语言】

一、好,这个里边儿啊,我们在示例程序里边儿,我们当前做的程序,左边,这个屏幕左边,和这个tableView的Cell这一块儿, 1.左边,是有一个小的间距,是吧, 我现在想把这个间距,取消掉, 怎么着来做, 1)首先:tableView,是吧,我们这个控制器是什么,是“联系人列表”…

【网络】WireShark过滤 | WireShark实现TCP三次握手和四次挥手

目录 一、开启WireShark的大门 1.1 WireShark简介 1.2 常用的Wireshark过滤方式 二、如何抓包搜索关键字 2.1 协议过滤 2.2 IP过滤 ​编辑 2.3 过滤端口 2.4 过滤MAC地址 2.5 过滤包长度 2.6 HTTP模式过滤 三、ARP协议分析 四、WireShark之ICMP协议 五、TCP三次握…

MySQL 学习记录

基本常识 row-size-limitsblob: BLOB and TEXT columns cannot have DEFAULT values.Instances of BLOB or TEXT columns in the result of a query that is processed using a temporary table causes the server to use a table on disk rather than in memory b…

SQL注入:二次注入

SQL注入系列文章: 初识SQL注入-CSDN博客 SQL注入:联合查询的三个绕过技巧-CSDN博客 SQL注入:报错注入-CSDN博客 SQL注入:盲注-CSDN博客 目录 什么是二次注入? 二次注入演示 1、可以注册新用户 2、可以登录->…

防御保护--NAT策略

目录 NAT策略 NAT类型 server-map表 P2P --- peer to peer 网络类型 ​编辑 目标NAT--服务器映射 双向NAT ​编辑 多出口NAT NAT策略 静态NAT --- 一对一 动态NAT --- 多对多 NAPT --- 一对多的NAPT --- easy ip --- 多对多NAPT 服务器映射 源NAT--基于源IP地址进行转…

IDEA插件(MyBatis Log Free)

引言 在Java开发中,MyBatis 是一款广泛使用的持久层框架,它简化了SQL映射并提供了强大的数据访问能力。为了更好地调试和优化MyBatis应用中的SQL语句执行,一款名为 MyBatis Log Free 的 IntelliJ IDEA 插件应运而生。这款插件旨在帮助开发者…

扭蛋机小程序开发:创新体验与商业机会

一、引言 随着移动应用的普及,小程序已经成为一种新型的应用形式,以其轻便、快捷、无需安装等优点深受用户喜爱。扭蛋机作为一种常见的娱乐设备,其小程序开发将带来全新的用户体验,同时也为企业带来了商业机会。本文将探讨扭蛋机…

阿里云发送短信

0.阿里云文档地址 可以设置测试手机号 1.引入依赖 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId></dependency><dependency><groupId>com.aliyun</groupId><artifactId…

LLM大语言模型(五):用streamlit开发LLM应用

目录 背景准备工作切记streamlit开发LLM demo开一个新页面初始化session先渲染历史消息接收用户输入模拟调用LLM 参考 背景 Streamlit是一个开源Python库&#xff0c;可以轻松创建和共享用于机器学习和数据科学的漂亮的自定义web应用程序&#xff0c;用户可以在几分钟内构建一…

ES6.8.6 创建索引配置分词器、映射字段指定分词器、查询数据高亮显示分词结果(内置分词器、icu、ik、pinyin分词器)

文章目录 ES环境内置分词器&#xff0c;以simple分词器示例查询创建索引simple_news&#xff0c;修改分词器为simple插入模拟数据分词查询&#xff1a;返回通过分词查询到的结果、高亮分词分词匹配&#xff1a;写一次示例&#xff0c;其他分词和匹配思路基本一致第一步&#xf…

What is Rust? Why Rust?

why Rust&#xff1f; 目前&#xff0c;Rust 变得越来越流行。然而&#xff0c;仍然有很多人&#xff08;和公司&#xff01;&#xff09;误解了 Rust 的主张价值是什么&#xff0c;甚至误解了它是什么。在本文中&#xff0c;我们将讨论 Rust 是什么以及为什么它是一种可以增强…

laravel框架项目对接小程序实战经验回顾

一.对接小程序总结 1.状态转换带来的问题&#xff0c;如下 问题原因&#xff1a;由于status 传参赋值层级较多&#xff0c;导致后续查询是数组但是传参是字符串&#xff0c; 解决方案&#xff1a;互斥的地方赋值为空数组&#xff0c;有状态冲突的地方unset掉不需要的参数 2参…

【数字电子技术课程设计】多功能数字电子钟的设计

目录 摘要 1 设计任务要求 2 设计方案及论证 2.1 任务分析 2.1.1 晶体振荡器电路 2.1.2 分频器电路 2.1.3 时间计数器电路 2.1.4 译码驱动电路 2.1.5 校时电路 2.1.6 整点报时/闹钟电路 2.2 方案比较 2.3 系统结构设计 2.4 具体电路设计 3 电路仿真测试及结…

华为产业链之车载激光雷达

一、智能汽车 NOA 加快普及&#xff0c;L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 &#xff08;ADAS&#xff0c; Advanced driver-assistance system&#xff09;分“感知层、决策层、执行层”三个层级&#xff0c;其中感知层是最重要的一环…

初探二分法

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读题目解法一解法二 题目 题目&#xff1a;给定一个 n 个元素有序的&#xff0…

Windows 和 Anolis 通过 Docker 安装 Milvus 2.3.4

Windows 10 通过 Docker 安装 Milvus 2.3.4 一.Windows 安装 Docker二.Milvus 下载1.下载2.安装1.Windows 下安装&#xff08;指定好Docker文件目录&#xff09;2.Anolis下安装 三.数据库访问1.ATTU 客户端下载 一.Windows 安装 Docker Docker 下载 双击安装即可&#xff0c;安…

面经基础版案例(路由,请求渲染,传参,组件缓存)

文章目录 1.案例效果分析2.配置一级路由&#xff08;首页&#xff0c;详情&#xff09;3.配置二级路由4.导航高亮效果5.首页的请求渲染6.传参&#xff08;查询参数 $ 动态路由&#xff09;7.详情页渲染8.组件缓存kepp-alive9.总结 1.案例效果分析 2.配置一级路由&#xff08;首…

IDEA开发使用 thymeleaf 模板$表达式报红波浪线解决方案

系列文章目录 文章目录 系列文章目录后端存值前端取值thymeleaf 后端存值 RequestMapping("/testModelAndView")//使用ModelAndView时返回的方法类型必须是ModelAndViewpublic ModelAndView testModelAndView() {//创建ModelAndView对象ModelAndView mav new Model…

借用GitHub将typora图片文件快速上传CSDN

前情概要 众所周知&#xff0c;程序员大佬们喜欢用typora软件写代码笔记&#xff0c;写了很多笔记想要放到CSDN上给其他大佬分享&#xff0c;但是在往csdn上搬运的时候&#xff0c;图片总是上传出错&#xff0c;一张一张搞有很麻烦&#xff0c;咋如何搞&#xff1f; 废话不多…

java数据结构与算法刷题-----LeetCode769. 最多能完成排序的块

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 这道题可以理解为&#xff0c;只能保证块内有序的情况下&#xf…