在容器技术领域,有两个开源技术脱颖而出:Kubernetes 和 Docker。虽然它们本质上是协助用户进行容器管理的两种不同技术,但二者是互补的,结合使用时可以发挥强大作用。因此,选择使用 Kubernetes 还是 Docker 并不是在决定孰优孰劣;实际上,它们并不相互竞争,反而可以同时使用。由此可见,对于“Kubernetes 与 Docker 孰优孰劣”的问题,答案其实是“无需二选一”。
Kubernetes 和 Docker 是互补的容器技术,这也解答了另一个常见问题:Kubernetes 会取代 Docker 吗?
简而言之,不会。由于 Kubernetes 并非竞争性技术,这个问题很可能源于 2021 年的一条新闻:Kubernetes 不再将 Docker 作为容器运行时选项支持(即作为容器组件,在整个容器化过程中与操作系统内核通信)。然而,Kubernetes 和 Docker 仍然兼容,并且结合使用时可以带来明显优势,正如我们将在本文后续详细探讨的那样。首先,需要从将 Kubernetes 与 Docker 联系在一起的基础技术,也就是容器开始讲起。
容器是一个可执行的软件单元,它将应用程序代码及其依赖项打包在一起,使其能够在任何 IT 基础设施上运行。容器是独立存在的;它与宿主操作系统(通常是 Linux)隔离开来,这使得容器可以在不同的 IT 环境中移植使用。
理解容器概念的一种方法是将其与虚拟机 (VM)进行比较。两者都基于虚拟化技术,但容器虚拟化的是操作系统,而虚拟机则利用虚拟机管理程序(虚拟机和计算机硬件之间的轻量级软件层)来充分利用物理硬件。
在传统的虚拟化中,每个虚拟机都包含客户操作系统 (OS) 的完整副本、运行操作系统所需的硬件的虚拟副本以及应用程序(及其相关的库和依赖项)。而容器则只包含应用程序及其库和依赖项。由于没有虚拟机的宿主操作系统,容器的体积大大减小,使其轻量化、运行快速且便于移植。此外,容器会自动使用主机的 DNS 设置。
工程师可以使用容器快速开发在大量分布式系统和跨平台环境中一致运行的应用程序。容器的可移植性消除了许多由于各职能团队使用的工具和软件不同而产生的冲突。
这使得它们特别适合 DevOps 工作流程,从而让开发人员和 IT 运维团队能够在不同环境中更顺畅地协作。小巧且轻量的容器也非常适合微服务架构,在这种架构中,应用程序由松散耦合的较小服务组成。容器化通常是本地部署应用程序实现现代化并将其与云服务集成的第一步。
Docker 是一个开源的容器化平台。基本上,它是一个工具包,可以让开发人员更轻松、更安全、更快速地构建、部署和管理容器。这个工具包也称为 containerd(容器化运行时)。
虽然 Docker 最初是一个开源项目,但现在 Docker 也指代 Docker, Inc.,生产商业 Docker 产品的公司。目前,无论开发者使用 Windows、Linux 还是 MacOS,Docker 都是创建容器的最流行工具。
事实上,在 Docker 2013 年发布之前,容器技术已经存在了几十年。早期,Linux 容器(Linux Containers,简称 LXC)是最普遍的容器技术。Docker 建立在 LXC 之上,但 Docker 的定制化技术很快超越了 LXC,成为最流行的容器化平台。
Docker 的关键属性之一是它的可移植性。Docker 容器可以运行在任何台式机、数据中心或云环境中。每个容器中只能运行一个进程,因此当应用程序的某个部分正在更新或修复时,整个应用仍能持续运行。
Docker 常用的一些工具和术语包括以下内容:
现在我们来回顾一下为什么 Kubernetes 停止支持 Docker 作为容器运行时。正如本节开头所提到的,Docker 是一个 containerd(容器化运行时),而不是容器运行时。这意味着 Docker 构建在底层容器运行时之上,通过用户界面为用户提供功能和工具。为了将 Docker 作为运行时支持,Kubernetes 必须支持并实现一个名为 Docker Shim 的独立运行时,它本质上位于两者之间,帮助它们进行通信。
当时之所以这样做,是因为可用的容器运行时并不多。然而,现在已有多种选择,例如 CRI-O 这样的容器运行时。Kubernetes 现在可以为用户提供丰富的容器运行时选项,其中许多使用标准的容器运行时接口(Container Runtime Interface,CRI),它是一种让 Kubernetes 与容器运行时直接可靠通信的方法,无需中间层作为桥梁。
然而,即便 Kubernetes 不再为 Docker 作为运行时提供专门支持,它仍然可以运行并管理使用 Open Container Initiative (OCI) 构建的容器,这是 Docker 自身的镜像格式,允许使用 Dockerfile 构建 Docker 镜像。换句话说,Docker 在 Kubernetes 生态系统中仍有很大价值。
Docker 容器化平台提供了前面提到的所有容器优点,包括:
Docker 的其他 API 功能包括:自动跟踪并回滚容器镜像、使用现有容器作为构建新容器的基础镜像,以及根据应用程序源代码构建容器。Docker 拥有一个充满活力的开发者社区,通过 Docker Hub 在互联网上共享数千个容器。
虽然 Docker 在处理小型应用程序时表现良好,但大型企业应用可能涉及大量容器(有时是数百甚至数千个),这对于负责管理的 IT 团队来说非常繁重。这时就需要容器编排工具。Docker 自身有编排工具 Docker Swarm,但迄今为止,最流行且功能最强大的选择是 Kubernetes。
Docker 具有用于创建和运行容器的多个命令:
Kubernetes 是一个开源的容器编排平台,用于调度和自动执行容器化应用程序的部署、管理和扩展。容器在称为簇的多容器架构中运行。Kubernetes 簇包含一个被指定为控制平面的容器,该容器负责为簇中的其余容器(或工作节点)调度工作量。
主节点负责确定应用程序(或 Docker 容器)的托管位置,决定如何组合它们,并管理其编排。通过将组成应用程序的容器分组为簇,Kubernetes 促进了服务发现,并使在整个生命周期中管理大量容器变得可行。
Google 于 2014 年推出了 Kubernetes 作为一个开源项目。现在,它由一个名为 Cloud Native Computing Foundation(CNCF) 的开源软件基金会管理。Kubernetes 专为生产环境中的容器编排而设计,其受欢迎的原因部分在于其强大的功能、活跃的开源社区(拥有数千名贡献者),以及对主要公有云提供商(如 IBM Cloud、Google、Azure 和 AWS)的支持和可移植性。
尽管 Kubernetes 和 Docker 是不同的技术,但它们高度互补,结合使用时非常强大。Docker 提供了容器化功能,使开发者能够通过命令行轻松将应用程序打包到小型、隔离的容器中。随后,开发者可以在整个 IT 环境中运行这些应用,而无需担心兼容性问题。如果应用在单个节点上测试成功,它就可以在任何地方运行。
当需求激增时,Kubernetes 会对 Docker 容器进行编排,在 IT 环境中调度并自动部署它们,以确保高可用性。除了运行容器外,Kubernetes 还提供负载均衡、自我修复能力以及自动部署与回滚的优势。此外,它还提供图形用户界面,使用更便捷。
对于预计未来会扩展基础设施的公司,从一开始就使用 Kubernetes 可能是明智的选择。而对于已经使用 Docker 的企业,Kubernetes 可以利用现有的容器和工作负载,同时处理扩展过程中涉及的复杂问题。
较新版本的 Docker 内置了与 Kubernetes 的集成功能。该功能使开发团队能够更有效地自动化和管理所有由 Docker 构建的容器化应用。
最终,这取决于您的团队需要使用哪种工具组合来实现业务目标。可以查看这些 Kubernetes 教程入门,并探索 IBM Cloud Kubernetes Service 以了解更多信息。
通过完成 IBM CloudLabs 的免费浏览器版 Kubernetes 教程,即可获得认证徽章。