当前位置: 首页 > ds >正文

(转)Docker与K8S的区别

1 定义角度

  • Docker是一种开放源码的应用容器引擎,允许开发人员将其应用依赖包打包成可移植的容器/镜像中;然后,发布到任何流行的 Linux 或 Windows 机器上,也能实现虚拟化。该容器完全使用沙箱机制,彼此之间没有任何接口。

  • k8s,全称 kubernetes,是一种开放源码的容器集群管理系统,能够实现自动化部署自动化扩缩容器集群维护等功能;同时提供完善的管理工具,涵盖了开发、部署、测试、运行监控等各个环节。

2 虚拟化角度

虚拟化技术的发展过程

虚拟化技术已经走过了三个时代(物理机时代-->虚拟机时代-->容器化时代),没有容器化技术的演进就不会有 Docker 技术的诞生。

物理机时代:多个应用程序可能会跑在一台机器上

虚拟机时代:一台物理机器安装多个虚拟机(VM),一个虚拟机跑多个程序。

容器化时代:一台物理机安装多个容器实例(container),一个容器跑多个程序。

开发人员编写代码,在自己本地环境测试完成后,将代码部署到测试或生产环境中,经常会遇到各种各样的问题。明明本地完美运行的代码为什么部署后出现很多 bug,原因有很多:不同的操作系统、不同的依赖库等,总结一句话就是因为本地环境和远程环境不一致。

容器化技术正好解决了这一关键问题,它将软件程序和运行的基础环境分开。开发人员编码完成后将程序打包到一个容器镜像中,镜像中详细列出了所依赖的环境,在不同的容器中运行标准化的镜像,从根本上解决了环境不一致的问题。

虽然容器概念已经出现不短的时间,但 2013 年推出的开源项目 Docker 在很大程度上帮助推广了容器这项技术,并推动了软件开发中容器化和微服务的趋势,这种趋势后来被称为云原生开发

Virtual Machines VS. Docker

上图是Docker容器(可用k8s管理的玩意儿)与传统虚拟化方式的不同之处:

  • 传统的虚拟化技术,在将物理硬件虚拟成多套硬件后,需要再每套硬件上都部署一个操作系统,接着在这些操作系统上运行相应的应用程序。
  • Docker容器,容器内的应用程序进程直接运行在宿主机(真实物理机)的内核上,Docker引擎将一些各自独立的应用程序和它们各自的依赖打包,相互独立直接运行于未经虚拟化的宿主机硬件上,同时各个容器也没有自己的内核,显然比传统虚拟机更轻便。
  • 每个集群有多个节点,每个节点可以部署多个Docker容器(container)

我们的kuberbete就是管理这些应用程序所在的小运行环境container)而生。

3 部署角度

注意,大家别把这幅图与上面Docker的那张图混淆了

  • 图1是从虚拟化角度,说明了为应用提供必要的运行环境所需要做的虚拟化操作。即:
  • 传统 :虚拟出的虚拟机装操作系统
  • Docker :容器引擎管理下的容器
  • 图2是在这些具体运行环境上进行真实应用部署时的情况
  • 传统方式是将所有应用直接部署在同一个物理机器节点上,这样每个App的依赖都是完全相同的,但无法做到App之间隔离。

当然,为了隔离,我们也可以通过创建虚拟机的方式来将App部署到其中(就像图1上半部分那样),但这样太过繁重,故比虚拟机更轻便的Docker技术出现。

  • Docker 容器化技术

现在我们通过部署Container容器的技术来部署应用,全部Container运行在容器引擎上即可。
既然嫌弃虚拟机繁重,想用Docker,那好,你用吧,怎么用呢?手动一个一个创建?

  • K8S容器集群管理技术

当然不,故kubernetes技术便出现了,以kubernetes为代表的容器集群管理系统,这时候就该上场表演了。
说白了,我们用kubernetes去管理Docker集群,即可以将Docker看成Kubernetes内部使用的低级别组件。
另外,kubernetes不仅仅支持Docker;还支持Rocket,这是另一种容器技术。

4 其他角度

4.1 系统角度

从系统角度来看:

  • docker是一种单机容器技术,在单独的主机上运行。

小型应用程序部署的话直接使用docker或者docker-compose编排就可以了。

  • k8s是一种分布式集群系统,可以在多个主机上面协调和管理容器。

如果是大型的应用的话,使用k8s多机部署编排则更合适

4.2 功能角度

从功能上来看的话

  • docker提供对容器的创建、启动、停止和删除等。
  • k8s则提供丰富的容器编排和管理,比如自动扩容,负载均衡、服务发现和滚动更新等。

4.3 各自优势

  • Docker的优势:容器技术
  • 隔离性:Docker容器是相互隔离的,每个容器运行着自己的进程、文件系统和网络接口,从而保证了应用程序容器之间的独立性和安全性。
  • 可移植性:Docker容器可以在任何地方运行,无需修改,从而实现了在不同的环境中快速分发、部署和移植应用。
  • 简洁性:Docker容器中仅包含所需的组件和软件包,不像虚拟机需要运行整个操作系统,因此具有更小的存储和内存开销。
  • 可重复性:Docker容器的构建和部署过程可以自动化,从而保证了应用程序的可重复性和一致性。
  • Kubernetes的优势:容器编排技术
  • 可扩展性:Kubernetes可以快速伸缩应用程序,从而应对不同的流量和负载变化,提高生产效率和灵活度。
  • 健壮性:Kubernetes可以自动进行容器的部署、扩展、更新和滚动回滚,从而使线上应用具有更高的可用性和健壮性。
  • 自适应性:Kubernetes可以根据资源需求自动部署、迁移和删除容器,从而实现了应用程序的自适应性,避免了资源浪费和性能瓶颈。
  • 可观察性:Kubernetes提供了丰富的监控和日志记录功能,可以对应用程序和容器进行细粒度的监控和调试。

X 参考文献

  • 面试官:请你说说k8s 和 Docker的区别? - CSDN
  • Docker和k8s的区别与介绍 - 博客园
  • K8S 弃用 Docker 了?Docker 不能用了?别逗了! - Zhihu
  • 三年Java开发转运维----面试官问我:docker和k8s有什么区别,我应该怎么回答? - Zhihu
  • 一文带你认识「Docker」与「k8s」 - juejin

本文链接: [Docker/K8S] Docker与K8S的区别 - 千千寰宇 - 博客园 

http://www.xdnf.cn/news/9078.html

相关文章:

  • Java中Map集合的遍历方式详解
  • 【监控】PromQL 查询语言
  • vscode连接的linux服务器,上传项目至github
  • 开启MySQL的binlog日志
  • 每天掌握一个Linux命令 - ab(Apache Benchmark)
  • 进程IO之 进程
  • 组态王KingSCADA4.0连接1200PLC实战教程以及麒麟版问题说明
  • 【Spring Boot 实战】使用 HTTP 响应压缩优化接口性能
  • webtrees——在线协作家谱
  • Cursor 对话回答如何设置成中文
  • Pypy3 和 Python3 的区别
  • 如何做好一份技术文档:从精准导航到持续迭代的实践指南
  • Prompt Engineering 提示工程介绍与使用/调试技巧
  • uniapp开发小程序,如何根据权限动态配置按钮或页面内容
  • [服务器初体验] SSH登录成功后,我的新Linux服务器“空空如也”?三件必做的事让它安全又顺手
  • Redis 性能优化:核心技术、技巧与最佳实践
  • 高性能管线式HTTP请求
  • 强制 IntelliJ IDEA 使用 Google Chrome 打开项目
  • 刷机维修进阶教程-----没有开启usb调试 如何在锁定机型的拨号界面特殊手段来开启ADB
  • C++ 继承的相关内容 基类和派生类 默认成员函数的区别等问题
  • IBM DB2升级过程
  • Hadoop集群部署
  • 为什么要使用stream流
  • 计算机网络-MPLS VPN应用场景与组网
  • 【Opencv+Yolo】_Day1图像基本处理
  • [Godot][游戏开发] 如何在 Godot 中配置 Android 环境(适配新版 Android Studio)
  • [7-2] AD单通道AD多通道 江协科技学习笔记(30个知识点)
  • 免费分享50本web全栈学习电子书
  • Higress MCP Server 安全再升级:API 认证为 AI 连接保驾护航
  • Elasticsearch Synthetic _source