Kubernetes 能取代 Docker吗?

在容器技术方面,有两个名字成为开源领导者:Kubernetes 和 Docker。虽然它们是帮助用户进行容器管理的根本不同技术,但它们是互补的,并且在组合时可以发挥强大的作用。在这方面,选择使用 Kubernetes 或 Docker 并不是决定哪个选项更好的问题;实际上,它们并不相互竞争,实际上可以串联使用。所以,对于 Kubernetes 还是 Docker 是更好的选择的问题,答案都不是。

Kubernetes 和 Docker 是互补的容器技术这一事实澄清了另一个常见问题:Kubernetes 是否正在取代 Docker?

简而言之,没有。由于 Kubernetes 不是一项竞争技术,因此这个问题可能源于 2021 年爆出的消息,即 Kubernetes 将不再支持 Docker 作为容器运行时选项(即始终与操作系统 (OS) 内核通信的容器组件)容器化过程)。但是,Kubernetes 和 Docker 仍然兼容,并在一起使用时提供明显的好处,我们将在本文后面更详细地探讨。首先,重要的是从将 Kubernetes 和 Docker 联系在一起的基础技术——容器开始。

什么是容器?

容器是一个 可执行的软件单元,它将应用程序代码与其依赖项打包在一起,使其能够在任何 IT 基础设施上运行。一个容器独立存在;它是从主机操作系统(通常是 Linux)中抽象出来的,这使得它可以跨 IT 环境移植。

理解容器概念的一种方法是将其与 虚拟机 (VM)进行比较。两者都基于虚拟化技术,但是当容器虚拟化操作系统时,虚拟机利用 管理程序 (虚拟机和计算机硬件之间的轻量级软件层)来虚拟化物理硬件。 

使用传统 的虚拟化,每个 VM 都包含客户操作系统 (OS) 的完整副本、运行操作系统和应用程序(及其相关的库和依赖项)所需的硬件的虚拟副本。另一方面,容器仅包含应用程序及其库和依赖项。没有来宾主机显着减小了容器的大小,使其轻巧、快速和便携。此外,容器会自动使用主机的 DNS 设置。

什么是 Docker?

Docker 是一个开源的 容器化 平台。基本上,它是一个工具包,可以让开发人员更轻松、更安全、更快速地构建、部署和管理容器。该工具包也称为 containerd。

虽然它最初是一个开源项目,但今天的 Docker 也指的是生产商业 Docker 产品的公司 Docker, Inc.。目前,无论开发人员使用 Windows、Linux 还是 MacOS,它都是最流行的容器创建工具。

事实上,在 2013 年 Docker 发布之前,容器技术已经存在了几十年。在早期,Linux 容器(或 LXC)是其中最流行的。Docker 是建立在 LXC 之上的,但 Docker 的定制化技术很快就超越了 LXC,成为最流行的容器化平台。 

Docker 的关键属性之一是它的可移植性。Docker 容器可以在任何桌面、 数据中心 或云环境中运行。每个容器中只能运行一个进程,因此应用程序可以在其中一部分进行更新或修复时连续运行。

Docker 常用的一些工具和术语包括:

  • Docker Engine:允许开发人员构建和运行容器的运行时环境。
  • Dockerfile:一个简单的文本文件,它定义了构建 Docker 容器映像所需的一切,例如操作系统网络规范和文件位置。它本质上是 Docker 引擎将运行以组装映像的命令列表。
  • Docker Compose:定义和运行多容器应用程序的工具。它创建一个 YAML 文件来指定应用程序中包含哪些服务,并且可以通过 Docker CLI 使用单个命令部署和运行容器。

现在让我们回顾一下为什么 Kubernetes 停止支持 Docker 作为容器运行时。如本节顶部所述,Docker 是一个容器,而不是容器运行时。这意味着 Docker 位于底层容器运行时之上,通过用户界面为用户提供功能和工具。为了支持 Docker 作为运行时,Kubernetes 必须支持并实现一个单独的运行时,称为 Docker Shim,它本质上位于两种技术之间并帮助它们进行通信。

这是在没有很多容器运行时可用的时候完成的。然而,现在有了——CRI-O 就是一个这样的容器运行时的例子——Kubernetes 可以为用户提供大量容器运行时选项,其中许多使用标准容器运行时接口 (CRI),这是 Kubernetes 和容器的一种方式运行时可靠地进行通信,而无需中间层充当中间层。

然而,即使 Kubernetes 不再为 Docker 作为运行时提供特殊支持,它仍然可以运行和管理使用 Open Container Initiative (OCI) 构建的容器,这是 Docker 自己的镜像格式,允许您使用 Dockerfile 和构建 Docker 镜像。换句话说,Dockers 在 Kubernetes 生态系统中还有很多东西可以提供。

Docker的优势是什么?

Docker 容器化平台提供了前面提到的容器的所有好处,包括:

  • 轻量级可移植性:容器化应用程序可以从任何环境迁移到另一个环境(无论 Docker 在哪里运行),并且它们将在不受操作系统影响的情况下运行。
  • 敏捷应用程序开发:容器化使采用CI/CD流程和利用 DevOps 等敏捷方法变得更加容易。例如,容器化应用程序可以在一个环境中进行测试并部署到另一个环境中,以响应快速变化的业务需求。
  • 可扩展性:可以快速创建 Docker 容器,并且可以同时高效地管理多个容器。

其他 Docker API 功能包括自动跟踪和回滚容器镜像、使用现有容器作为构建新容器的基础镜像以及基于应用程序源代码构建容器的能力。Docker 得到了一个充满活力的开发者社区的支持,该社区通过 Docker Hub 在互联网上共享数千个容器。

但是,虽然 Docker 可以很好地处理小型应用程序,但大型企业应用程序可能涉及大量容器——有时数百甚至数千个——这对于负责管理它们的 IT 团队来说变得不堪重负。这就是容器编排的用武之地。Docker 有自己的编排工具 Docker Swarm,但到目前为止,最流行和最强大的选项是 Kubernetes。

Docker 有几个用于创建和运行容器的命令:

  • docker build:此命令从源代码(即,从 Dockerfile 和必要的文件)构建新的 Docker 映像。
  • docker create:此命令在不启动镜像的情况下从镜像创建新的 Docker 镜像,这涉及在镜像上创建可写容器层并准备它。
  • docker run:此命令的工作方式与该 docker create 命令完全相同,只是它需要在创建后运行它的附加步骤。
  • docker exec:此命令用于在已运行的容器内执行新命令。

什么是 Kubernetes?


Kubernetes 是一个开源 容器编排 平台,用于调度和自动化容器化应用程序的部署、管理和扩展。容器在称为“集群”的多容器架构中运行。Kubernetes 集群 包括一个指定为控制平面的容器,该容器为集群中的其余容器(或工作节点)调度工作负载。


主节点决定在哪里托管应用程序(或 Docker 容器),决定如何将它们放在一起并管理它们的编排。通过将构成应用程序的容器分组到集群中,Kubernetes 促进了服务发现并支持在其整个生命周期内管理大量容器。 


谷歌在 2014 年将 Kubernetes 作为一个开源项目引入。现在,它由一个名为 Cloud Native Computing Foundation (CNCF) 的开源软件基金会管理。Kubernetes 专为生产环境中的容器编排而设计,部分原因在于其强大的功能、一个拥有数千名贡献者的活跃开源社区以及领先公共云提供商(例如 IBM Cloud、Google、Azure 和 AWS)的支持和可移植性.

Kubernetes有什么优势?

  • 自动化部署: Kubernetes 跨多个计算节点(可以是虚拟机或裸机服务器)调度和自动化容器部署。 
  • 服务发现和负载平衡: 它在互联网上公开一个容器,并在出现流量高峰时采用 负载平衡 来保持稳定性。
  • 自动缩放功能:自动启动新容器以处理繁重的负载,无论是基于 CPU 使用率、内存阈值还是自定义指标。
  • 自我修复功能: Kubernetes 会在容器发生故障或节点死亡时重新启动、替换或重新调度容器,并杀死不响应用户定义的健康检查的容器。
  • 自动推出和回滚: 它推出应用程序更改并监控应用程序运行状况是否存在任何问题,如果出现问题则回滚更改。
  • 存储编排: 根据需要自动安装持久的本地或云存储系统,以减少延迟并改善用户体验。
  • 动态卷配置:允许集群管理员创建存储卷,而无需手动调用其存储提供者或创建对象。

Kubernetes 和 Docker:寻找最佳容器解决方案

尽管 Kubernetes 和 Docker 是不同的技术,但它们具有高度的互补性并形成了强大的组合。Docker 提供了容器化部分,使开发人员能够通过命令行轻松地将应用程序打包到小型、隔离的容器中。然后,开发人员可以在其 IT 环境中运行这些应用程序,而不必担心兼容性问题。如果应用程序在测试期间运行在单个节点上,它将在任何地方运行。

当需求激增时,Kubernetes 提供 Docker 容器的编排、调度和跨 IT 环境的自动部署,以确保高可用性。除了运行容器之外,Kubernetes 还提供负载平衡、自我修复以及自动推出和回滚的好处。此外,它还具有易于使用的图形用户界面。

对于希望在未来扩展其基础设施的公司,从一开始就使用 Kubernetes 可能是有意义的。对于那些已经在使用 Docker 的人来说,Kubernetes 可以利用现有的容器和工作负载,同时解决扩展规模所涉及的复杂问题。

更多技术干货,关注我们吧~

你可能感兴趣的:(技术讨论,编程,docker,kubernetes,容器)