发布于 2026-01-06 6 阅读
0

Kubernetes vs Docker DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

Kubernetes 与 Docker

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

作者:穆罕默德·哈巴布

Docker 和 Kubernetes 简介

容器化是应用现代化改造的核心要素之一,几乎所有新应用开发都使用容器来打包应用。企业级应用甚至会使用 Kubernetes 等容器编排平台。今天我们将详细探讨 Docker 和 Kubernetes。

我们将从功能、优缺点等方面对两者进行比较,并探讨在哪些场景下应该优先选择哪一个。需要注意的是,Docker 只是一个容器运行时环境,而 Kubernetes 是一个容器编排平台,因此两者相辅相成。让我们先简要介绍一下这两种技术。

我们将介绍以下步骤:

什么是 Docker?

Docker是一个旨在为开发者提供开发、运行和部署应用程序环境的平台。它的技术基于容器化;要理解这个概念,我们首先需要了解容器。无论您的应用程序需要什么,Docker 都能为您提供一个独立的隔离环境。您可以将 Docker 想象成一个胶囊,它将应用程序的所有依赖项打包在其中。您可以将这个胶囊部署到任何地方,从而在任何地方运行您的应用程序。

容器是什么?

容器是一种将应用程序及其运行所需的一切(即所有必要的依赖项和配置)打包在一起的方法,以便在不同的环境中运行。与其他任何工件一样,该软件包具有可移植性,可以轻松地在开发团队之间或开发与运维团队之间共享。

从技术上讲,容器由图像组成,并且我们有多层堆叠的图像。

React 工具提示

Docker架构

大多数容器的基础镜像都是基于 Linux 的,可以是特定版本的 Alpine,也可以是其他 Linux 发行版。这些基础镜像必须足够小;因此,大多数容器都使用 Alpine,因为它可以确保容器体积小,而这正是使用容器的优势之一。

我们会在基础镜像之上构建一个应用层;上图是一个中间层架构图,它最终会连接到运行在容器中的实际应用镜像。所有镜像的最顶层是配置数据。

Docker 的核心特性

易于扩展:

Docker 能够在任何环境下运行应用程序,因为它能够打包所有需要的资源,而且 Docker 容器不需要专用的操作系统,因为它们非常轻量级,可以利用主机操作系统的资源。

配置简便快捷:

借助 Docker,我们可以更轻松快捷地配置系统,因为部署代码所需的时间和精力更少。使用 Docker 后,基础设施要求不再与应用程序环境挂钩,因为 Docker 几乎可以在任何环境中运行。

缩小尺寸的能力

最佳性能来自于尽可能减小镜像大小,而 Docker 提供了完全自定义每个镜像大小的功能。此外,最佳实践建议使用轻量级基础镜像(例如 Alpine)以获得良好的性能。

提高生产力

Docker 可以显著提升团队的生产力。提升生产力的因素包括:简便的技术配置、快速的应用程序部署、在隔离环境中运行的应用程序以及更低的物理资源占用。

降低基础设施和维护成本

搭建 Docker 环境完全免费,无需支付任何费用。由于 Docker 运行应用程序仅需极少的资源,因此还能节省您的成本,让您可以用更少的硬件运行更多应用程序。

Docker 的应用案例和优势

使用案例 1 -使用 PostgreSQL 作为数据库,Redis 作为消息代理进行应用程序开发,以便在整个开发团队中进行一致且简化的设置。

Docker容器在此用例中的优势:

使用 Docker 容器,开发者无需在操作系统上直接安装任何服务,因为容器拥有独立的、基于 Linux 基础镜像的操作系统层。所有组件都打包在一个隔离的环境中。例如,容器内就打包了特定版本的 PostgreSQL 及其配置。开发者无需下载二进制文件并执行繁琐的步骤,只需访问容器仓库,使用一条命令下载所需的容器,即可立即启动,而无需考虑所使用的操作系统。

用例 2 - 通过开发团队提供给运维团队的工件,在服务器上进行应用程序部署、安装和配置。

Docker容器在此用例中的优势:

上述用例中的流程将使用 Docker 容器进行简化。由于 Docker 容器的存在,开发团队和运维团队只需使用一个打包好的容器,该容器包含所有配置和依赖项,并封装在一个环境中。运维团队无需在服务器上直接进行任何配置或安装。他们只需运行一条 Docker 命令,即可从开发团队存储在容器仓库中的容器中拉取并运行它。这样,Docker 容器简化了传统的部署流程。


面向专业 Web 开发人员的开源企业应用平台

refine.new使您能够在浏览器中创建基于 React 的无头 UI 企业应用程序,您可以立即预览、调整和下载这些应用程序。

🚀 通过可视化组合您偏好的✨ React 平台、✨ UI 框架、✨ 后端连接器和✨ 身份验证提供程序,您可以在几秒钟内为您的项目创建量身定制的架构。这就像拥有触手可及的数千个项目模板,让您可以自由选择最符合您需求的模板!


优化博客徽标


什么是Kubernetes?

Kubernetes 是一个容器编排平台,您可以通过它来管理容器。Kubernetes 提供了一种内置机制,可以为不同的应用程序提供负载均衡。它是由 Google 开发的平台,可帮助您管理由容器组成的应用程序,这些应用程序分布在不同的环境(例如,物理环境、虚拟环境或云环境)中。

它还提供自动化部署和扩展功能。使用 Kubernetes,您可以实现应用程序的高可用性和容错性。总的来说,Kubernetes 由两种类型的组件构成:工作节点和控制平面节点。接下来,我们将了解 Kubernetes 的主要概念。

Kubernetes

Kubernetes 节点:

Kubernetes 节点是每个集群中的机器,它可以是任何数据中心的物理机,也可以是云端的虚拟机。

Kubernetes架构的主要组成部分之一是工作节点:

每个工作节点/机器上运行着多个应用 Pod,每个 Pod 中都包含运行在该节点上的容器。Kubernetes 使用不同的进程来调度和管理这些 Pod,这些进程必须安装在每个工作节点上。它们的核心职责是执行容器和 Pod,处理它们之间的网络连接,并通过高效的资源(CPU/RAM/存储)分配参与负载均衡。

React 工具提示

Kubernetes工作节点进程图

管理进程的另一个主要组件是主节点/控制平面:

主节点/控制平面是 Kubernetes 集群的控制器或管理员。它实际控制着工作节点以及整个集群的各项操作,包括扩展、调度和维护高可用性。控制平面节点监控集群的健康状况,并在任何节点无响应或任何 Pod 崩溃时,能够维持集群的预期状态。它还提供一个 API 服务器作为前端,通过与 Pod、服务和控制器交互来控制 Kubernetes 生态系统。

API服务器:

当您作为用户在 Kubernetes 集群中部署新应用程序时,您将使用客户端与 API 服务器进行交互,客户端可以是 Kubernetes 控制面板之类的图形用户界面,也可以是 kubelet 之类的命令行工具。API 服务器就像一个集群网关,它接收集群中所有更新或查询的初始请求。它还充当集群的“守门人”,负责对通过集群的请求进行身份验证和授权。

Kubernetes的核心特性:

高可用性或零停机时间:

Kubernetes 提供了多种机制来确保应用程序的高可用性。例如,它可以复制包含后端或前端逻辑的相同 Pod。如果任何更新导致崩溃,Kubernetes 可以使用受新更新影响的组件的稳定副本。这样,应用程序就不会出现停机时间,始终可供用户使用。

自动装箱:

自动装箱机制会将可用资源分配给所需的容器。在此过程中,Kubernetes 会自动将应用程序部署到容器中,确保应用程序正常运行,并且不会浪费服务器资源。

支持自动扩展:

Kubernetes 可以根据指标自动扩展应用程序 Pod。自动扩缩容会使用 Heapster 作为监控工具来收集指标并做出扩缩容决策。Kubernetes 有两种类型的自动扩缩容:水平自动扩缩容和垂直自动扩缩容。水平自动扩缩容可以自动扩展 Pod 副本数,而垂直自动扩缩容则会自动扩展每个 Pod 的资源利用率。

监测:

Kubernetes 可以轻松集成第三方监控工具(例如 Datadog、Grafana 等)。Kubernetes 监控可以针对集群和应用程序 Pod 的状态进行。Kubernetes 自动扩缩容也能根据收集到的监控数据做出决策。

存储编排:

运行在 Pod 内的容器可能需要存储数据;为此,我们可以在每个 Pod 内配置存储资源或卷。通常情况下,Pod 内的所有容器共用一个卷。Kubernetes 允许我们选择所需的存储系统,可以是本地存储、云存储或网络存储(NFS)。

自我疗愈:

如果任何容器发生故障,Kubernetes 会负责处理并重启它。即使整个节点宕机,Kubernetes 也会将容器替换并重新调度到其他节点上。

Kubernetes 的应用案例和优势:

*用例 1 –*随着容器技术的广泛应用,微服务架构兴起,拥有成百上千个容器的场景也随之出现。

Kubernetes 在此用例中的优势:

Kubernetes 简化了分析过程,并高效地将计算资源分配到各个微服务中,同时还具备许多自动化功能,例如自动伸缩、自动负载均衡、自动滚动更新、自动自愈和自动备份。

用例 2 –开发团队必须部署一个具有关键任务流程且零停机时间的大型应用程序。

Kubernetes 在此用例中的优势:

Kubernetes 经过专门设计,具备水平 Pod 扩展和负载均衡等特性,能够帮助开发者以最小的停机时间部署系统。即使任何变更出现问题,Kubernetes 也能回滚变更,确保一切正常运行。

Docker 和 Kubernetes:它们如何协同工作

Docker 和 Kubernetes 如何协同工作详解:

Docker 创建了容器,但如果你的应用规模庞大,扩展到数千个容器中呢?如果某个容器发生故障,导致网站或重要功能崩溃怎么办?这时,Kubernetes 技术就派上了用场,它可以与 Docker 容器协同工作,在运行时进行管理。Kubernetes 能确保你的网站流畅运行,实现高可用性,并且不会出现任何停机时间。

Docker 在 Kubernetes 设置中的作用

由于 Docker 容器运行在 Kubernetes 集群内部,因此 Docker 也承担着与容器相关的以下职责:

Docker容器运行时:

正如我们之前在了解 Kubernetes 中的工作节点进程时所讨论的,第一步是在 Kubernetes 工作节点上安装容器运行时。现在,我们将了解容器运行时在 Kubernetes 中的工作原理和作用。容器运行时允许我们在各个节点上挂载和运行容器。

Docker容器存储:

Docker 也可以在单个节点上为每个容器挂载存储卷,但这取决于容器运行时技术。在 Kubernetes 中,Docker 确保每个容器都能访问资源和存储基础设施。为了管理 Docker 容器存储,Docker 和 Kubernetes 通过 CSI(容器存储接口)进行通信。

Docker 和 Kubernetes 的比较

Docker 和 Kubernetes 的逐项功能比较

Docker Kubernetes
可扩展性: Docker 没有内置的扩展功能。它专注于应用程序的打包。 可扩展性:这是 Kubernetes 的核心特性,因为它能够让您在有效利用物理资源(例如 CPU/RAM/存储)的同时,水平或垂直扩展您的应用程序。
缺乏自愈能力: Docker 本身不具备自愈能力,它依赖于 Docker Swarm 等其他工具。 它具有自愈能力: Kubernetes 能够在容器发生故障时重新调度容器。
无自动负载均衡: Docker 没有内置的负载均衡功能,它依赖于 Docker Swarm 等其他工具。 它内置了自动负载均衡功能: Kubernetes 可以处理容器流量的负载均衡。
没有内置存储编排功能: Docker 没有内置的存储编排能力。它依赖于其他工具,例如 Flocker、Portworx、Convoy 等。 它具有内置的存储编排功能: Kubernetes 可以支持不同的存储系统,从而实现存储编排。
没有 Web 用户界面仪表盘: Docker 不提供任何仪表盘。 它有一个 Web UI 控制面板: Kubernetes 提供了一个 Web UI 控制面板,您可以在其中查看所有正在进行的任务的统计信息。

在 Docker 和 Kubernetes 之间进行选择时需要考虑的因素

选择 Docker 而不是 Kubernetes:

小规模应用: Docker 非常适合单主机、轻量级应用。由于您管理的容器数量不多,无需使用 Kubernetes,因此无需容器编排平台。

专注于分发: Docker 技术专注于分发,而非编排。Docker 可以跨多个环境流畅地交付构建成果。

Kubernetes 的学习曲线:与 Docker 相比,Kubernetes 的部署和维护更加复杂和困难。如果您的团队缺乏相关技能,您应该推迟使用 Kubernetes 的决定,直到团队接受过 Kubernetes 培训为止。

选择 Kubernetes 而不是 Docker:

大规模应用: Kubernetes 会自动安装容器,内置容器流量负载均衡器,并能高效地分配集群资源。

高可用性: Kubernetes 在企业级应用领域表现优于 Docker,能够处理每分钟数百万笔事务且零停机时间。Kubernetes 可处理故障转移、Pod 副本和容器重启,从而确保应用的高可用性。

高效的资源管理或利用:如果您的物理资源(CPU/RAM/存储)有限,Kubernetes 非常适合高效的资源管理和应用程序性能。


Discord 横幅

结论

要点总结:

  • Docker 是一种容器技术,可以帮助创建应用程序的隔离环境。

  • Kubernetes 是一个容器编排平台,用于管理多个容器的集群。

  • Docker 可自动构建和部署应用程序,广泛应用于 CI/CD 流程。

  • Kubernetes 在应用程序容器部署完成后开始发挥作用,它负责自动调度和管理已部署的应用程序容器。

关于 Docker 与 Kubernetes 的最终思考:

  • Docker 让开发人员和软件公司能够隔离、打包和部署应用程序并保持一致性,从而简化了他们的工作。

  • Kubernetes 是一款高度灵活的容器工具,能够稳定地交付即使是复杂的应用程序。应用程序运行在由数百或数千台独立服务器组成的集群上。

  • 在 Kubernetes 集群中,您可以使用任何容器运行时,而 Docker 是最知名的容器运行时。Docker 在交付可扩展、可靠且高可用的应用程序方面发挥着至关重要的作用。

  • 在许多情况下,使用这两种技术并非强制性的,多种因素决定了您可以选择其中一种或两种。

文章来源:https://dev.to/refine/kubernetes-vs-docker-2li9