我一直在重读Docker文档,试图理解Docker和完整VM之间的区别。它是如何设法提供一个完整的文件系统、隔离的网络环境等而不那么沉重的?
为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?
我一直在重读Docker文档,试图理解Docker和完整VM之间的区别。它是如何设法提供一个完整的文件系统、隔离的网络环境等而不那么沉重的?
为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?
当前回答
Docker(基本上是容器)支持OS虚拟化,即您的应用程序感觉它有一个完整的OS实例,而VM支持硬件虚拟化。你觉得它是一台物理机器,你可以在其中启动任何操作系统。
在Docker中,运行的容器共享主机OS内核,而在VM中,它们有自己的OS文件。当您将应用程序部署到各种服务环境(如“测试”或“生产”)时,开发应用程序的环境(操作系统)将是相同的。
例如,如果您开发了一个运行在端口4000上的web服务器,当您将其部署到“测试”环境时,该端口已经被其他程序使用,因此它停止工作。在容器中有层;您对操作系统所做的所有更改都将保存在一个或多个层中,这些层将是映像的一部分,因此无论映像到哪里,依赖项都将存在。
在下面所示的示例中,主机有三个VM。为了使VM中的应用程序完全隔离,它们每个都有自己的OS文件、库和应用程序代码副本,以及OS的完整内存实例。而下图显示了与容器相同的场景。在这里,容器只需共享主机操作系统,包括内核和库,因此它们不需要启动OS、加载库或为这些文件支付专用内存成本。它们所占用的唯一增量空间是应用程序在容器中运行所需的任何内存和磁盘空间。虽然应用程序的环境感觉像一个专用的操作系统,但应用程序的部署方式与它在专用主机上的部署方式一样。容器化应用程序在几秒钟内启动,与VM情况相比,机器上可以容纳更多的应用程序实例。
资料来源:https://azure.microsoft.com/en-us/blog/containers-docker-windows-and-trends/
其他回答
在我看来,这取决于你的应用程序的需求,为什么决定部署到Docker,因为Docker根据其功能将应用程序分解为小部分,这变得有效,因为当一个应用程序/功能出现错误时,它对其他应用程序没有影响,与使用完整的vm相比,它的配置会更慢、更复杂,但在某些方面比码头工人更安全
我喜欢肯·科克伦的回答。
但我想补充一点观点,这里没有详细介绍。在我看来,Docker在整个过程中也有所不同。与虚拟机不同,Docker不仅仅是硬件的最佳资源共享,而且它还为打包应用程序提供了一个“系统”(作为一组微服务是可取的,但不是必须的)。
对我来说,它正好填补了面向开发人员的工具(如rpm、Debian包、Maven、npm+Git)与操作工具(如Puppet、VMware、Xen)之间的差距,你可以这么说。。。
为什么将软件部署到docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?
您的问题假定了某种一致的生产环境。但如何保持一致?考虑一些数量(>10)的服务器和应用程序,这是管道中的阶段。
为了保持同步,您将开始使用类似木偶、厨师或您自己的供应脚本、未发布的规则和/或大量文档。。。理论上,服务器可以无限期运行,并保持完全一致和最新。实践无法完全管理服务器的配置,因此存在很大的配置漂移和运行服务器的意外更改空间。
因此,有一种已知的模式可以避免这种情况,即所谓的不可变服务器。但不可变的服务器模式并不受欢迎。主要是因为Docker之前使用的VM的限制。处理几个千兆字节的大图像,移动这些大图像,只是为了改变应用程序中的一些字段,这是非常费力的。可以理解。。。
有了Docker生态系统,你永远不需要在“小改动”上移动千兆字节(感谢aufs和Registry),也不必担心在运行时将应用程序打包到Docker容器中会导致性能下降。您不必担心该图像的版本。
最后,即使在您的Linux笔记本电脑上,您也可以经常复制复杂的生产环境(如果在您的情况下不起作用,请不要打电话给我;)
当然,您可以在VM中启动Docker容器(这是一个好主意)。减少VM级别的服务器资源调配。所有这些都可以由Docker管理。
同时Docker使用自己的实现“libcontainer”而不是LXC。但LXC仍然可用。
Docker(基本上是容器)支持OS虚拟化,即您的应用程序感觉它有一个完整的OS实例,而VM支持硬件虚拟化。你觉得它是一台物理机器,你可以在其中启动任何操作系统。
在Docker中,运行的容器共享主机OS内核,而在VM中,它们有自己的OS文件。当您将应用程序部署到各种服务环境(如“测试”或“生产”)时,开发应用程序的环境(操作系统)将是相同的。
例如,如果您开发了一个运行在端口4000上的web服务器,当您将其部署到“测试”环境时,该端口已经被其他程序使用,因此它停止工作。在容器中有层;您对操作系统所做的所有更改都将保存在一个或多个层中,这些层将是映像的一部分,因此无论映像到哪里,依赖项都将存在。
在下面所示的示例中,主机有三个VM。为了使VM中的应用程序完全隔离,它们每个都有自己的OS文件、库和应用程序代码副本,以及OS的完整内存实例。而下图显示了与容器相同的场景。在这里,容器只需共享主机操作系统,包括内核和库,因此它们不需要启动OS、加载库或为这些文件支付专用内存成本。它们所占用的唯一增量空间是应用程序在容器中运行所需的任何内存和磁盘空间。虽然应用程序的环境感觉像一个专用的操作系统,但应用程序的部署方式与它在专用主机上的部署方式一样。容器化应用程序在几秒钟内启动,与VM情况相比,机器上可以容纳更多的应用程序实例。
资料来源:https://azure.microsoft.com/en-us/blog/containers-docker-windows-and-trends/
Docker最初使用LinuX Containers(LXC),但后来改用runC(以前称为libcontainer),后者与主机在同一操作系统中运行。这允许它共享大量主机操作系统资源。此外,它使用分层文件系统(AuFS)并管理网络。
AuFS是一个分层文件系统,因此可以将只读部分和写部分合并在一起。可以将操作系统的公共部分设置为只读(并在所有容器中共享),然后为每个容器提供自己的装载以供编写。
假设您有一个1GB的容器映像;如果要使用完整的虚拟机,则需要有1 GB x所需数量的虚拟机。使用Docker和AuFS,您可以在所有容器之间共享1GB的空间,如果您有1000个容器,那么容器操作系统的空间可能只有1GB多一点(假设它们都运行同一个操作系统映像)。
一个完整的虚拟化系统得到了它自己的一组资源分配,并且实现了最小的共享。你得到了更多的隔离,但它更重(需要更多的资源)。使用Docker可以减少隔离,但容器是轻量级的(需要更少的资源)。因此,您可以轻松地在主机上运行数千个容器,而且它甚至不会闪烁。试着用Xen做这件事,除非你有一个非常大的主机,否则我认为这是不可能的。
一个完整的虚拟化系统通常需要几分钟的启动时间,而Docker/LXC/runC容器需要几秒钟,甚至不到一秒钟。
每种类型的虚拟化系统都有利弊。如果您希望使用有保证的资源进行完全隔离,那么完整的VM是最佳选择。如果您只想将进程彼此隔离,并希望在一个大小合理的主机上运行大量进程,那么Docker/LXC/runC似乎是一个不错的选择。
有关更多信息,请查看这组博客文章,它们很好地解释了LXC的工作原理。
为什么将软件部署到docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?
部署一致的生产环境说起来容易做起来难。即使您使用Chef和Puppet等工具,主机和环境之间也总是会有操作系统更新和其他变化。
Docker使您能够将操作系统快照到共享映像中,并使其易于在其他Docker主机上部署。本地、dev、qa、prod等:都是相同的图像。当然,你可以用其他工具来完成这项工作,但不是那么容易或快速。
这非常适合测试;假设您有数千个测试需要连接到数据库,每个测试都需要数据库的原始副本,并将对数据进行更改。经典的方法是在每次测试后使用自定义代码或使用Flyway等工具重置数据库-这可能非常耗时,意味着测试必须连续运行。然而,使用Docker,您可以创建数据库的映像,并为每个测试运行一个实例,然后并行运行所有测试,因为您知道它们都将针对数据库的同一快照运行。由于测试是在Docker容器中并行运行的,它们可以在同一时间在同一个盒子上运行,并且应该完成得更快。尝试使用完整的虚拟机执行此操作。
来自评论。。。
有趣的我想我仍然对“快照操作系统”的概念感到困惑。如果不制作操作系统的图像,那么如何做到这一点?
好吧,看看我能不能解释一下。您从一个基本图像开始,然后进行更改,并使用docker提交这些更改,然后创建一个图像。此图像仅包含与基础的差异。当你想运行你的镜像时,你也需要基础,它使用一个分层文件系统将你的镜像分层在基础之上:如上所述,Docker使用AuFS。AuFS将不同的层合并在一起,您可以得到所需的内容;你只需要运行它。你可以继续添加越来越多的图像(层),它将继续只保存差异。由于Docker通常基于注册表中的现成图像构建,因此您很少需要自己“快照”整个操作系统。
Docker是这样介绍自己的:
Docker是推动集装箱运输的公司,也是唯一容器平台提供程序,以解决混合云。今天的企业面临着数字化的压力转换,但受现有应用程序和同时合理化日益多样化的投资组合云、数据中心和应用程序架构。Docker启用应用程序和基础架构之间的真正独立性开发人员和IT运营人员释放他们的潜力并创建一个模型以实现更好的协作和创新。
所以Docker是基于容器的,这意味着你有可以在当前机器上运行的图像和容器。它不包括像VM这样的操作系统,而是像Java、Tomcat等一组不同的工作包。
如果你了解容器,你就会了解Docker是什么,以及它与VM的区别。。。
那么,什么是容器?
容器映像是一个轻量级、独立的可执行包一个包含运行它所需的一切的软件:代码,运行时、系统工具、系统库、设置。两者都可用基于Linux和Windows的应用程序、容器化软件将始终运行无论环境如何,都是一样的。容器隔离软件从其环境来看,例如发展和分段环境,帮助减少运行团队之间的冲突同一基础设施上的不同软件。
如下图所示,每个容器都有一个单独的包,并且在一台机器上运行,共享该机器的操作系统。。。它们安全且易于运输。。。