我喜欢肯·科克伦的回答。
但我想补充一些观点,这里没有详细说明。在我看来,码头在整个过程中也有所不同。与VM相比,Docker并不是(仅仅)最优的硬件资源共享,而且它还为打包应用程序提供了一个“系统”(更好,但不是必须的,作为一组微服务)。
在我看来,它适应了像rpm这样面向开发人员的工具之间的差距,德比安包裹,马文,NPM+Git在一边,操作工具(如木偶VMware,Xen,你说吧.
为什么将软件部署到码头映像(如果这是正确的术语)比简单部署到一致的生产环境容易呢?
您的问题假设了一些一致的生产环境。但是如何保持它的一致性呢?考虑一些服务器和应用程序的数量(>10),在管道中的各个阶段。
为了保持同步,你将开始使用类似木偶的东西,大厨或者你自己的配置脚本,未发布的规则和/或大量的文档.理论上,服务器可以无限期运行,并且保持完全一致和最新。实践无法完全管理服务器的配置,因此有相当大的配置漂移空间,以及对正在运行的服务器的意外更改。
因此,有一种已知的模式可以避免这种情况,即所谓的不可变服务器..但不变的服务器模式并不受欢迎。主要是因为在Docker之前使用的VM的局限性。处理几个千兆字节的大图像,移动这些大图像,仅仅为了改变应用程序中的一些字段,是非常辛苦的。可以理解.。
有了Docker生态系统,您将永远不需要在“小更改”(谢谢aufs和Registry)上移动千兆字节,您也不必担心在运行时将应用程序打包到Docker容器中会失去性能。你不需要担心那个图像的版本。
最后,您甚至可以复制复杂的生产环境,即使在Linux笔记本上也是如此(如果在您的情况下不起作用,就不要打电话给我);)
当然,您可以在VM中启动Docker容器(这是个好主意)。在VM级别上减少服务器配置。所有这些都可以由Docker来管理。
同时,Docker使用自己的实现“libContainer”来代替LXC。但LXC仍然可用。