容器化已经存在了几十年,但近年来在应用程序开发和现代化方面越来越多地被采用。本文涵盖两种容器解决方案及其用途:
容器化是应用程序级别的一种虚拟化形式。它旨在将应用程序及其所有依赖项、运行时、库和配置文件打包在一个独立的可执行包中,称为容器。操作系统(OS)不包含在容器中,这使得它与虚拟机(VM)不同,虚拟机(VM)在硬件级别虚拟化并包含操作系统。
虽然虚拟化背后的概念是在多个虚拟机之间共享物理资源,但容器在多个容器之间共享一个操作系统的内核。与虚拟机不同,容器是轻量级的,因为它们不包含操作系统。这就是容器需要几秒钟才能启动的原因。此外,容器可以轻松部署在不同的操作系统(windows、linux、macOS)和不同的环境(云、VM、物理服务器)上,而无需进行任何更改。
2013 年,Docker Inc. 引入了 Docker,试图标准化容器以在不同平台上广泛使用。一年后,谷歌推出了 Kubernetes 作为管理容器主机集群的解决方案。这两个解决方案的定义将显示Kubernetes 和 Docker 之间的区别。
Docker 是一个开源平台,用于在标准容器中打包和运行应用程序,这些容器可以以相同的行为跨不同的平台运行。使用 Docker,容器化应用程序与主机隔离,这提供了将应用程序交付到运行任何操作系统的任何平台的灵活性。此外,Docker 引擎管理容器并允许它们在同一主机上同时运行。
由于客户端-服务器架构,Docker 由客户端和服务器端组件(Docker 客户端和 Docker 守护进程)组成。客户端和守护进程 (Dockerd) 可以在同一系统上运行,或者您可以将客户端连接到远程守护进程。除了管理其他 Docker 对象(容器、网络、卷、图像等)之外,守护进程还处理客户端发送的 API 请求。
Docker Desktop 是 Docker 客户端和守护进程的安装程序,包括其他组件,如 Docker Compose、Docker CLI(命令行界面)等。它可以安装在不同的平台上:Windows、Linux 和 macOS。
开发人员可以将应用程序设计为在同一主机上的多个容器上运行,这就产生了同时管理多个容器的需要。为此,Docker Inc. 推出了 Docker Compose。Docker vs Docker Compose 可以概括为:Docker 可以管理一个容器,而 Compose 可以管理一台主机上的多个容器。
在同一主机上管理多容器化应用程序是一项复杂且耗时的任务。Docker Compose 是用于单个主机的编排工具,它使用 Compose 文件格式管理在一个主机上定义的多容器化应用程序。
Docker Compose 通过创建一个定义所有容器的 YAML 配置文件,允许同时运行多个容器。Compose 允许您将应用程序拆分到多个容器中,而不是将其构建在一个容器中。您可以将应用程序拆分为称为微服务的子服务,并在容器中运行每个微服务。然后,您可以通过 Compose 运行一条命令来启动所有容器。
开发人员可以将应用程序设计为在不同主机上的多个容器上运行,这就需要为跨不同主机的容器集群提供编排解决方案。为此,Docker Inc. 推出了 Docker Swarm。
Docker Swarm 或 Swarm 模式下的 Docker 是一个 Docker 引擎集群,可以在安装 Docker 后启用。Swarm 允许在不同主机上管理多个容器,不像 Compose 只允许在同一主机上管理多个容器。
Kubernetes (K8s) 是一种编排工具,用于管理一个或多个主机上的容器。K8s 将主机集群,无论它们是在本地、云端还是在混合环境中,并且可以与 Docker 和其他容器平台集成。谷歌最初开发并引入了 Kubernetes 来自动化容器的部署和管理。K8s 提供了多种功能来支持弹性,例如容器容错、跨主机负载平衡以及自动创建和删除容器。
Kubernetes 管理一个由一台或多台主机组成的集群,这些主机要么是主节点,要么是工作节点。主节点包含 Kubernetes 的控制面板组件,而工作节点包含非控制面板组件(Kubelet 和 Kube-proxy)。建议至少拥有一个由四台主机组成的集群:至少一个主节点和三个工作节点来运行您的测试。
主节点可以跨越多个节点,但只能在一台计算机上运行。建议您避免在主节点上创建应用程序容器。master 负责管理集群。它响应集群事件,做出集群决策,使用容器调度操作,启动一个新的 Pod(同一主机上的一组容器,是 Kubernetes 中的最小单元),运行控制循环等。
工作节点是非主节点。有两个节点组件:kubelet 和 kube-proxy。除了像 Docker 这样的容器运行时软件之外,它们还应该在每个工作节点上运行。
Kubernetes 和 Docker 是不同范围的解决方案,可以相互补充以形成强大的组合。因此,Docker 与 Kubernetes 并不是一个正确的比较。Docker 允许开发人员将应用程序打包在隔离的容器中。开发人员可以将这些容器部署到其他机器上,而不必担心与操作系统的兼容性问题。
开发者可以使用 Docker Compose 来管理一台主机上的容器。但是 Docker Compose 与 Kubernetes 也不是一个准确的比较,因为解决方案适用于不同的范围。Compose 的范围仅限于一台主机,而 Kubernetes 的范围是针对一组主机。
当容器和主机数量变多时,开发者可以使用 Docker Swarm 或 Kubernetes 编排 Docker 容器,并在集群中进行管理。Kubernetes 和 Docker Swarm 都是集群设置中的容器编排解决方案。
Kubernetes 在大型环境中比 Swarm 使用更广泛,因为它提供高可用性、负载平衡、调度和监控,以提供永远在线、可靠和健壮的解决方案。
以下几点将突出显示使 K8s 成为值得考虑的更健壮解决方案的差异。
注意:Kubernetes 安装的复杂性可以通过使用 Kubernetes 即服务 (KaaS) 来克服。各大云平台都提供Kaas;其中包括谷歌云平台 (GCP) 的一部分谷歌 Kubernetes 引擎 (GKE) 和亚马逊弹性 Kubernetes 服务 (EKS)。
两种解决方案都支持可扩展性。但是,使用 Swarm 更容易实现可扩展性,而使用 Kubernetes 则更灵活。
这两种解决方案本身都支持高可用性功能。
Docker 是一个容器化平台,用于在容器中独立于操作系统构建和部署应用程序。它可以在 Windows、Linux 或 macOS 上使用 Docker Desktop 安装,并包括其他解决方案,如 Compose 和 Swarm。当在同一主机上创建多个容器时,管理它们会变得更加复杂。在这种情况下,可以使用 Docker Compose 轻松管理同一主机上一个应用程序的多个容器。
在大型环境中,多个节点的集群成为确保高可用性和其他高级功能的需要。这就需要像 Docker Swarm 和 Kubernetes 这样的容器编排解决方案。对比这两个平台的特性,可以看出两者都支持可扩展性、高可用性和负载均衡。但是,Swarm 更易于安装和使用,而 Kubernetes 支持自动扩展和内置监控工具。这解释了为什么大多数大型组织将 Kubernetes 与 Docker 用于主要分布在数百个容器中的应用程序。