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

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


当前回答

docker文档(和自我解释)区分了“虚拟机”和“容器”。他们倾向于以一种不寻常的方式解释和使用事物。他们可以做到这一点,因为这取决于他们自己,他们在文档中写了什么,而且虚拟化的术语还没有真正准确。

事实是Docker文档对“容器”的理解,实际上是半虚拟化(有时是“OS级虚拟化”),而硬件虚拟化则相反,Docker不是。

Docker是一个低质量的虚拟化解决方案。容器与VM的区别是由docker开发人员发明的,以解释其产品的严重缺点。

它之所以如此流行,是因为他们“把火给了普通人”,也就是说,它使Win10工作站上典型的服务器(=Linux)环境/软件产品的简单使用成为可能。这也是我们容忍他们细微差别的原因。但这并不意味着我们也应该相信它。

Windows主机上的docker在HyperV中使用了嵌入式Linux,并且其容器已经在其中运行,这一事实使情况变得更加混乱。因此,Windows上的docker使用了硬件和半虚拟化相结合的解决方案。

简而言之,Docker容器是低质量(准)虚拟机,具有巨大的优势和许多缺点。

其他回答

有很多答案可以更详细地解释这些差异,但这里是我非常简短的解释。

一个重要的区别是VM使用单独的内核来运行操作系统。这就是它很重并且需要时间引导的原因,消耗了更多的系统资源。

在Docker中,容器与主机共享内核;因此它重量轻,可以快速启动和停止。

在虚拟化中,资源是在设置开始时分配的,因此当虚拟机在许多时间内处于空闲状态时,资源没有得到充分利用。在Docker中,容器没有分配固定数量的硬件资源,可以根据需求自由使用资源,因此具有高度的可扩展性。

Docker使用UNION文件系统。。Docker使用写时复制技术来减少容器消耗的内存空间。在此处阅读更多信息

他们都很不同。Docker是轻量级的,使用LXC/libcontainer(它依赖于内核命名空间和cgroups),并且没有机器/硬件仿真,如管理程序、KVM。Xen,它们很重。

Docker和LXC更多地用于沙箱、容器化和资源隔离。它使用主机操作系统(目前只有Linux内核)的克隆API,为IPC、NS(装载)、网络、PID、UTS等提供命名空间。

内存、I/O、CPU等呢。?这是使用cgroups来控制的,在cgroups中,您可以创建具有特定资源(CPU、内存等)规范/限制的组,并将进程放入其中。在LXC之上,Docker提供了一个存储后端(http://www.projectatomic.io/docs/filesystems/)例如,联合安装文件系统,您可以在不同的安装名称空间之间添加层和共享层。

这是一个强大的功能,其中基本映像通常是只读的,只有当容器修改层中的某些内容时,才会将某些内容写入读写分区(也称为写时复制)。它还提供了许多其他包装,如图像的注册和版本控制。

对于普通的LXC,您需要附带一些rootfs或共享rootfs,当共享时,这些更改会反映在其他容器上。由于这些新增功能,Docker比LXC更受欢迎。LXC在嵌入式环境中很受欢迎,用于围绕暴露于外部实体(如网络和UI)的进程实现安全性。Docker在需要一致生产环境的云多租户环境中非常流行。

一个普通的虚拟机(例如VirtualBox和VMware)使用一个虚拟机管理程序,相关技术要么有专用的固件,成为第一个操作系统(主机操作系统或客户操作系统0)的第一层,要么有一个在主机操作系统上运行的软件,为客户操作系统提供硬件仿真,如CPU、USB/附件、内存、网络等。截至2015年,VM在高安全性多租户环境中仍然很受欢迎。

Docker/LXC几乎可以在任何便宜的硬件上运行(只要你有更新的内核,少于1 GB的内存也可以),而正常的VM需要至少2 GB的内存等,才能使用它进行任何有意义的操作。但主机操作系统上的Docker支持在Windows(截至2014年11月)等操作系统中不可用,在Windows、Linux和Mac上可以运行各种类型的VM。

这是docker/rightscale的照片:

Docker封装了一个应用程序及其所有依赖项。

虚拟机封装了一个OS,该OS可以运行它通常可以在裸机上运行的任何应用程序。

我喜欢肯·科克伦的回答。

但我想补充一点观点,这里没有详细介绍。在我看来,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仍然可用。

资料来源:Kubernetes in Action。