Docker Compose和Kubernetes有什么区别?

448

当了解Docker、Google Cloud和Kubernetes时,我发现这些产品似乎有重叠之处,但它们又不兼容。

例如,docker-compose.yml文件需要重新编写以便将应用程序部署到Kubernetes上。

能否提供一个高层次、粗略的描述,阐述Docker、Docker Compose、Docker Cloud和Kubernetes之间的重叠点以及它们彼此之间的依赖关系?

5个回答

836

容器:

  • 容器是其他列在这里的技术的核心

Docker:

  • Docker是一种流行的实现技术,允许将应用程序捆绑到容器中。
  • docker是一个命令行工具,用于管理图像、容器、卷和网络

Docker Compose

  • Docker Compose是docker cli的声明性版本
  • 它可以启动一个或多个容器
  • 它可以创建一个或多个网络并将容器连接到它们
  • 它可以创建一个或多个卷并配置容器以挂载它们
  • 所有这些都是为了在单个主机上使用

Docker Classic Swarm

  • Docker Swarm已被Docker公司放弃,不再得到积极维护和支持。
  • Docker Swarm用于在多个主机上运行和连接容器。
  • Docker Swarm是一个容器集群管理和编排工具。
  • 它管理在多个主机上运行的容器,并执行诸如扩展、在一个容器崩溃时启动新容器、网络容器等操作...
  • Docker Swarm文件名为堆栈文件,与Docker Compose文件非常相似。
  • Kubernetes和Compose之间唯一的比较是在最琐碎和不重要的层面上:它们都可以运行容器,但这并不能帮助人们理解这两个工具及其有用性。它们各自适用于不同的场景。

Kubernetes

  • Kubernetes (K8S) 是一款由 Google 最初创建的分布式容器编排工具
  • 它于2014年开源,并在接下来的一年移交给了云原生计算基金会(CNCF)
  • CNCF 是一个行业组织,拥有数百个成员,来自大多数大型云、软件和硬件公司
  • 截至2021年底,有近千个与K8S相关的项目,分为约20类,总共获得了超过210亿美元的资金
  • Kubernetes(2021年)是全球最受欢迎的分布式系统编排器,采用率达到88%
  • 由于其几乎普及,K8S已成为2021年最流行的创新系统开发平台
  • Kubernetes 与 Docker Swarm 相竞争,但比 Docker Swarm 更强大,因此成为了流行的选择。

10
好的,抱歉。我还是有些困惑。这是否意味着docker-compose和Kubernetes类似,用于在本地编排容器,并更多地便于本地开发,或者说Kubernetes远不止于此? - Vipin Menon
2
@VipinMenon Kubernetes是Docker Swarm的竞争对手(或多或少)。它适用于多台机器,并且比Docker Swarm更复杂/功能更强大,至少根据我所见。因此,它不仅仅是本地容器管理。 - mbrig
29
以下类比是否公平:
  1. docker-compose <> minikube
  2. docker-swarm <> kubernetes 集群
  3. docker-cloud <> GCP、AWS 等管理的 Kubernetes 集群
是的,这些类比是合理的。
- Anoop
2
Docker Swarm 用于在多个主机上运行和连接容器。这里的“连接”是指网络连接吗? - someone_ smiley
3
是的,它创建了一个“叠加网络”。 - OneCricketeer
显示剩余4条评论

234

除了@yamenk的回答,我想在这里补充一些细节,这些细节可能会帮助人们更好地理解Kubernetes。

简短回答:

  • docker-compose: 是一个工具,它接受一个描述你的多容器应用程序的YAML文件,并帮助你创建、启动/停止、删除所有这些容器,而不需要为每个容器输入多个docker...命令。
  • Kubernetes: 是一个用于管理容器化工作负载和服务的平台,它促进了声明性配置和自动化。 什么是 Kubernetes? 继续阅读...

Docker Compose

(来自文档): Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件配置应用程序的服务。然后,使用单个命令,您可以从配置中创建并启动所有服务。 Compose具有管理应用程序整个生命周期的命令:

  • 开始、停止和重建服务
  • 查看正在运行的服务的状态
  • 流式传输运行服务的日志输出
  • 在服务上运行一次性命令

Kubernetes

(来自《Kubernetes入门》):Kubernetes是一款容器编排工具,类似于Docker Swarm、Mesos Marathon、Amazon ECS和Hashicorp Nomad。容器编排工具可以将主机组合成集群,并帮助我们确保应用程序:

  • 容错性强,
  • 可以按需扩展并实现自动化,
  • 能够充分利用资源,
  • 可以自动发现其他应用程序并进行通信,
  • 可从外部访问,
  • 可以在没有任何停机时间的情况下更新/回滚。

许多人认为学习Kubernetes很难,这是因为它解决了一系列问题,而人们尝试在不知道所有先决条件的情况下理解它,这使得它变得复杂。通过阅读以下概念/术语的内容,开始将谜题的碎片拼凑在一起,这个过程将帮助您理解Kubernetes试图解决的问题类型:

  • 12-Factor应用程序,
  • 自动装箱,
  • 自我修复机制,
  • 水平扩展,
  • 服务发现和负载平衡,
  • 自动化部署和回滚,
  • 蓝绿部署/金丝雀部署,
  • Secrets和配置管理,
  • 存储编排。

由于容器及其管理周围有许多不同的事物,请密切关注云原生领域:

交互式版本请参见:landscape.cncf.io/

enter image description here

更新

2020年5月:Docker Compose规范现已成为开放标准

与AWS、Microsoft和其他开源社区合作,我们扩展了Compose规范以支持云本地平台,如Kubernetes和Amazon ECS,除了现有的Compose平台。详情请参见:blog / compose-spec.io


3
这个答案已经过时了。https://www.docker.com/blog/simplifying-kubernetes-with-docker-compose-and-friends/ - OneCricketeer
2
谢谢@cricket_007,我会关注这个问题,但我认为2018年的这篇博客有点... "营销"。现在是2020年,如果您查看Docker ComposeCompose文件版本3参考的文档,就不会涉及到Kubernetes。 - tgogos
1
那么?https://github.com/docker/compose-on-kubernetes docker stack deploy --orchestrator=kubernetes ... https://docs.docker.com/engine/reference/commandline/stack_deploy/ - OneCricketeer
2
哦,太棒了,有一个组合层可以抽象出所有的Kubernetes语法!感谢@cricket_007。 - George Katsanos
3
个人而言,当有人问关于像 Kubernetes 这样的技术的基本问题时,第一件事就是把 CNCF 景观扔给他们,认为 500 个从未听说过的应用程序的缩略图会让任何事情更加清晰,我感到非常不知所措。 - Ryan McGrath

161

如果你需要在同一主机内对容器进行网络连接,请选择Docker Compose

如果你需要在多个主机之间对容器进行网络连接,请选择Kubernetes


28
这正是我期待的回答类型!尽管它可能需要更多的解释,“tl;dr” 部分确实是重点。其他回答都没有表达出这一点! - The Godfather
在Kubernetes中,绑定容器(如sidecar、ambassador或adaptor等多容器pod策略)或pod(节点选择器、节点名称、pod亲和性等)有许多概念。但除非我漏掉了什么,否则我对上述答案并不十分满意。 - Abhishek
@Abihishek,我投票支持你。那么你的意思是Kubernetes中的节点等同于云服务器、PC或笔记本电脑上的主机吗? - Denis Turgenev
你肯定不想仅使用Kubernetes来管理多个主机。Kubernetes提供了许多其他功能。 - Saiful Islam
这里还有一个不错的比较:https://www.baeldung.com/ops/docker-compose-vs-kubernetes - Eugen Konkov

16

首先,区分容器引擎和容器编排工具。

Docker 是一种容器引擎,通常仅用于在本地PC上为开发目的构建和运行不超过一个容器。

Docker-compose 是 Docker 实用程序,可运行多个容器,并通过 docker 引擎功能共享卷和网络,可以本地运行以模拟服务组合,也可以在集群上远程运行。

Kubernetes 是一种容器编排平台,它负责运行容器并增强引擎功能,使容器可以组合和扩展以提供复杂的应用程序(类似 PaaS,由您或云提供商管理)。 Kubernetes 的主要功能是使用容器将基础设施与应用程序解耦,并且它也对 Docker 之外的其他引擎开放,例如可以使用 rkt 或 cri-o 运行容器。

Docker Cloud 也是一种 PaaS 提供,可通过 Docker 引擎 API 运行和编排容器。

现在根据您的需求,对基础设施的控制级别和目标受众,可以使用裸金属上的 Kubernetes,还是 Azure ACS 或 Google GKE 等...

希望这有所帮助 :) 敬礼


2
我有点困惑,为什么你通常只在Docker上运行一个容器?虽然我认为Docker-compose是更好的解决方案,但没有任何阻止你在没有它的情况下启动多个容器! - Peter
2
哦,有时我会在后台运行MySQL,然后启动独立容器的httpd和nginx...但是当我想要整个过程自动化时,我一定会构建一个docker-compose.yml来指定依赖项、网络等。 - Francesco Gualazzi

7
Docker Compose并不是一个适合生产环境的工具。它非常适用于PoC或开发环境,但缺乏许多对于严肃的生产使用而言更或多或少是基本要求的功能。Swarm更适合生产环境,但在全新场景下我不会投资Swarm。Kubernetes赢得了编排战争,这可以从其被包含在Docker Desktop中以及所有主要云提供商均提供它来证明。Kubernetes更有能力,并拥有更广泛的社区和公司支持。
我建议您深入研究Pluralsight、Linux Academy等网站上可用的Kubernetes教程,并在您选择的云平台(EKS、AKS、GKE等)上启动一个集群进行尝试。如果您想在裸机上启动,请查看OpenShift,但请认识到,在此设置中您会失去一些Kubernetes的魔力。

虽然 k8s 目前已经“胜出”,但 Mesos 曾被称为生产集群的黄金标准。DC/OS 在推出企业级功能方面做得很好,但现在你甚至可以在 Mesos 环境中运行多个 k8s 集群,并从一个单一的供应商中立平台访问它们,那到底哪个更好呢? - OneCricketeer
1
来自未来的一则快速通知:现在是2021年,K8S不再是“暂时”的胜利者,它已经彻底胜利了。K8S是唯一的热门选择,很快将像虚拟机一样无处不在。Swarm已经死亡,被其所有者抛弃。Docker-compose仍然被开发人员用于他们的桌面和小型原型,但实际上这里的所有答案都是错误的,compose根本不涉及编排,因此不应与K8S进行比较。 - Software Engineer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接