Docker Compose和Kubernetes有什么区别?


327

在深入研究Docker,Google Cloud和Kubernetes的同时,还没有清楚地了解这三者,在我看来这些产品是重叠的,但它们并不兼容。

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

有人可以对Docker,Docker Compose,Docker Cloud和Kubernetes重叠之处以及其中一个相互依赖的地方进行概括的粗略描述吗?

Answers:


479

码头工人

  • Docker是一种容器技术,可让您对应用程序进行容器化。
  • Docker是使用其他技术的核心。

Docker撰写

  • Docker Compose允许配置和启动多个Docker容器。
  • 当您要启动多个Docker容器并且不想使用单独启动每个Docker容器时,Docker Compose通常用作帮助程序docker run ...
  • Docker Compose用于在同一主机上启动容器。
  • 在构建和运行单个Docker 容器时,使用Docker Compose 代替所有可选参数

码头工人

  • Docker Swarm用于在多个主机上运行和连接容器。
  • Docker Swarm是一个容器集群管理和编排工具。
  • 它管理在多个主机上运行的容器,并执行扩展,在发生崩溃时启动新容器,将容器联网等操作。
  • Docker Swarm是生产中的Docker。它是嵌入在Docker引擎中的本地 Docker 编排工具
  • 名为stack file的Docker Swarm文件与Docker Compose文件非常相似。

Kubernetes

  • Kubernetes是Google开发的容器编排工具
  • Kubernetes的目标与Docker Swarm的目标非常相似。

Docker云

  • 一个付费企业泊坞服务,可让您在云服务器或本地服务器上构建和运行容器。
  • 它提供了一个Web UI和一个中央控制面板来运行和管理容器,同时在用户友好的Web界面中提供了所有Docker功能。

更新:

Docker云“部分”停产

Docker Cloud上提供应用程序,节点和群集集群管理的服务将于[2020年5月21日关闭] ...自动构建和注册表存储服务不会受到影响,并将继续可用


一切都很好,关于“ Docker云,使您可以运行容器..”这最后一点,实际上,您可以在云上运行这些容器怎么办?他们可以提供公共访问的端点吗?本质上是像AWS一样的Docker云,但适用于Docker容器吗?(或者只是一个供发现的容器库)
George Katsanos

2
好的,对不起。我想我还是很困惑。那么这是否意味着docker-compose就像Kubernetes一样,它用于本地编排容器并为本地开发带来更多便利,还是Kubernetes不仅如此?
Vipin Menon

6
进行以下类比是否公平1. docker-compose <> minikube 2. docker-swarm <> kubernetes集群3. docker-cloud <>由GCP,AWS等管理的kubernetes集群
Anoop

1
“ Docker swarm用于在多个主机上运行和连接容器。” :“连接”在这里是什么意思?网络连接?
someone_ smiley

1
@someone_smiley是的。它创建了一个覆盖网络
OneCricketeer

135

除了@yamenk的答案外,我想在这里添加一些细节,这可能有助于人们了解Kubernetes。

简短答案:

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

Docker撰写

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

Compose具有用于管理应用程序整个生命周期的命令:

  • 启动,停止和重建服务
  • 查看正在运行的服务的状态
  • 流运行服务的日志输出
  • 在服务上运行一次性命令

Kubernetes

(摘自Kubernetes简介):Kubernetes是一个容器编排器,例如Docker Swarm,Mesos Marathon,Amazon ECS和Hashicorp Nomad。容器编排器是将主机分组在一起以形成集群的工具,可帮助我们确保应用程序:

  • 是容错的
  • 可以扩展,并按需执行
  • 最佳利用资源
  • 可以自动发现其他应用程序,并彼此通信
  • 可以从外部世界访问
  • 可以更新/回滚而无需停机。

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

  • 12要素应用程序,
  • 自动装箱
  • 自我修复机制,
  • 水平缩放
  • 服务发现和负载平衡,
  • 自动部署和回滚,
  • 蓝绿色部署/ Canary部署
  • 机密和配置管理
  • 存储编排

并且由于容器及其管理周围存在许多不同的事物,因此请留意Cloud Native格局:

此处为互动版本:landscape.cncf.io/

在此处输入图片说明

更新

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

与AWS,Microsoft和开源社区中的其他人合作,我们扩展了Compose规范,以在现有Compose平台之外,还支持Kubernetes和Amazon ECS等云原生平台。此处更多内容:blog / compose-spec.io


这个答案已经过时了。docker.com/blog/...
OneCricketeer

1
感谢@ cricket_007我会密切注意这一点,但是我认为2018年的这篇博文有点...“营销”。现在是2020年,如果您查看Docker ComposeCompose文件版本3参考中的文档,那么Kubernetes毫无意义。
tgogos


1
哦,令人惊讶的是,这里有一个抽象所有kubernetes语法的组合层!谢谢@ cricket_007。
乔治·卡萨诺斯

28

如果您要将具有相同主机的容器联网,请使用docker compose

如果您要跨多个主机联网容器,请使用kubernetes


2
这就是我所期望的答案!即使可能有更多解释,“ tl; dr”部分仍然是重点。没有其他答案可以这么说!
,教父

8

第一个区别是容器引擎和容器协调器之间的区别。

docker 是一个容器引擎,它使您最多可以在PC上本地构建和运行最多一个容器,以进行开发。

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

Kubernetes是一个容器编排平台,它负责运行容器并增强引擎功能,以便可以对容器进行组合和扩展以服务于复杂的应用程序(某种PaaS,由您或云提供商管理)。Kubernetes的主要功能是使用容器使基础架构与应用程序脱钩,并且它还对Docker可以使用rkt或cri-o运行容器的其他引擎开放。

Docker云还是PaaS产品,可让您通过 docker引擎API。

现在,根据您的需求,对基础架构的控制级别和目标受众,您可以使用裸机上的Kubernetes,Azure ACS或Google GKE等。

希望这对您有所帮助:)问候


1
我有些困惑,为什么您通常只在docker上运行一个容器?虽然我认为Docker-compose是更好的解决方案,但没有什么可以阻止您启动没有它的多个容器!
彼得

哦,是的,有时候我会在后台运行一个mysql,然后将httpd和nginx作为独立的容器启动...但是当我希望整个过程自动化时,我肯定会构建一个docker-compose.yml来指定依赖项,网络等。 ..
Francesco Gualazzi

6

Docker撰写尚未投入生产。它非常适合PoC或开发环境,但是缺少很多功能,这些功能或多或少会严重影响生产。Swarm更适合生产,但我绝不会在新环境中投资Swarm。Kubernetes赢得了编排大战,这体现在Kubernetes包含在Docker Desktop中,并且所有主要的云提供商都提供了它。Kubernetes的功能更加强大,并且拥有更多的社区和公司支持。

我建议您深入研究Pluralsight,Linux Academy等提供的一些Kubernetes教程,并扩展一个集群以在您选择的云平台(EKS,AKS,GKE等)中使用。如果您尝试使用裸机,请看一下OpenShift,但要认识到您在这种设置中失去了一些Kubernetes的魔力。


同意k8s已“赢得”(目前)。但是Mesos曾经被称为生产集群黄金标准。DC / OS在推出企业功能方面做得很好,但是现在您甚至可以在Mesos环境中运行多个k8s集群,并从一个与供应商无关的平台上访问它们,那么哪个更好呢?
OneCricketeer

3

Docker撰写:

docker-compose.yml文件中,每个条目都可以选择docker-compose构建映像。每个条目可以代表我们要构建的单个容器,每个条目定义网络要求或端口。

Kubernetes:

Kubernetes期望所有映像都已构建,并且我们要创建的每个对象只有一个配置文件,我们必须手动设置所有网络。

因此,我们确保将映像托管在Docker Hub上,创建一个配置文件以创建容器,并创建一个配置文件以建立网络。


1

Docker-Compose是一个部署文件,使用其环境预定义了一个或多个容器,例如卷,网络,运行命令等。

另一方面,Kubernetes是一个通过Docker容器和其他微服务编排并使其在多个节点之间可扩展且可靠的系统


1

Docker撰写: 无需任何yaml文件即可直接运行docker容器。但是借助Docker撰写工具,可以在名为docker-compose.yml文件的文件中定义容器属性。请找到以下示例yml文件以了解更多详细信息。

version: "3.7"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - my_config
      - my_other_config
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

图像名称,副本数量等。可以通过yml文件进行配置。

Kubernetes: 这是在由Google构建的Docker之上运行的容器管理平台。Docker swam是由docker本身构建的另一个容器管理平台。Kubernetes还提供了将与Pod相关的配置(与Docker中的容器相对应)保存在yaml文件中的功能,例如docker compose。示例yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: rss-site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
    - name: rss-reader
      image: nickchase/rss-php-nginx:v1
      ports:
        - containerPort: 88

在此还可以提供图像,要打开的端口以及Pod到主机端口的映射等。像docker compose一样,kubectl apply -f是运行此文件的命令。


那么,有什么区别呢?=)
教父

docker compose是一个用于运行docker映像的控制台,而kubernetes并不是一个容器编排系统。因此这两个无法比较且完全不同。但是kubernetes拥有kubectl,它也是一个控制台,类似于
docker
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.