布雷特费舍尔

作为码头船长和Udemy教练20万Docker和Kubernetes学生, Kubernetes vs. Docker的话题经常出现。和我一样,科技界也迷恋容器工具,Docker和Kubernetes是这方面的两个顶级品牌。

Docker vs Kubernetes.

相对这不是正确的问题,因为使用这些工具并不是一个非此即彼的等式。

考虑以下定义:

  1. Docker引擎是一个“容器运行时”。它知道如何在单个操作系统主机上运行和管理容器。您必须分别控制每个主机。
  2. Kubernetes (K8s)是一个开源的“容器编配平台”(AKA orchestrator)。它知道如何跨许多操作系统主机管理容器,而这些操作系统主机又运行它们自己的容器集装箱运行时
Docker Mastery:用Kubernetes +来自Docker Captain的Swarm

2021年4月最后更新

畅销书
  • 177课
  • 各级
4.6 (47024)

使用Devops,使用Docker,Kubernetes,Compose,Swarm和Registry上的最佳Mega课程进行测试By Bret Fisher,Docker Captain计划

探索课程

在这些陈述中有很多东西可以解压缩。在这篇文章中,我将解决以下问题:

让我们挖!

码头工人的起源

2013年,DOTCLOUD首席执行官的所罗门·················赫斯宣布了Docker开源项目。当2014年达到1.0时,我试一试。这是“首先是部署”。

我越了解其特征,我越想在任何地方使用Docker。

集装箱应用程序的概念 - 使用容器在单个服务器上彼此隔离许多应用程序 - 已经存在数十年。然而,没有一个易于使用的工具,专注于完整的应用程序生命周期,直到码头。

Docker的开发团队将复杂的工具包装在一个命令行界面(CLI)中,普通人都能理解。

Docker Engine和Docker有什么关系?

Docker发布后不久,两位创始人就抛弃了Dotcloud,创建了Docker Inc.。他们现在以Docker的名义生产一系列产品。

在这篇文章中,我们将专注于最初的项目,现在被称为Docker引擎。这就是人们在说“Docker”时通常谈论的内容,这也是我在本文中默认提到的内容。

请注意,Docker也做码头工人的桌面是一捆Windows和Mac的产品。Docker Desktop是在本地计算机上运行Docker和Kubernetes的最简单方法,用于开发和测试服务器应用程序。数百万人每月使用它,我推荐它。

Docker的三个关键创新

Docker发明了三个进程,用于在单个命令行和服务器守护程序中轻松无法轻松完成的集装箱应用程序:

1. Easy App Packaging

Docker借助您的应用程序和所有软件依赖项 - 减去OS内核和硬件驱动程序 - 并将其捆绑在一组Tarball(类似于ZIP文件)中。Docker确保这些Tarball在他们运行的每台机器上都是相同的加密散列

应用程序tarball和元数据一起被称为容器映像。现在,这被认为是打包服务器应用程序的现代方式。与以前不包含应用程序依赖性的先前包装系统(如apt,yum,msi,npm,maven等)相比,容器图像标准是一个重大改进。

2.简单的应用程序运行

Docker在一个隔离的文件系统中运行每个容器。每个容器都有自己的网络和资源限制,不能看到主机操作系统上的任何其他内容。它可以通过一个简单的命令完成这一任务。

这种自我容器的方法可以让CLI友好和易于使用的初学者使用。这是秘密酱,使Docker互联网与开发商着名。

3.简单的应用分布

Docker创建了“容器图像注册表”的想法,允许您在中央HTTP / S服务器中存储图像,然后按照GIT提交将其轻松推送/拉动它们。最受欢迎的注册表是Docker Hub,您可以在那里找到许多开源项目。

为应用图像内置推/拉功能的想法立即获得了成功,现在到处都是容器图像注册表。它就像是Apple/谷歌App Store的服务器版本。

Docker最初的三项创新帮助它成为多年来最受欢迎的平台堆栈溢出开发者调查因此,Docker引擎为人类提供了这种伟大,易于使用的命令行,以做与集装箱应用相关的许多事情,包括:

如果Docker太棒了,我们为什么需要Kubernetes?

你会发现,一旦你开始使用容器,你会想要在任何地方使用它们——一旦你有了多个服务器,你会开始希望有一种更简单的方式为你的应用运行多个相关容器。

使用Docker,您仍然需要在服务器之间手动设置网络,包括安全策略,DNS,存储,负载均衡器,备份,监控等。当谈到几十个相关的容器时,这会产生多大的工作(如果不是更多),就像我们在集装箱中的应用程序之前一样。

这个多服务器问题是Kubernetes创始人想要解决的问题。他们知道,为了使生产容器系统变得简单,因为Docker是单机,他们需要解决底层硬件和网络资源。Kubernetes是一个开源的多服务器集群系统。它编排了现实世界中托管数十个、数百个甚至数千个应用程序的解决方案所需的所有工具。可以把它看作是一种抽象,隐藏了进程的所有必要部分,以运行多个容器化的应用程序。

库伯内特是一个团体服务器of of of docker是什么服务器。它是一组程序和api,可以从一个CLI控制多个Docker引擎。

Kubernetes使用“期望状态”的范式编排容器。你给它你想要的结果(比如“运行5个Apache web服务器”),它就会找出跨Kubernetes集群实现这一目标的最佳方法。然后确保这些容器始终在运行。如果一个失败,它将重新创建以确保所需的状态与实际状态匹配。

Kubernetes有一个默认服务的“控制平面”,这些服务本身可以作为Docker容器运行。它们通过代理控制一台或多台机器(Linux和Windows操作系统)。

Kubernetes的主要工作是告诉Docker该做什么,但它现在提供了越来越多的相关职责。其他内置功能包括容器运行状况检查,自动替换失败的应用程序,自动化Web代理配置,管理网络安全策略,甚至自动配置外部存储。

你还想要更多吗?

Kubernetes中最重要的功能之一是其自定义资源定义(CRD)的形式可扩展。CRDs允许您添加新的对象类型和功能,从而成为一流的Kubernetes特性。CRDs将Kubernetes从一个容器管理器变成了一个全能的自动化引擎,可以管理与整个应用生命周期相关的所有事情。

有些CRD插件非常先进,以至于社区想出了一个新词来描述它们:Kubernetes运营商。

需要配置,管理和升级多节点Postgres SQL群集?运营商能做到这一点。需要应用程序的备份解决方案和集群灾难恢复工具?Kubernetes运营商也能做到吗

使用与kubernetes的docker

现在您已经知道了这些工具的来源和它们解决的问题,问题是:您应该将它们一起使用吗?

是的。目前。

如果您只需要在单台机器上控制容器,并且您是Containers的新功能,Docker是最佳选择。保持简单才能开始,稍后可以长大到Orchestrator。如果您需要为您的应用运行多个容器,可能是时候考虑Kubernetes了。

你应该在Docker上安装Kubernetes吗?

回到我最初的定义,记得Kubernetes需要集装箱运行时代表其管理容器。在安装Kubernetes之前,您必须决定要使用哪个运行时。

对于几乎每个Sysadmin构建集群,码头以来一直是Kubernetes开头以来的默认值。Kubernetes已经有各种其他运行时选择,但Docker倾向于将最广泛的功能支持作为容器运行时,尤其是在Windows服务器上。

但事实上,您通常不需要担心如何选择容器运行时。Kubernetes是独一无二的,它是一个选择的生态系统,而不是单一下载。

以下是与典型的开源项目相比,将Kubernetes设置了两个重要的区别:

  1. Kubernetes是一组组合在一起形成控制平面的选择。有些部分是标准的,如Kubernetes API、Scheduler和Kubelet代理。其他部分没有默认设置,需要从许多行业选项中进行选择,比如容器运行时、网络和进入代理。
  2. 我的建议是选择Kubernetes100.分布库伯内特的控制平面,理想地选择一个与您现有的供应商和需求相一致的。每个发行版都将这些选择捆绑在一起,并决定对客户来说什么是最好的。它们通常提供更愉快的开箱即用体验,并提供额外的工具来帮助部署、升级等。这些分布通常远远超过GitHub上的Vanilla上游Kubernetes,我建议您先尝试一下。

大多数专业人士选择Linux发行版(Ubuntu, CentOS, RHEL等)来运行Linux内核。同样,很多人选择Kubernetes发行版来运行Kubernetes。Kubernetes的控制平面和插件就像一个Linux发行版;我们中只有少数人能够在不需要发行版的情况下,手动地将所有的部分组合在一起,来制作一个完整、稳定和安全的解决方案。大多数公司都不需要那么复杂。

每个主要的公共云服务都提供其分发 - AS-AS-Service,如AWS EKS,Azure Aks,DigitaloCean Kubernetes等。有特定于供应商特定(VMware,Redhat,NetApp)和供应商 - 中立选项(牧场主,Docker Enterprise,k3s)。这些Kubernetes许多分布,尤其是云分布,为您决定容器运行时。

使用没有Docker的Kubernetes

一旦您选择运行Kubernetes,您就会很少触摸Contain运行时的CLI。它成为一个由Kubernetes管理的实用程序API。Docker具有广泛的功能,kubernetes永远不会使用,许多人正在寻找一个较小的目的拟合容器运行时,这并不充满了Docker的所有“用户聚焦”功能。

Kubernetes想要一个最小的容器管理API来做这些繁重的工作。Kubernetes甚至创建API标准称为容器运行时接口(CRI),以鼓励更多的运行时,除了Docker。随着替代方案的成熟,我们已经看到Docker作为CRI在Kubernetes集群中的使用随着其他运行时的出现而减少。在2019年,Sysdig使用报告显示79%的集装箱是由Docker引擎运行的。

还记得containerd吗?Docker的子进程负责与Linux内核进行通信的繁重工作。containerd现在是第二受欢迎的Kubernetes运行时。作为Docker Engine的最小替代方案,它非常受欢迎。云服务提供商经常使用它作为默认的,因为它占地面积小,设计纯粹开源和监督。它的目标不是直接对用户友好,而是充当容器和Kubernetes之类工具之间的中间件。

还有CRI-O,红帽公司专门为Kubernetes设计的运行时。这是使用Red Hat OpenShift发行版Kubernetes时的默认设置。

顺便说一句:不要将服务器集群CRIs的这种变化与开发人员和系统管理员使用本地桌面的情况混淆。因为容器映像是一种标准,所以您可以根据需要使用不同的工具来运行它们,而不必担心兼容性。

由于Docker的人性化方式,我仍然看到它被我遇到的每个人用作在本地运行容器的标准方式(主要是通过Docker Desktop和Docker Compose)。

你甚至需要Kubernetes吗?

你会听到人们(尤其是我)谈论Kubernetes有多复杂。Kubernetes的两个最大的缺点是学习和管理Kubernetes集群的复杂性以及它所需的硬件资源的额外开销。这些产生了很大的不同,这有时它有时会使我的学生和客户能够查看替代方法。

事实上算子为算子写了Kubernetes。从友好的开发人员的Docker工具跳跃可能跳转到淫乱和不可分割的Kubernetes世界项目试图解决困难的部分,比如k3里约热内卢,但是如果您自己管理一个自定义集群,这就不容易了。Kubernetes可以支持大型和复杂的需求。这也意味着,如果您只需要几十个容器和3到5台服务器,那么这很可能是不必要的。

我经常与工程团队一起工作,负责创建他们的基础设施。我们通常会花很多时间来考虑我们是否需要Kubernetes。Kubernetes无疑是大多数圆圈中最受欢迎的容器多服务器乐器,但有值得注意的替代方案,例如:

就我个人而言,我是Docker Swarm和HashiCorp的粉丝。

无服务器怎么样?

如果你的团队已经走了这条路,那就太棒了。在最无服务器基础架构的引擎盖下,它在容器中运行了函数。

无操作系统将容器和协调员视为别人将管理的较低级别抽象。

您可以享受在那些容器和协作者的顶部运行功能,管理所有开销,以保存您的团队时间控制服务器。抽象这样的抽象删除了基础设施管道,很可能是我们许多人的未来。

记住,工具并不是最终目标。

无论您选择Docker、Kubernetes还是无服务器,请记住,该工具并不是最终目标。始终牢记您业务的DevOps目标,不要仅仅为了使用炫酷的新技术而被高级工具的“闪亮”吸引力所分心。

集装箱实施项目指标通常专注于增加速度,同时也增加了可靠性。

在实现这些工具时,我倾向于关注的目标包括:

  1. 敏捷性增加- 从经营理念到客户交付的时间
  2. 减少部署时间-从提交到服务器部署的时间
  3. 增加弹性- 您有失败的频率,但更重要的是,它们有多迅速修复

容器及其工具可以改善所有这些因素。尽管如此,他们还会带来自己的“新问题”和额外的工作量。选择工具时会意识到权衡。

祝你在集装箱之旅中祝你好运,愿你的所有部署都成功!

页面最后更新:1月2021年

Docker的顶级课程

Docker Mastery:用Kubernetes +来自Docker Captain的Swarm
Bret Fisher, Docker Captain Program
4.6 (47024)
畅销书
Docker和Kubernetes:完整的指南
Stephen主梁
4.6 (37908)
绝对初学者的Docker - 手on - devops
Mumshad Mannambeth,Kodekloud培训
4.6 (22715)
畅销书
Docker的Java开发人员
约翰汤普森
4.3 (2,437)
初学者的码头
Bogdan Stashchuk
4.7 (227)
Docker,从零到英雄:成为Devops Docker Master
Ricardo Andre Gonzalez Gomez
4.5 (889)
登录Kubernetes与EFK堆栈|的完整指南
娜娜·雅娜西娅,Docker船长项目
4.8 (202)
畅销书
Python开发人员的Docker Essentials
克里斯·凯尔默
4.6 (135)
终极Docker快速入门到高级
经线9培训
4.5 (83)
畅销书

更多码头课程

Docker学生也在学习

让你的团队。领导行业。

通过Udemy为Business获取组织的在线课程和数字学习工具库的订阅。

请求演示

Bret Fisher的课程

Docker Mastery:用Kubernetes +来自Docker Captain的Swarm
Bret Fisher, Docker Captain Program
4.6 (47024)
畅销书
Kubernetes Mastery: practice Lessons From A Docker Captain
Bret Fisher, Docker Captain Program
4.7 (2145)
Docker for Node.js Projects From a Docker Captain
Bret Fisher, Docker Captain Program
4.6 (1,019)
Docker Swarm掌握:Devops风格群集编排
Bret Fisher, Docker Captain Program
4.8 (1257)
畅销书

Bret Fisher的课程