virtual-machine - Docker.io和一般的虚拟机有什么不同?

  显示原文与译文双语对照的内容

我一直重读 docker.io 文档,试图理解 docker.io 和完整虚拟机之间的区别。 它如何管理一个完整的文件系统,独立的网络环境,而不需要沉重?

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

时间:

Docker 当前使用 LinuX容器 ( LXC ),它运行在与主机相同的操作系统中。 这允许它共享大量主机操作系统资源。 它还为文件系统使用 AuFS 。 它也管理你的网络。

AuFS是一个分层的文件系统,所以你可以有一个只读的部分,一个写部分,并将它们合并在一起。 所以你可以将操作系统的公共部分作为只读的,在所有容器之间共享,然后给每个容器提供自己的挂载。

假设你有一个大小为 1 GB的容器图像。 如果你想要使用一个完整的虚拟机,但有时也会需要有 1 GB x 所需VM的数量。 LXC和AuFS在 1国标要求,如果你有你可以共享的代码块,那么仍然可以通过 1 GB的空间,为现在只有一点 1000容器容器的操作系统,假设它们都是运行在相同的操作系统映像。

一个完整的虚拟化系统会得到它自己的一组资源,并进行最小的共享。 你得到了更多的隔离,但它的( 需要更多资源) 更重。

使用 LXC,你可以得到更少的隔离,但是它们更轻量,并且需要更少的资源。 所以你可以在主机上轻松运行 1000,它甚至不会闪烁。 尝试用Xen来做,除非你有一个非常大的主机,我不认为它是可能的。

一个完整的虚拟化系统通常要花几分钟的时间,LXC容器需要几秒钟,有时甚至不到一秒钟。

每种虚拟化系统都有优缺点。 如果你想要完全独立于保证的资源,那么完整的虚拟机就是。 如果你只想将进程彼此隔离,并希望在一个合理大小的主机上运行大量的进程,那么LXC可能是。

有关更多信息,请查看这组博客文章,这有助于解释LXC如何工作。

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

部署一个一致的生产环境比做的简单。 即使你使用的工具如chef和 puppet,在主机和环境之间也总是有操作系统更新和其他东西。

Docker的作用是让你能够将操作系统快照到一个公用映像中,并使它易于在其他 Docker 主机上部署。 本地,dev,qa,prod等所有相同的映像。 当然你可以用其他工具来做到这点,但不能轻易或者快速。

在彼此之上单元测试的一切都很好,让我们假设你有和他们需要连接到数据库,并为了 1000测试没有破坏什么需要运行以每秒,这样测试不建议你 使用 Docker,你可以创建数据库的映像,然后并行运行所有测试,因为你知道它们都是针对相同的数据库快照运行的。 因为它们是并行运行的并且在LXC容器中运行,所以它们可以同时在同一个盒子上运行,并且你的测试会很快完成。 尝试使用完整的虚拟机进行操作。

编辑:评论中的 。。

有意思我想我仍然对"快照 [ting] 操作系统"的概念感到困惑。 你怎么做的没有,嗯,制作一个操作系统映像?

让我们看看能否解释。 首先使用基础映像,然后进行更改,然后使用 Docker 提交这些更改,并创建一个图像。 这里图像仅包含与基础的差异。 当你想运行你的图像时,你还需要基座,它使用分层文件系统将你的图像分层在底部,在本例中,AUFS 。 AUFS将不同的层合并在一起,你得到了你想要的,你只需要运行它。 你可以继续添加越来越多的图像( 图层),它只会保存差异。 因为从一个注册表,你几乎不会涉及到 Docker 通常基于ready-made顶部镜像"快照"自己整个操作系统。

我喜欢cochrane的Ken回答。

但是我想添加额外的观点,这里没有详细介绍。 我认为 Docker 在整个过程中也不同。 VMs相比,Docker 不是关于硬件的最佳资源共享的( 仅仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限仅限而已而已),而且它提供了一个"系统"应用程序( 可取但不是必须的,作为一组 Microservices )的。

对我而言,这适合在面向开发人员的工具与 rpm,debian包之间的差距,Maven 。npm + git一边和运维工具,如木偶,xenserver,Xen任何你能想到- -

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

你的问题假设生产环境一致。 ,但如何保持一致? 在管路中., 考虑一定数量的服务器和应用程序,stages. (> 10 ) 为了保持同步,你将开始使用类似 Puppet,厨师或者自己的供应脚本,未发布的规则和/或者大量文档。 理论上,服务器可以无限期运行,并且保持完全一致和最新。 实践无法完全管理服务器的配置,因此配置漂移有相当大的范围,以及运行服务器的意外更改。

所以有一个已知的模式来避免这种情况,所谓的不可变服务器 。 但是不变的服务器模式不被喜爱。 大多数原因是在 Docker 之前使用了虚拟机的限制。 处理几个字节大的图像,到处移动那些大图像,只是改变应用中的一些字段,非常费劲。 可以理解的。。

使用 Docker 生态系统,你永远不需要在"小更改"上移动千兆字节( 感谢aufs和注册表),你不必担心在运行时将应用程序打包到 Docker 容器中,从而降低性能。 你不必担心该图像的版本。 最后你甚至可以在你的linux笔记本电脑( 如果你的情况不工作,不要给我打电话;) 上重现复杂的生产环境

当然,你可以启动 Docker ( 这是个好主意) 中的容器。 减少在虚拟机级别上的服务器配置。 所有上都可以由 Docker 管理。

P.S 。同时 Docker 使用它自己的实现"libcontainer"而不是 LXC 。 但是LXC仍然可用。

通过这篇文章,我们将绘制一些vm和LXCs之间的差异。 首先定义它们。

虚拟机:

虚拟机模拟物理计算环境,但对 CPU,内存,硬盘,网络和其他硬件资源的请求由虚拟化层管理,它将这些请求转换为底层物理硬件。

在这个上下文中,VM被称为客户机,而它运行的环境称为主机

LXC s:

Linux容器( LXC ) 正在运行system-level功能,可以在一个控制主机( LXC主机) 上运行多个独立的Linux容器。 Linux容器作为一个轻量级的替代程序,因为它们不需要虚拟机管理程序。 Virtualbox,KVM,Xen等。

现在只有在你在被艾伦( Hangover的扎克。Galifianakis- ) drugged而已经在去年的拉斯维加斯感兴趣的读者会很清楚有关巨大的械用于linux容器技术和一个容器就是我是不是特定的项目,它创造了一个虚拟的动态更新在整个世界中最后几个月是 – Docker 导致一些呼应的意见云计算环境应放弃虚拟机( VMs ) 并将它的替换为容器得益于其较低的开销,并且可能会提高性能。

但是大的问题是,是否可行,它将是明智的?

LXCs的作用域是一个Linux实例。 它可能是不同的Linux风格( 比如 容器上的一个Ubuntu容器,但它仍然是 Linux 。 ) 类似地,Windows-based容器的作用范围为 Windows 现在如果我们观察的一个实例vm他们有一个很宽的范围和你并不仅限于使用虚拟机管理程序的操作系统linux或者 Windows 。

vm相比,LXCs的开销低,性能更好。 在LXC技术之上构建的工具 Docker 为开发者提供了运行应用程序的平台,同时也为开发人员提供了在生产服务器或者数据中心部署相同容器的工具。 它试图让用户体验一个开发人员在运行某个应用,引导和测试一个应用程序和一个操作的人,它的应用程序部署之间是无缝的,因为这是所有摩擦的地方在于和开发运维的目的是要敲开那些竖井( silo ) 。

因此最好的方法是云基础设施提供商应该提倡适当使用vm和 LXC,因为它们都适合处理特定的工作负载和场景。

从现在开始,抛弃vm是不现实的。 因此,vm和LXCs都有各自的存在和重要性。

Docker 封装了一个具有所有依赖项的应用程序,一个程序集封装了一个 O.S.,可以运行它可以在裸机上运行的任何应用程序。

它们都是非常不同的。 Docker 是轻量级的,使用了 lxc/libcontainer ( 它依赖于内核命名空间和仲裁),并且没有计算机/硬件仿真,例如管理程序,KVM 。 Xen是沉重的。

lxc更适合沙箱,容器和资源隔离。 它使用主机( 操作系统目前仅用于linux内核) 克隆 API,它为 IPC,NS ( 挂载),网络,PID,绑定 等等,内存,io,cpu 等等 等提供命名空间。 这是使用cgroups控制的,你可以在其中创建具有特定资源( cpu,内存。。) 规范/限制的组,并将你的进程放入其中。 在lxc之上,Docker 提供联合挂载 文件系统,在那里你可以添加层并在不同的挂载命名空间之间共享层。 这是一个强大的特性,其中基本图像通常是只读的,只有当容器修改了层中的某些内容时,它才会写入到read-write分区( a.k. ) 。 在写入时复制。它还提供了许多其他的包装,比如图像的注册表和版本控制。 使用普通的lxc,你需要附带一些rootfs或者共享 rootfs,共享时,这些更改会反映在其他容器中。

普通虚拟机使用虚拟机管理程序和相关技术,它将成为第一个操作系统的专用固件,成为第一个操作系统( 主机操作系统或者客户机操作系统 0 ) 或者运行在主机操作系统上的软件,如 cpu,usb/附件,内存,网络 等等 等。

Docker/lxc几乎可以在任何廉价的硬件( <1 GB的内存也可以,只要你有更新的内核) vs 上运行。普通的虚拟机需要至少 2 GB的内存 等等,来做任何有意义的事情。 但是 Docker 上的支持在操作系统中不可用,比如 Windows ( 截至 nov/2014 ),其中可能会在 windows,linux,苹果机上运行。

...