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,是向着更加标准化和专业化发展的一步。
尽管这一决定引起了广泛讨论,但这反映了一个健康且成熟的开源社区应有的演变过程。
就像生物进化一样,技术领域的变革往往是为了适应环境,优化生存策略。
本文已收录于,我的技术网站 小郑说编程,有大厂完整面经,工作技术,架构师成长之路,等经验分享
求一键三连:点赞、分享、收藏
点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@小郑说编程
相关文章:

Docker 和 Kubernetes:容器化时代的崛起与演变
在过去的十年间,容器化技术彻底改变了软件开发和部署的面貌。 Docker 的登场无疑是这场变革的催化剂,它将应用和服务的打包、分发、部署流程标准化,让开发者的生活变得更加简单。 紧随其后,Kubernetes 作为容器编排的领军者&#…...
美易官方京东养车回应索赔事件:推动行业健康发展并携手品牌商家加码补贴
近日,一则关于途虎养车起诉京东索赔500万元的新闻引起了业界的广泛关注。据华尔街见闻1月25日报道,针对此事,京东养车相关负责人作出了回应。京东养车表示,“震虎价”并非针对特定企业,其核心目的在于通过提升效率来改…...
深度学习与图像描述生成——看图说话(3)
目录 一、整体架构 二、学习策略 2.1 监督学习 2.2 无监督学习 2.3 强化学习 三、特征映射 3.1 定义 3.2 原理 3.3 关键技术 3.4 重要案例 3.5 特别注意下特征空间这一概念 四、语言模型 4.1 定义与原理 4.2 关键技术 4.3 重要性与作用 4.4 案例与应用 五、注…...
[SAP ABAP] ABAP编程中SY-SUBRC值的含义
在ABAP编程中,SY-SUBRC是一个系统变量,用于表示最近一次执行的系统命令(例如数据库操作、函数模块调用等)的结果状态码 SY-SUBRC的值用于检查命令是否执行成功,通常用于控制程序的流程 查询数据 使用SELECT语句选择查询 SY-SUBRC 0 &qu…...

测试模型分类
测试模型 1. 概述 软件测试和软件开发一样,都遵循软件工程原理,遵循管理学原理,所以理解好软件的开发模型会便于理解测试模型. 软件测试的一般流程: 我们发现一般的软件测试流程和软件开发的流程一样,但是这样的流程测试介入的较晚,对于前期重大的bug很难修复.所以测试的流程…...
mavros和PX4中的海拔高与椭球高转换
飞控高度传感器中一般有两种高度: 海拔高。也称AMSL(Above Mean Sea Level)height或者geoid height或者正高,顾名思义就是指高于当地平均海平面的高度。我猜气压计测得的高度应当就是与海平面相关的。椭球高。也称ellipsoid heig…...

洛谷刷题-【入门2】分支结构
目录 1.苹果和虫子 题目描述 输入格式 输出格式 输入输出样例 2.数的性质 题目描述 输入格式 输出格式 输入输出样例 3.闰年判断 题目描述 输入格式 输出格式 输入输出样例 4.apples 题目描述 输入格式 输出格式 输入输出样例 5.洛谷团队系统 题目描述 …...

文件包含技术总结
开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。 allow_url_fopen On(是否允许打开远程文件) allow_url_include On&…...
Docker搭建私有仓库
Docker搭建私有仓库 下载docker registry镜像 docker pull docker.io/registry2.registry镜像下载完成后,先创建一个存放镜像的目录。 mkdir -p /data/registry3.启动registry容器 docker run -itd -p 5000:5000 -v /data/registry:/var/lib/registry docker.io…...

【计算机网络】【练习题】【新加坡南洋理工大学】【Computer Control Network】
说明: 仅供学习使用。 一、题目描述 该题目描述一个网络中传播时延(Transmission Delay)的例子。题目如下: 二、问题解答(个人) 笔者第3问采用均值不等式求解。标答中采用求导数的方法求极值。似乎均值…...
【学习笔记】CF1349F2 Slime and Sequences (Hard Version)
多项式工业警告!!! 点击看题意 思路来自 这位大佬 。 为什么这么好的题解没人评论。 Part 1 前置知识:拉格朗日反演(多项式复合),分式域(引入负整数次项)。 条件&a…...

HarmonyOS 鸿蒙应用开发( 六、实现自定义弹窗CustomDialog)
自定义弹窗(CustomDialog)可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹窗。具体用法请参考自定义弹窗。 在应用的使用和开发中,弹窗是一个很常见的场景,自定义弹窗…...
# Java NIO(一)FileChannel
Java NIO 1.BIO与NIO的区别 BIO为阻塞IO,NIO为非阻塞IO。 BIONIOJAVA1.4之前Java 1.4之后面向流:以byte为单位处理数据面向块:以块为单位处理数据同步阻塞同步非阻塞无选择器(Selector) 1.1NIO的核心组成部分 Cha…...

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集
上一篇:[嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 文章目录 一、串口输出(1) 简介(2) 示例代码(3) 仿真效果 二、串口输入(1) 简介(2) 示例代码(3) 仿真效果 三、ADC采集(1) 简介(2) 采集电压(3) 示例代码(电压)(4) 仿真效果 …...

Deepin基本环境查看(四)【硬盘/分区、文件系统、硬连接/软连接】
Linux操作系统(Deepin、Ubuntu)操作系统中,硬盘分区的管理与Windows操作系统不同; 在Linux系统中维护着一个统一的文件目录体系,而硬盘和分区是以资源的形式由操作系统挂接和调度;此外Linux系统中连接(硬连…...

JS之打地鼠案例
需要素材的同学可以私信我 效果图: 上代码: <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style>* {margin: 0;padding: 0;}.box {position: relative;width: 320px;heigh…...

Kubernetes入门
k8s相关基础知识 文章目录 k8s相关基础知识1、Container2、PodPod 与 Container 的不同Pod 其它命令 3、Deployment扩容升级版本Rolling update(滚动更新)存活探针(livenessProb)就绪探针(readiness) 4、ServiceClusterIPNodePortLoadBalancer 5、Ingres…...

EtherNet/IP开发:C++搭建基础模块,EtherNet/IP源代码
这里是CIP资料的协议层级图,讲解协议构造。 ODVA(www.ODVA.org)成立于1995年,是一个全球性协会,其成员包括世界领先的自动化公司。结合其成员的支持,ODVA的使命是在工业自动化中推进开放、可互操作的信息和…...

Django(九)
1. 用户登录-Cookie和Session 什么是cookie和session? 发送HTTP请求或者HTTPS请求(无状态&短连接) http://127.0.0.1:8000/admin/list/ https://127.0.0.1:8000/admin/list/http无状态短连接:一次请求响应之后断开连接,再发请求重新连…...
解决Android Studio Unexpected tokens (use ; to separate expressions on the same line)
[TOC](Unexpected tokens (use ; to separate expressions on the same line)) 问题描述:Unexpected tokens (use ; to separate expressions on the same line) 原因:Android Studio 更新到最新的版本之后,gradle工程目录结构发生改变 问…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...