我一直在重读Docker文档,试图理解Docker和完整VM之间的区别。它是如何设法提供一个完整的文件系统、隔离的网络环境等而不那么沉重的?

为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?


当前回答

有三种不同的设置提供了运行应用程序的堆栈(这将帮助我们认识到容器是什么,以及是什么使它比其他解决方案更强大):

1) Traditional Servers(bare metal)
2) Virtual machines (VMs)
3) Containers

1) 传统的服务器堆栈由运行操作系统和应用程序的物理服务器组成。

优势:

原始资源的利用隔离

缺点:

部署时间非常慢昂贵的浪费的资源难以扩展难以迁移复杂的配置

2) VM堆栈由运行操作系统的物理服务器和管理虚拟机、共享资源和网络接口的管理程序组成。每个Vm运行一个客户操作系统、一个应用程序或一组应用程序。

优势:

善用资源易于扩展易于备份和迁移成本效益灵活性

缺点:

资源分配有问题供应商锁定复杂的配置

3) 容器设置与其他堆栈的主要区别是基于容器的虚拟化使用主机操作系统的内核来管理多个孤立的来宾实例。这些来宾实例称为容器。主机可以是物理服务器或VM。

优势:

隔离轻量的资源有效易于迁移安全低开销镜像生产和开发环境

缺点:

相同的体系结构资源密集型应用网络和安全问题。

通过将容器设置与之前的设置进行比较,我们可以得出结论,容器化是迄今为止我们所知的最快、最有效的资源和最安全的设置。容器是运行应用程序的独立实例。Docker以某种方式旋转容器,层使用默认存储驱动程序(Overlay驱动程序)获得运行时内存,这些驱动程序在几秒钟内运行,一旦我们提交到容器中,就会在其上创建写时复制层,从而为容器的执行提供动力。如果是VM,则需要大约一分钟的时间将所有内容加载到虚拟化环境中。这些轻量级实例可以很容易地替换、重建和移动。这使我们能够镜像生产和开发环境,并在CI/CD过程中提供了巨大的帮助。容器所能提供的优势是如此引人注目,它们肯定会继续存在。

其他回答

在我看来,这取决于你的应用程序的需求,为什么决定部署到Docker,因为Docker根据其功能将应用程序分解为小部分,这变得有效,因为当一个应用程序/功能出现错误时,它对其他应用程序没有影响,与使用完整的vm相比,它的配置会更慢、更复杂,但在某些方面比码头工人更安全

好答案。为了获得容器与VM的图像表示,请查看下面的一个。

来源

容器将库和软件包与系统隔离,以便您可以安装相同软件和库的不同版本而不发生冲突。它使用最小的存储空间和内存,使用相同的基本操作系统内核和可用的库几乎没有开销,如果可能的话,差异很小。您可以直接或间接地将硬件暴露给容器,以便可以使用加速(如gpu)进行计算。

在实践中,您可以使用预制容器的docker。您可以安装它们并在一条线上运行它们。安装tensorflow gpu和docker run-it tensorflow gpu一样简单。虽然我没有偶然发现许多lxd(lxc容器)的预制容器,但我发现它们更容易定制,更稳定和性能更好。

容器和VM都可以用来分配负载。但由于容器几乎没有开销,因此容器管理软件专注于创建容器集群,以便您轻松地将它们(从而将负载)分配给金属机器。

真实生活示例:

假设您需要50多种类型的计算环境和50种类型的服务,如mysql、网络托管和基于云的服务(如jenkins和对象存储),并且您有50多种不同的裸机服务器。这是一个典型的学院环境。您需要高效地使用资源,并且需要高可用性。当一台服务器停机时,用户应该不会遇到任何问题。为了解决这个问题,您所做的基本上是在所有服务器上安装所有类型的容器。并将负载分配给所有金属机器。当一种类型的容器需要更多时,可以在一台或多台裸机上自动生成更多容器。因此,许多不同的用户可以连续灵活地使用不同的服务和环境。

在该设置中,假设有100名学生同时使用该系统。其中95人使用服务器进行基本服务,如检查GPA、课程、图书馆数据库等,但其中5人正在进行5种不同类型的工程模拟。您将看到49台裸机服务器完全专用于工程仿真,每台服务器都有5种不同类型的计算容器,每种计算容器都与之相匹配,但与20%的硬件资源使用相平衡。当你为基本任务增加2500名学生时,这将使用所有裸机的5%。其余部分将用于计算。

因此,提供这种灵活性优势的容器最重要的区别特征是:

准备好部署预制容器,几乎没有开销,可快速繁殖具有实时可调整配额

使用.cpu_allowencess、.ram_allowances或直接cgroup。Kubernetes为您提供所有这些服务。在摆弄了docker和lxd之后,你可能想看看它。

对于虚拟机,我们有一台服务器,在该服务器上有一个主机操作系统,然后我们有一个管理程序。然后在该虚拟机管理程序之上运行,我们在该服务器上有任意数量的来宾操作系统,其中包含应用程序及其从属二进制文件和库。它带来了一个完整的客户操作系统,非常重量级。此外,您可以在每个物理机器上实际投入多少也是有限制的。

另一方面,Docker容器略有不同。我们有服务器。我们有主机操作系统。但在本例中,我们使用的是Docker引擎,而不是管理程序。在这种情况下,我们并没有带来一个完整的客户操作系统。我们带来了一个非常薄的操作系统层,容器可以与主机操作系统进行对话,以获得那里的内核功能。这使得我们可以拥有一个非常轻的容器。

它所包含的只有应用程序代码以及所需的任何二进制文件和库。如果您希望这些二进制文件和库也可以在不同的容器中共享。这使我们能够做的事情有很多。它们的启动时间要快得多。你不能像那样在几秒钟内建立一个虚拟机。同样地,也要尽快地把它们取下来。。所以我们可以很快地放大和缩小,稍后我们将对此进行研究。

每个容器都认为它在自己的操作系统副本上运行。它有自己的文件系统,自己的注册表等等,这是一种谎言。它实际上是虚拟化的。

关于:-

“为什么将软件部署到docker映像比简单部署到一致的生产环境?"

大多数软件都部署到许多环境中,通常至少部署以下三种环境:

个人开发者PC共享开发人员环境单个测试仪PC共享测试环境QA环境UAT环境负载/性能测试实时登台生产档案文件

还需要考虑以下因素:

根据工作的性质,开发人员,甚至测试人员,都将拥有微妙的或完全不同的PC配置开发人员通常可以在公司或企业标准化规则无法控制的PC上进行开发(例如,在自己的机器上开发的自由职业者(通常是远程开发的),或未“受雇”或“签约”以某种方式配置其PC的开源项目的贡献者)某些环境将由负载平衡配置中的固定数量的多台计算机组成许多生产环境将根据流量级别动态(或“弹性”)创建和销毁基于云的服务器

正如你所看到的,一个组织的服务器总数很少是一位数,通常是三位数,而且很容易更高。

这一切都意味着,仅仅因为巨大的容量(即使是在绿地场景中),首先创建一致的环境就已经足够困难了,但鉴于服务器数量众多、新服务器的添加(动态或手动)、o/s供应商、防病毒供应商、浏览器供应商等的自动更新,由开发人员或服务器技术人员执行的手动软件安装或配置更改等。让我重复一遍-保持环境一致几乎是不可能的(没有双关语)(好吧,对于纯粹主义者来说,这是可以做到的,但这需要大量的时间、精力和纪律,这正是为什么VM和容器(例如Docker)最初被设计出来的原因)。

因此,请更像这样思考您的问题:“鉴于保持所有环境一致性的极端困难,即使考虑到学习曲线,将软件部署到docker映像中是否更容易?”。我想你会发现答案总是“是”——但只有一种方法可以找到,在Stack Overflow上发布这个新问题。