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

为什么将软件部署到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是轻量级的,使用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的照片:

了解虚拟化和容器如何在低级别上工作可能会有所帮助。这将澄清很多事情。

注意:我在下面的描述中简化了一点。有关详细信息,请参阅参考文献。

虚拟化如何在低级别工作?

在这种情况下,VM管理器接管CPU环0(或较新CPU中的“根模式”),并拦截来宾操作系统发出的所有特权调用,以产生来宾操作系统拥有自己硬件的错觉。有趣的事实:在1998年之前,人们认为在x86架构上实现这一点是不可能的,因为没有办法进行这种拦截。VMware的员工是第一个有想法重写内存中的可执行字节以供来宾操作系统的特权调用来实现这一点的人。

其净效果是虚拟化允许您在同一硬件上运行两个完全不同的操作系统。每个来宾操作系统都要经过引导、加载内核等所有过程。例如,来宾操作系统无法完全访问主机操作系统或其他来宾操作系统,从而造成混乱。

容器如何在低液位下工作?

2006年左右,包括谷歌员工在内的一些人实现了一个名为名称空间的新内核级功能(然而,这个想法早就存在于FreeBSD中)。操作系统的一个功能是允许在进程之间共享网络和磁盘等全局资源。如果这些全局资源被包装在命名空间中,以便它们只对在同一命名空间中运行的那些进程可见,该怎么办?例如,您可以获取一块磁盘并将其放在命名空间X中,然后在命名空间Y中运行的进程无法看到或访问它。同样,命名空间X中的进程无法访问分配给命名空间Y的内存中的任何内容。当然,X中的程序无法看到或与命名空间Y中的进程对话。这为全局资源提供了一种虚拟化和隔离。Docker是这样工作的:每个容器都在自己的命名空间中运行,但使用与所有其他容器完全相同的内核。之所以发生隔离,是因为内核知道分配给进程的命名空间,并且在API调用期间,它确保进程只能访问自己命名空间中的资源。

容器与虚拟机的局限性现在应该很明显:你不能像虚拟机那样在容器中运行完全不同的操作系统。但是,您可以运行不同的Linux发行版,因为它们共享相同的内核。隔离级别不如VM中的隔离级别强。事实上,在早期的实现中,“来宾”容器可以接管主机。您还可以看到,当您加载一个新容器时,OS的整个新副本并不像在VM中那样启动。所有容器共享同一内核。这就是为什么集装箱重量轻。与VM不同的是,您不必为容器预先分配大量内存,因为我们没有运行新的OS副本。这允许在一个操作系统上运行数千个容器,同时对它们进行装箱,如果我们在它们自己的VM中运行操作系统的单独副本,这可能是不可能的。

这里有很多很好的技术答案,清楚地讨论了VM和容器之间的差异以及Docker的起源。

对我来说,VM和Docker之间的根本区别在于如何管理应用程序的推广。

使用VM,您可以将应用程序及其依赖关系从一个VM提升到下一个DEV,从UAT提升到PRD。

这些VM通常会有不同的补丁和库。多个应用程序共享一个VM并不罕见。这需要管理所有应用程序的配置和依赖关系。回退需要撤消VM中的更改。或者在可能的情况下恢复。

使用Docker的想法是,将应用程序与其所需的库一起打包到自己的容器中,然后将整个容器作为一个单元进行升级。

除了内核之外,补丁和库都是相同的。一般来说,每个容器只有一个应用程序,这简化了配置。回退包括停止和删除容器。

因此,在最基本的层面上,使用VM,您可以将应用程序及其依赖项作为独立的组件进行推广,而使用Docker,您可以一次性推广所有内容。

是的,包括管理容器在内的容器存在问题,尽管Kubernetes或Docker Swarm等工具极大地简化了任务。

有三种不同的设置提供了运行应用程序的堆栈(这将帮助我们认识到容器是什么,以及是什么使它比其他解决方案更强大):

1) Traditional Servers(bare metal)
2) Virtual machines (VMs)
3) Containers

1) 传统的服务器堆栈由运行操作系统和应用程序的物理服务器组成。

优势:

原始资源的利用隔离

缺点:

部署时间非常慢昂贵的浪费的资源难以扩展难以迁移复杂的配置

2) VM堆栈由运行操作系统的物理服务器和管理虚拟机、共享资源和网络接口的管理程序组成。每个Vm运行一个客户操作系统、一个应用程序或一组应用程序。

优势:

善用资源易于扩展易于备份和迁移成本效益灵活性

缺点:

资源分配有问题供应商锁定复杂的配置

3) 容器设置与其他堆栈的主要区别是基于容器的虚拟化使用主机操作系统的内核来管理多个孤立的来宾实例。这些来宾实例称为容器。主机可以是物理服务器或VM。

优势:

隔离轻量的资源有效易于迁移安全低开销镜像生产和开发环境

缺点:

相同的体系结构资源密集型应用网络和安全问题。

通过将容器设置与之前的设置进行比较,我们可以得出结论,容器化是迄今为止我们所知的最快、最有效的资源和最安全的设置。容器是运行应用程序的独立实例。Docker以某种方式旋转容器,层使用默认存储驱动程序(Overlay驱动程序)获得运行时内存,这些驱动程序在几秒钟内运行,一旦我们提交到容器中,就会在其上创建写时复制层,从而为容器的执行提供动力。如果是VM,则需要大约一分钟的时间将所有内容加载到虚拟化环境中。这些轻量级实例可以很容易地替换、重建和移动。这使我们能够镜像生产和开发环境,并在CI/CD过程中提供了巨大的帮助。容器所能提供的优势是如此引人注目,它们肯定会继续存在。

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

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

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

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

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