我一直在重读Docker文档,试图理解Docker和完整VM之间的区别。它是如何设法提供一个完整的文件系统、隔离的网络环境等而不那么沉重的?
为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?
我一直在重读Docker文档,试图理解Docker和完整VM之间的区别。它是如何设法提供一个完整的文件系统、隔离的网络环境等而不那么沉重的?
为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?
当前回答
资料来源:Kubernetes in Action。
其他回答
我喜欢肯·科克伦的回答。
但我想补充一点观点,这里没有详细介绍。在我看来,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仍然可用。
通过这篇文章,我们将描绘虚拟机和LXC之间的一些区别。让我们先定义它们。
VM:
虚拟机模拟物理计算环境,但对CPU、内存、硬盘、网络和其他硬件资源的请求由虚拟化层管理,虚拟化层将这些请求转换为底层物理硬件。
在此上下文中,VM称为来宾,而其运行的环境称为主机。
LXC:
Linux容器(LXC)是操作系统级的功能,可以在一个控制主机(LXC主机)上运行多个独立的Linux容器。Linux容器是VM的轻量级替代品,因为它们不需要虚拟机管理程序,即Virtualbox、KVM、Xen等。
现在,除非你被艾伦(Zach Galifianakis,来自《宿醉》系列)麻醉,并在拉斯维加斯呆了一年,否则你会非常清楚Linux容器技术的巨大兴趣,如果我具体说一下,在过去几个月里在世界各地引起轰动的一个容器项目是Docker,它引发了一些回响,认为云计算环境应该放弃虚拟机(VM),并将其替换为容器,因为它们的开销更低,性能可能更好。
但最大的问题是,它可行吗?,这明智吗?
a.LXC的作用域是Linux的一个实例。它可能是不同风格的Linux(例如CentOS主机上的Ubuntu容器,但它仍然是Linux。)类似地,如果我们查看VM,基于Windows的容器现在被限定为Windows的一个实例,它们的范围非常广,并且使用管理程序,您不限于操作系统Linux或Windows。
b.与虚拟机相比,LXC开销低,性能更好。基于LXC技术构建的工具,即Docker,为开发人员提供了运行应用程序的平台,同时也为运营人员提供了一个工具,允许他们在生产服务器或数据中心上部署相同的容器。它试图让运行应用程序、启动和测试应用程序的开发人员与部署该应用程序的操作人员之间的体验无缝衔接,因为这是所有摩擦的所在,DevOps的目的是打破这些孤岛。
因此,最好的方法是云基础设施提供商应该提倡适当使用VM和LXC,因为它们都适合处理特定的工作负载和场景。
到目前为止,放弃虚拟机并不现实。因此,VM和LXC都有各自的存在和重要性。
Docker是这样介绍自己的:
Docker是推动集装箱运输的公司,也是唯一容器平台提供程序,以解决混合云。今天的企业面临着数字化的压力转换,但受现有应用程序和同时合理化日益多样化的投资组合云、数据中心和应用程序架构。Docker启用应用程序和基础架构之间的真正独立性开发人员和IT运营人员释放他们的潜力并创建一个模型以实现更好的协作和创新。
所以Docker是基于容器的,这意味着你有可以在当前机器上运行的图像和容器。它不包括像VM这样的操作系统,而是像Java、Tomcat等一组不同的工作包。
如果你了解容器,你就会了解Docker是什么,以及它与VM的区别。。。
那么,什么是容器?
容器映像是一个轻量级、独立的可执行包一个包含运行它所需的一切的软件:代码,运行时、系统工具、系统库、设置。两者都可用基于Linux和Windows的应用程序、容器化软件将始终运行无论环境如何,都是一样的。容器隔离软件从其环境来看,例如发展和分段环境,帮助减少运行团队之间的冲突同一基础设施上的不同软件。
如下图所示,每个容器都有一个单独的包,并且在一台机器上运行,共享该机器的操作系统。。。它们安全且易于运输。。。
1.重量轻
这可能是许多码头工人学习者的第一印象。
首先,docker映像通常比VM映像小,因此易于构建、复制和共享。
第二,Docker容器可以在几毫秒内启动,而VM可以在几秒钟内启动。
2.分层文件系统
这是Docker的另一个关键特性。图像具有图层,不同的图像可以共享图层,从而更节省空间,构建速度更快。
如果所有容器都使用Ubuntu作为它们的基本映像,那么不是每个映像都有自己的文件系统,而是共享相同的下划线Ubuntu文件,并且只在它们自己的应用程序数据上有所不同。
3.共享OS内核
将容器视为进程!
在主机上运行的所有容器实际上都是一堆具有不同文件系统的进程。它们共享相同的OS内核,只封装系统库和依赖项。
这在大多数情况下都很好(没有额外的OS内核维护),但如果容器之间需要严格隔离,则可能会出现问题。
为什么重要?
所有这些似乎都是进步,而不是革命。好吧,数量的积累导致质量的转变。
考虑应用程序部署。如果我们想部署一个新的软件(服务)或升级一个,最好是更改配置文件和进程,而不是创建一个新VM。因为创建一个具有更新服务的VM,测试它(开发人员和QA之间共享),部署到生产需要几个小时,甚至几天。如果出了什么问题,你必须重新开始,浪费更多的时间。因此,使用配置管理工具(木偶、盐堆、厨师等)安装新软件,最好下载新文件。
说到docker,不可能使用新创建的docker容器来替换旧容器。维护更容易!构建一个新映像,与QA共享,测试,部署它只需要几分钟(如果一切都是自动化的),最坏的情况下需要几个小时。这被称为不可变基础设施:不要维护(升级)软件,而是创建一个新的。
它改变了服务的交付方式。我们需要应用程序,但必须维护VM(这是一个难题,与我们的应用程序无关)。Docker让你专注于应用程序,让一切变得流畅。
在我看来,这取决于你的应用程序的需求,为什么决定部署到Docker,因为Docker根据其功能将应用程序分解为小部分,这变得有效,因为当一个应用程序/功能出现错误时,它对其他应用程序没有影响,与使用完整的vm相比,它的配置会更慢、更复杂,但在某些方面比码头工人更安全