一文了解docker与k8s
随着 k8s 作为容器编排解决方案变得越来越流行,有些人开始拿 Docker 和 k8s 进行对比,不禁问道:Docker 不香吗?
k8s 是 kubernetes 的缩写,'8' 代表中间的八个字符。
其实 Docker 和 k8s 并非直接的竞争对手两者相互依存。 Docker 是一个容器化平台,而 k8s 是 Docker 等容器平台的协调器。
1、容器化时代
(1)虚拟化技术已经走过是三个时代,没有容器化技术的研究就不会有Docker技术的诞生。
1)物理机时代: 多个应用程序排在一台机器上。
2)虚拟机时代:一台物理机器安装多个虚拟机(VM),一个虚拟机跑多个程序。
3)容器化时代:一台物理机器安装多个容器实例(Container),一个容器跑多个程序。
(2)容器化解决了什么问题?
用一段话描述:
测试人员:你这个功能有问题。
开发人员:我本地是好的呀!
开发人员编写代码,在自己本地环境测试完成后,将代码部署到测试或生产环境中经常会遇到各种各样的问题。明明本地完美运行的代码为什么部署后出现很多 bug,原因有很多:不同的操作系统、不同的依赖库等。总结一句话:因为本地环境和远程环境不一致。
容器化技术正好解决了这一关键问题,它将软件程序和运行的基础环境分开。开发人员编码完成后将程序打包到一个容器镜像中,镜像中详细列出了所依赖的环境,在不同的容器中运行标准化的镜像,从根本上解决了环境不一致的问题。
注:容器的概念已经出现不短的时间。但直到 2013 年开源项目 Docker 的出现才极大推广了容器这项技术,并推动了软件开发中容器化和微服务的趋势,这种趋势后来被称为云原生开发。
2、容器化技术解决的核心问题
可移植性:不依赖具体的操作系统或云平台,比如在阿里云或腾讯云直接随意迁移。
占地小:容器只需要其应用程序以及它需要运行的所有容器和库的依赖清单,不需要将所有的依赖库都打包在一起。
共享 bin 和 lib:不同的容器可以共享 bin 和 lib,进一步节省了空间。
3、docker的出现
2010 年一位年轻小伙子在美国旧金山成立了一家名叫【dotCloud】的公司, 开发了 Docker 的核心技术,从此开启了容器技术的时代。后面 dotCloud 公司将自己的容器技术进行了简化和标准化,取名为 Docker,就是大家熟悉的鲸鱼 logo。
2013 年 dotCloud 公司宣布将 Docker 开源,随着越来越多的工程师发现了它的优点, Docker 的人气迅速攀升,成为当时最火爆的开源技术之一。
当前有 30% 以上的企业在其 AWS 环境中使用 Docker,并且这个数字还在继续增长。
此时的 Docker,已经成为行业里人气最火爆的开源技术,没有之一。甚至像 Google、微软、Amazon、VMware 这样的巨头,都对它青睐有加,表示将全力支持。
Docker 火了之后,dotCloud 公司干脆把公司名字也改成了 Docker Inc. 。
Docker 和容器技术为什么会这么火爆?说白了,就是因为它 “轻”。在容器技术之前,业界的网红是虚拟机。虚拟机技术的代表,是 VMWare 和 OpenStack 。
相信很多人都用过虚拟机。虚拟机,就是在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来。
在 “子电脑” 里,你可以和正常电脑一样运行程序,例如登录 QQ。如果你愿意,你可以变出好几个 “子电脑”,里面都登录上 QQ。“子电脑” 和 “子电脑” 之间,是相互隔离的,互不影响。
虚拟机属于虚拟化技术。而 Docker 这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化。
虚拟机虽然可以隔离出很多 “子电脑”,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如:VMWare)。
而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似 “沙箱”)。Docker 可以轻松创建容器和基于容器的应用程序,最初是为 Linux 构建的,现在也可以在 Windows 和 MacOS 上运行。
它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个 Docker 容器)。此外,它占的空间很小,虚拟机一般要几 GB 到几十 GB 的空间,而容器只需要 MB 级甚至 KB 级。
正因为如此,容器技术受到了热烈的欢迎和追捧,发展迅速。大家需要注意,Docker 本身并不是容器,它是创建容器的工具,是应用容器引擎。想要搞懂 Docker,其实看它的两句口号就行。
第一句,是 “Build, Ship and Run”。
第二句口号则是:“Build once,Run anywhere(搭建一次,到处能用)”。
- Build(构建镜像): 镜像就像是集装箱,包含文件以及运行环境等等资源;
- Ship(运输镜像):在宿主机和仓库间进行运输,这里仓库就像是超级码头;
- Run(运行镜像):运行的镜像就是一个容器,容器就是运行程序的地方。
说白了,这个 Docker 镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如:环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
综上所述,Docker 的运行过程,也就是去仓库把镜像拉到本地,然后用执行命令把镜像运行起来变成容器,这也就是为什么人们常常将 Docker 称为码头工人或码头装卸工。
负责对 Docker 镜像进行管理的,是 Docker Registry 服务(类似仓库管理员)。当然,不是任何人建的任何镜像都是合法的。万一有人构建的镜像存在问题呢?所以,Docker Registry 服务对镜像的管理是非常严格的。最常使用的 Registry 公开服务,是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。
4、Docker如何使用
其实大多数人谈论 Docker 时说的是 Docker Engine,这只是一个构建和运行的容器。
在运行容器前需要编写 Docker File,通过 dockerFile 生成镜像,然后才能运行 Docker 容器。
Docker File 定义了运行镜像(image)所需的所有内容,包括操作系统和软件安装位置。一般情况下都不需要从头开始编写 Docker File,在 Docker Hub 中有来自世界各地的工程师编写好的镜像,你可以基于此修改。
📚此外,Docker 容器提供了一种构建企业应用程序和业务流程应用程序的方法,这些应用程序比传统应用程序更容易安装、维护和移动。
⭐Docker 容器支持隔离:Docker 容器使应用程序不仅彼此隔离,而且与底层系统隔离。这不仅使软件栈更干净,而且更容易使容器化应用程序使用系统资源,例如 CPU、GPU、内存、I/O、网络等,它还可以确保数据和代码保持独立。
⭐Docker 容器支持可移植性:Docker 容器在支持容器运行环境的任何机器上运行。应用程序不必绑定到主机操作系统,因此可以保持应用程序环境和底层操作环境的整洁和最小化。
例如,采用容器的 MySQL 将在大多数支持容器的 Linux 系统上运行,应用程序的所有依赖项通常都在同一个容器中提供。基于容器的应用程序可以轻易从 on-prem 系统迁移到云环境中,或从开发人员的笔记本电脑移到服务器上,只要目标系统支持 Docker 以及可能与之一起使用的任何第三方工具,比如 Kubernetes。
⭐通常,Docker 容器镜像必须为特定的平台构建。例如 Windows 容器不能在 Linux 上运行,反之亦然;以前,绕过此限制的一种方法是启动运行所需操作系统实例的虚拟机,并在虚拟机中运行容器。
然而 Docker 团队后来设计了一个更优雅的解决方案,称为 manifest,它允许多个操作系统的镜像并行打包。尽管 manifest 还处于试验阶段,但这暗示了容器可能成为跨平台应用程序解决方案和跨环境应用程序解决方案。
⭐Docker 容器支持可组合性:大多数业务应用程序由几个独立的组件组成,web 服务器、数据库和 cache 缓存。Docker 容器可以将这些部件组合成一个容易更换的功能单元。每个部分由不同的容器提供,可以独立于其他容器进行维护、更新、交换和修改。
🔥 这本质上是应用程序设计的微服务模型。通过将应用程序功能划分为独立的、自包含的服务,微服务模型为过程缓慢的传统开发和单一僵化的应用程序提供了一种解决方案,轻量级和便携式容器使构建和维护基于微服务的应用程序变得更加容易。
5、编排系统的需求催生了k8s
尽管 Docker 为容器化的应用程序提供了开放标准,但随着容器越来越多出现了一系列新问题:
- 如何协调、调度和管理这些容器?
- 如何在升级应用程序时不中断服务?
- 如何监视应用程序的运行状况?
- 如何批量重新启动容器里的程序?
解决这些问题需要容器编排技术,可以将众多机器抽象,对外呈现出一台超大机器。现在业界比较流行的有:k8s、Mesos、Docker Swarm。
在业务发展初期只有几个微服务,这时用 Docker 就足够了,但随着业务规模逐渐扩大,容器越来越多,运维人员的工作越来越复杂,这个时候就需要编排系统解救 opers。
一个成熟的容器编排系统需要具备以下能力:
- 处理大量的容器和用户
- 负载均衡
- 鉴权和安全性
- 管理服务通信
- 多平台部署
其中,K8S,就是基于容器的集群管理平台,它的全称,是 kubernetes。
和 Docker 不同,K8S 的创造者,是众人皆知的行业巨头——Google。
然而,K8S 并不是一件全新的发明。它的前身,是 Google 自己捣鼓了十多年的 Borg 系统。K8S 是 Google 研发的容器协调器,已捐赠给 CNCF,现已开源。
Google 利用在容器管理多年的经验和专业知识推出了 k8s,主要用于自动化部署应用程序容器,可以支持众多容器化工具包括现在非常流行的 Docker。
目前 k8s 是容器编排市场的领导者,开源并公布了一系列标准化方法,主流的公有云平台都宣布支持。
一流的厂商都在抢占标准的制高点,一堆小厂商跟着一起玩,这就叫生态了。
6、k8s架构和组件
k8s 由众多组件组成,组件间通过 API 互相通信,归纳起来主要分为三个部分:
- controller manager
- nodes
- pods
- Controller Manager,即控制器管理器,用于调度程序以及节点状态检测(是k8s的大脑)。
- Nodes,构成了 Kubernetes 集群的集体计算能力,实际部署容器运行的地方。
- Pods,Kubernetes 集群中资源的最小单位。
下图是 Kubernetes 集成 Jenkins 实现 CICD(一图胜千言,需要对其有一个大致的认识):
而下图则是 GitLab + Jenkins Pipeline + Doker + k8s + Helm 自动化部署:
7、k8s与Docker Swarm江湖恩怨
Docker Swarm 与 k8s 同为容器编排技术。
如果非要拿Docker和k8s进行比较,其实更应该拿Docker Swarm和k8s比较。
Docker Swarm是Docker自驾针对集群化部署管理的解决方案。优点很明显,可以更紧密集成到Docker生态系统中。虽说Swarm和Docker血缘更近,但是由于商业、生态等原因依旧没有k8s流行。
8、Docker与k8s难舍难分
Docker和k8s在业界非常流行,已经是事实上的标准了。
Docker是用于构建、分发、运行()容器的平台和工具。
而k8s实际上是一个使用Docker容器进行编排的系统,主要围绕pods进行工作。Pods是k8s生态中最小的调度单位,可以包含一个或多个容器。
Docker和k8s分别做不通的事情,两者是协同关系。
9、开发实践
(1)不用k8s可以使用docker吗?
可以。对于一些小型公司、业务不太复杂的情况下都是可以直接使用docker的。尽管k8s有很多好处,但是众所周知它非常复杂,简单业务完全可以放弃使用k8s。但是当业务达到一定规模后可能还是要借助k8s才行。
(2)没有Docker可以使用k8s吗?
k8s展示一个容器编排器,没有容器拿什么编排??
k8s经常与Docker进行搭配使用,但是也可以使用其他容器,如RunC、Containerted等。
(3)Docker Swarm和k8s怎么选?
选k8s。2019 年底 Docker Enterprise 已经出售给 Mirantis,Mirantis 声明要逐步淘汰 Docker Swarm,后续会将 k8s 作为默认编排工具。
转载自 一文带你认识「Docker」与「k8s」 - 掘金
10、k8s弃用docker?
k8s 1.20版本的changelog原文如下:
Docker support in the kubelet is now deprecated and will be removed in a future release. The kubelet uses a module called "dockershim" which implements CRI support for Docker and it has seen maintenance issues in the Kubernetes community
原文说的是kubelet是通过一个叫做dockershim的模块实现对docker的支持,然后以后版本会移除这个dockershim模块。
典型的k8s runtime架构(dockershim)
关于dockershim是什么还要从k8s发布之初和docker的关系说起。k8s在发布之初,docker在容器实现方面占据垄断地位。为了迎合主流,kubernetes官网也率先使用docker作为底层容器的实现。
注: shim 顾名思义就是 “垫片”的意思。
2016年12月k8s发布CRI(Container Runtime Interface),很重要的一个考量就是为了避免后续兼容其他运行时带来的维护工作,所以发布了统一的CRI接口。这样凡是支持CRI的运行时,皆可以直接作为k8s的底层运行时。
所以之前的架构是:
Kubelet 通过CRI接口调用dockershim请求创建容器;
dockershim把创建容器的请求转换成docker daemon的请求往docker创建一个容器;
这时候把容器创建请求请求到使用CRI实现的containerd;
containerd通过OCI调用containerd-shim然后进而使用操作系统底层实现容器的创建 ;
看到这儿,相信大家就知道官网为什么要移除dockershim了!!!
因为这个调用合着需要经过两个划水的dockershim和docker daemon。kubelet直接调用containerd就完事了。于是就有了如下新架构:
总结来说,k8s启用的其实是dockershim,选择直接对接CRI接口;并且默认支持的是containerd(就是docker自带的组件),所以完全可以和docker本身做到100%兼容。k8s去除dockershim是自身发展考虑,为的是支持更通用的CRI标准,更高抽象化意味着更好的兼容性。
顺便说下,即便启用docker也不代表docker就要凉了。docker带给我们的是更新的工作流和开发方式,一种容器化的思维。在我们的日常开发中,docker在临时搭建一些环境时还是可以发挥巨大作用的。
相关文章:

一文了解docker与k8s
随着 k8s 作为容器编排解决方案变得越来越流行,有些人开始拿 Docker 和 k8s 进行对比,不禁问道:Docker 不香吗? k8s 是 kubernetes 的缩写,8 代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手两者相互依存…...

Linux基础——进程控制
1. 进程创建 在这之前我们曾了解过进程创建(详见进程初识(二)),我们在这里对fork函数做一些补充 其实对于父子进程来说,若是有一方试图修改数据时,会向物理内存中申请一份新空间,并…...

网络工程师笔记8
华为VRP系统 设备管理方式 web管理方式 命令行管理方式 修改命令:undo 基础配置命令...

从零学算法128
128.给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums [100,4,200,1,3,2] 输出:4…...

2024免费mac苹果电脑的清理和维护软件CleanMyMac X
对于 Mac 用户来说,电脑的清理和维护是一件让人头疼的事情。但是,有了 CleanMyMac X,这一切都将变得轻松愉快。CleanMyMac X 是一款专为 Mac 设计的电脑清理软件,它以其强大的功能和简单的操作,让无数用户为之倾倒。 C…...

Python反射机制在实际场景中的应用
Python 的反射机制是指在运行时动态地访问、检测和修改类和对象的属性和方法。反射为开发者提供了一种灵活的方式来处理对象和类,可以在实际场景中提供一些有用的功能和应用,下面是 Python 反射在实际场景中的一些常见应用: 插件系统…...

网络原理初识
一、IP地址 概念 IP 地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。简单说, IP 地址用于定位主机 的网络地址 。 就像我们发送快递一样,需要知道对方的收货地址,快递员才能将包裹送到目的地。 二、…...

关于uniapp小程序的分包问题
开发uniapp小程序时,在打包上传代码时会出现超出2M的打包限制不能上传,那么我们该怎么做呢? 1.对于图片,将图片从后端服务取,尽量不要放在静态资源,图片体积会影响打包大小。 2.使用分包,tabb…...

MySQL:索引的优化方法
索引是帮助存储引擎快速获取数据的一种数据结构,形象的说就是索引是数据的目录。 索引创建的时机: 索引并不是越多越好的,虽然他再查询时会提高效率,但是保存索引和维护索引也需要一定的空间和时间成本的。 不创建索引:…...

前后端分离vue+nodejs+mysql高校学生社团管理系统xgp16
系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对高校社团的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的思想&a…...

HCIA-Datacom实验指导手册:7 构建简单 IPv6 网络
HCIA-Datacom实验指导手册:7 构建简单 IPv6 网络 一、实验介绍:二、实验拓扑:三、实验目的:四、配置步骤:步骤 1 设备基础配置设备命名 步骤 2 配置设备及接口 IPv6 功能步骤 3 配置接口的 link-local 地址,…...

ElasticSearch搜索引擎使用指南
一、ES数据基础类型 1、数据类型 字符串 主要包括: text和keyword两种类型,keyword代表精确值不会参与分词,text类型的字符串会参与分词处理 数值 包括: long, integer, short, byte, double, float 布尔值 boolean 时间 date 数组 数组类型不…...

mysql与oracle的区别
一、并发性并发性是oltp数据库最重要的特性,但并发涉及到资源的获取、共享与锁定。mysql:mysql以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。虽然InnoDB引擎的表…...

JVM相关面试题及常用命令参数
JVM常用命令和参数 常用命令: jps:查看进程及其相关信息 jmap:用来生成dump文件和查看堆相关的各类信息的命令 jstat:查看jvm运行时的状态信息 jstack:查看jvm线程快照的命令 jinfo:查看jvm参数和动态修改…...

Material UI 5 学习01-按钮组件
Material UI 5 学习01-按钮组件 一、安装Material UI二、 组件1、Button组件1、基础按钮2、variant属性3、禁用按钮4、可跳转的按钮5、disableElevation属性6、按钮的点击事件onClick 2、Button按钮的颜色和尺寸1、Button按钮的颜色2、按钮自定义颜色3、Button按钮的尺寸 3、图…...

解决移除数字问题的两种方法:暴力法和使用栈
题目 给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字 示例 1 : 输入:num "1432219", k 3 输出:"1219"…...

高校宣讲会管理系统|基于Springboot的高校宣讲会管理系统设计与实现(源码+数据库+文档)
高校宣讲会管理系统目录 目录 基于Springboot的高校宣讲会管理系统设计与实现 一、前言 二、系统功能设计 1、学生信息管理 2、企业信息管理 3、宣讲会管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …...

6_怎么看原理图之协议类接口之LCD笔记
首先想一想再前几篇文章讲的协议类的前提 1、双方约定好通信的协议 2、双方满足一定的时序要求 以上第二点又有一些要求: 1)弄清2440在这个通信协议中,能设置哪些时序的值,这些值的含义是什么——2440手册 2)弄清楚这…...

SpringCloud Alibaba 学习
一:SpringCloud Alibaba介绍 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服 务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 依托 Spring Cloud Alibaba&…...

【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 4
【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 4 文章目录 前言一、创建controller相关二、测试运行测试forward_position_controller总结前言 本篇文章在上篇文章的基础上主要讲解双轴机器人驱动怎么编写机器人外部/内部(扭矩、压力)传感器数据反馈1,…...

Leetcode 3071. Minimum Operations to Write the Letter Y on a Grid
Leetcode 3071. Minimum Operations to Write the Letter Y on a Grid 1. 解题思路2. 代码实现 题目链接:3071. Minimum Operations to Write the Letter Y on a Grid 1. 解题思路 这一题思路上也是比较直接的,就是首先找到这个Y字符,然后…...

随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
309.最佳买卖股票时机含冷冻期 public class Solution {public int MaxProfit(int[] prices) {if(prices.Length<2){return 0;}int [,]dpnew int[prices.Length,4];dp[0,0]-prices[0];for(int i1;i<prices.Length;i){dp[i,0]Math.Max(dp[i-1,0],Math.Max(dp[i-1,3]-pric…...

【语言学习】std::transform函数
阅读llvm的这个提交时,发现了其中使用了一个函数std::transform(原文对其进行了一层封装) 如果不理解std::transform的三个参数的关系,就会对第三个参数的lambda表达式理解不了。其实,第三个参数的作用是提供给了一种…...

Java开发面试准备,轻松搞定SpringBoot数据校验
程序员:给多少工资,干多少事 我们不是经常会看到一个关于西游记的“悖论”吗: 为什么孙悟空初期大闹天宫的时候那么厉害?因为他自己当老板,打一群天庭的打工仔。 为什么取经路上又变得不行了?作为一个打工…...

信呼OA普通用户权限getshell方法
0x01 前言 信呼OA是一款开源的OA系统,面向社会免费提供学习研究使用,采用PHP语言编写,搭建简单方便,在中小企业中具有较大的客户使用量。从公开的资产治理平台中匹配到目前互联中有超过1W的客户使用案例。 信呼OA目前最新的版本是…...

MySQL进阶之(四)InnoDB数据存储结构之行格式
四、InnoDB数据存储结构之行格式 4.1 行格式的语法4.2 COMPACT 行格式4.2.1 记录的额外信息01、变长字段长度列表02、NULL 值列表03、记录头信息 4.2.2 记录的真实数据 4.3 Dynamic 和 Compressed 行格式4.3.1 字段的长度限制4.3.2 行溢出4.3.3 Dynamic 和 Compressed 行格式 4…...

【Qt学习笔记】(四)Qt窗口
Qt窗口 1 菜单栏1.1 创建菜单栏1.2 在菜单栏中添加菜单1.3 创建菜单项1.4 在菜单项之间添加分割线1.5 给菜单项添加槽函数1.6 给菜单项添加快捷键 2 工具栏2.1 创建工具栏2.2 设置停靠位置2.3 设置浮动属性2.4 设置移动属性2.5 添加 Action 3 状态栏3.1 状态栏的创建3.2 在状态…...

入侵和攻击模拟 (BAS) 技术应用实践
文章目录 前言一、实施BAS的必要性二、实施BAS的关键步骤1、识别网络中的脆弱区域2、创建基线安全模型3、选择合适的BAS工具4、进行模拟攻击测试5、分析结果并改进三、BAS实施中的挑战1、组织的专业知识和能力有限2、改变传统工作流程3、安全预算不足4、难以与现有安全基础设施…...

数据结构(七)——线性表的基本操作
🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉 在csdn获奖荣誉: 🏆csdn城市之星2名 …...

Python 系统学习总结(基础语法+函数+数据容器+文件+异常+包+面向对象)
🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 六天时间系统学习Python基础总结,目前不包括可视化部分,其他部分基本齐全,总结记录࿰…...