(转)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 参考文献

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

相关推荐
ZLRRLZ5 分钟前
【Docker】Docker镜像仓库
docker·容器
知白守黑2673 小时前
docker资源限制
运维·docker·容器
无妄无望7 小时前
docker学习(4)容器的生命周期与资源控制
java·学习·docker
爱宇阳9 小时前
禅道社区版 Docker Compose 服务迁移教程
运维·docker·容器
xzl049 小时前
docker运行Ubuntu22.04
docker
能不能别报错10 小时前
K8s学习笔记(十九) K8s资源限制
笔记·学习·kubernetes
qq_2642208910 小时前
K8s存储-PV与PVC
云原生·容器·kubernetes
vue学习11 小时前
docker 学习dockerfile 构建 Nginx 镜像-部署 nginx 静态网
java·学习·docker
热爱生活的五柒11 小时前
vscode如何链接远程服务器里面的docker里面的目录
服务器·vscode·docker
kyle-fang12 小时前
tritonserver的docker镜像中运行onnxruntime-gpu,报错segmentationfault
容器