
Docker和Kubernetes是容器化世界中的两项主要技术,但它们是为了同一个目标而竞争吗?并非如此。本文解释了什么是容器化,以及Docker和Kubernetes如何相互补充。此外,我们还解释了容器化和协调技术的好处。
目录
什么是容器化?
什么是Docker?
什么是Kubernetes?
Docker与Kubernetes?应该是Docker加Kubernetes
协调解决方案的好处
Kubernetes是否会放弃Docker?
总结Docker与Kubernetes的区别
什么是容器化?
容器化使开发人员能够将软件代码及其运行所需的组件(例如,框架、库和其他依赖项)打包在单个隔离的容器中。因此,容器内的任何软件或应用程序可以很容易地在不同的基础设施中移动和使用,而不管基础设施的操作系统或环境如何。
容器允许软件代码更加便携(可以很容易地跨平台和基础设施移动)和安全,考虑到它允许开发人员在不同的操作系统上构建和部署一致的应用程序。然而,请记住,并不是所有的软件代码都可以在微服务架构中设计。也就是说,激烈的UI应用虚拟化是在另一层管理程序中用Vagrant和其他方式完成。
在容器之前,开发人员习惯于在一个特定的计算环境中创建代码。当他们希望将其转移到一个新的地方(例如,从Linux到Windows),代码将非常容易出现错误和其他错误。这是容器提供的一个主要问题,因为它们将软件代码从主机操作系统中抽象出来,使其独立,并能够迅速在任何地方运行,而不必担心错误或其他问题。
简而言之,由于有了容器,应用程序可以被封装在独立的环境中,其主要好处是:可扩展性、快速部署和环境之间更紧密的一致性。并非每个人都使用容器,但这些年的数字显示了显著的增长。
"报告发现,全球60%的后端开发人员现在正在使用容器。与2019年第二季度相比,容器的使用平均增加了10个百分点(pp)。"(《云原生开发状况》,2020)。
容器化的概念本身并不是最近才有的。不过,它还是随着2013年Docker作为开源技术的首次发布而产生的,它在容器化市场上仍然占有明显优势,拥有82.39%的份额。事实上,在2013年之前,Linux已经在提供容器技术(Linux Containers或LXC)。不过,Docker还是迅速夺得了第一的宝座,成为默认的容器格式。
什么是Docker?
Docker是一个广为人知的容器化平台,用于开发、运送和运行任何应用程序,作为一个可移植和自给自足的容器。它几乎可以在任何地方运行,从台式机到云环境和数据中心。此外,多年来,Docker开发了许多工具,为与容器化有关的一切提供了一个 "完全装备 "的平台。然而,考虑到该领域的激烈竞争和优质技术的开发,这并不意味着他们所有的工具都是主要的可用解决方案。
其中一个主要工具是Docker引擎,这是一个运行时环境,使开发人员能够在任何开发机器上创建和运行容器。为了运行一个Docker容器,人们可以选择从Docker文件开始,这是一个明确建立运行Docker镜像所需的一切的文件(例如,操作系统的网络规范和文件位置)。反过来,Docker镜像是一个可移植的静态组件,可以在Docker引擎上运行。一旦容器建成并准备好在各地运行,开发者就可以通过容器注册表存储或分享容器镜像。
然而,只是为了澄清一下,不一定需要有Dockerfile来运行容器。相反,开发人员可以首先查找容器注册处(如DockerHub和Azure容器注册处),并从容器注册处拉出现有的图像,这可以节省大量的时间和工作。通常情况下,这些注册表包括公开创建的大量镜像。因此--这是关键的收获--要运行一个Docker容器,人们可以简单地从公共容器注册处拉出一个镜像,或者使用Dockerfile定制镜像。
正如我们可以察觉到的,Docker提供了一个开源的解决方案来打包和分发容器化的应用程序。然而,随着容器数量的增加,管理它们的复杂性也在增加。因此,必须确保几个方面(这属于一些协调任务),即:
- 用户和容器之间的通信
- 同时处理几个用户
- 多平台部署。如何实现多个平台和云环境的同步?
- 众多容器实例的可扩展性。
为了处理这些和其他复杂的问题,Docker开发了Docker Swarm,一种容器协调技术。更准确地说,这(Docker Swarm)是Docker的技术,通常与Kubernetes相比,而不是整个Docker平台本身。事实上,Docker是Kubernetes的默认技术和底层技术,Kubernetes原生使用Docker作为其运行时,并以开发者手动的方式拉取镜像,也就是使用Docker命令。尽管如此,Kubernetes也支持Docker的其他替代品。
什么是Kubernetes?
从上一段你可能已经猜到了,Kubernetes是一种容器协调技术(例如,像OpenShift或ECS),谷歌在2014年推出了它,在Docker发布一年之后。现在,它是由CNCF(云原生计算基金会)控制的。
Kubernetes的开发是为了帮助用户安排、管理、自动部署和扩展容器化应用程序。它是一种处理容器化和各自工作负载的技术,解决了在不同服务器上有效处理大量容器的复杂问题。
在这个意义上,Kubernetes提供了一个开源的API,规范了容器的运行方式和位置。在这项技术中,容器被分组为pod,这是Kubernetes的基本操作单位。一旦分组,容器和pod可以很容易地被扩展到另一个状态,而且开发人员可以控制它们的生命周期。因此,Kubernetes实现了虚拟机(VM)的协调,并允许开发者根据其计算资源和每个容器的要求,安排容器在这些虚拟机上运行。非常简单地说,当开发者需要发布代码时,他们只需指出需要更新哪个集群,平台就会处理连接管理问题。
此外,Kubernetes支持大量的容器化工具,包括Docker,这将我们引向下一个话题。
Docker vs Kubernetes?应该是Docker加Kubernetes
如前所述,如果我们希望比较Docker与Kubernetes,那么更公平的比较应该是Docker Swarm和Kubernetes,它们都是容器编排技术。说实话,Docker可能在容器化方面的市场份额领先,但如果我们看一下协调技术,它并不那么成功。Kubernetes的范围更广,是这场竞赛的领导者,在Github上有80.9万颗星,而Docker Swarm只有5.8万颗。

Docker本身和Kubernetes的确是互补的技术。尽管两者有类似的作用,但它们实际上是非常不同的,可以完美地一起工作。现在已经很清楚了,Docker是Kubernetes的主要底层技术之一,而Kubernetes则能够通过控制平面完全管理Docker实例化的容器。
此外,Kubernetes包括许多在处理容器编排时具有优势的功能,如负载平衡、安全、网络、内置隔离机制、自我修复以及在所有运行于已建容器的节点上的扩展能力。
协调解决方案的好处
我们需要了解两者的用处,以充分利用Docker和Kubernetes之间的结合。根据2020年关于"云原生开发状况 "的报告,尽管容器很受欢迎,但实际上并不是每个人都使用协调技术来管理它们,其原因在于并不是每个人都需要它们,特别是在处理小型应用和数量不多且可控的容器时。更准确地说,随着软件需求的增长,所需的应用程序也必须在容器化时进行扩展。因此,要真正从微服务架构中获益,所有的要求都必须到位。否则,容器化不是一种优势,而是成为技术栈中的另一个责任。
因此,使用Kubernetes或类似的工具并不是强制性的;然而,对于那些希望扩展的基础设施,以及必须在分布式系统中处理非常多的容器的基础设施,强烈推荐使用Kubernetes。根据2020年IBM市场发展与洞察报告"企业中的容器--企业快速采用",只有15%的受访者从不使用没有协调解决方案的容器。

此外,根据受访者的说法,这些是使用协调解决方案的首要好处:
- 提供强大的安全性
- 提高生产力
- 最大限度地减少人为错误
- 它易于移植,与供应商无关
- 通过优化资源使用来节约成本
- 通过滚动部署和自动回滚,减少应用程序停机的风险。
Kubernetes是否会取代Docker?
正如在Kubernetes 1.20发布时宣布的那样,"Kubelet中的Docker支持现在已被废弃,并将在未来的版本中删除"。起初,这引起了一些恐慌,因为许多开发人员认为这将是Docker的终结,因此,Docker和Kubernetes的伟大结合也将结束。幸运的是,在2020年12月2日,Kubernetes发布了一篇博文,澄清"这并不像听起来那么戏剧化"。
正如他们解释的那样,在Kubernetes集群内部,有一个名为 "容器运行时间 "的东西,用于拉动和运行容器镜像。Docker是该运行时最受欢迎的选择,问题是它并不是被设计成嵌入Kubernetes内部。容器运行时是为了对人类友好--这使得Docker更加伟大。对于人类来说。- 但不太适合像Kubernetes这样的软件。因此,Kubernetes需要使用Dockershim来获得它真正需要的东西,并且是容器d。这远远不是Kubernetes的理想解决方案,因为这是一个他们需要维护和处理的额外技术。
总之,公告真正说明的是,Dockershim正在从Kubelet中移除,移除对Docker作为容器运行时间的支持。这意味着,由Docker制作的镜像将继续在开发者的Kubernetes集群中工作,像往常一样。
总结一下Docker与Kubernetes的区别
即使它不一定是每个工作负载或应用程序的最佳方法,但容器化的好处已经吸引了许多开发人员和企业的注意。一些最重要的优势包括提高应用程序的质量,提高生产力,减少应用程序的停机时间,以及对变化的快速响应。但是,Docker和Kubernetes如何一起工作,才能最大限度地发挥容器化的作用?
一方面,Docker使开发人员能够通过命令行将他们的应用程序打包成孤立的容器。之后,这些应用程序能够在开发者的IT环境中运行。
另一方面,Kubernetes提供了一个协调解决方案,可以安排和自动化容器化任务,如管理、缩放、部署和网络在整个应用程序的生命周期。
因此,Docker和Kubernetes可以--而且往往应该--相互补充。此外,将这些技术与DevOps实践相结合,可以提供一个微服务架构的基线,允许快速交付以及云原生应用程序的可扩展性。