我一直在重读Docker文档,试图理解Docker和完整VM之间的区别。它是如何设法提供一个完整的文件系统、隔离的网络环境等而不那么沉重的?
为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?
我一直在重读Docker文档,试图理解Docker和完整VM之间的区别。它是如何设法提供一个完整的文件系统、隔离的网络环境等而不那么沉重的?
为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?
当前回答
我喜欢肯·科克伦的回答。
但我想补充一点观点,这里没有详细介绍。在我看来,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仍然可用。
其他回答
Docker不是一种虚拟化方法。它依赖于实际实现基于容器的虚拟化或操作系统级虚拟化的其他工具。为此,Docker最初使用的是LXC驱动程序,然后转移到libcontainer,现在改名为runc。Docker主要致力于自动化应用程序容器内的应用程序部署。应用程序容器设计用于打包和运行单个服务,而系统容器设计用于运行多个进程,如虚拟机。因此,Docker被认为是容器化系统上的容器管理或应用程序部署工具。
为了了解它与其他虚拟化的区别,我们来了解一下虚拟化及其类型。那么,更容易理解两者之间的区别。
虚拟化
在其构想形式中,它被认为是一种逻辑上划分大型机以允许多个应用程序同时运行的方法。然而,当公司和开源社区能够提供一种以某种方式处理特权指令的方法,并允许多个操作系统在一个基于x86的系统上同时运行时,情况发生了巨大变化。
管理程序
管理程序负责创建来宾虚拟机运行的虚拟环境。它监督宾客系统,并确保在必要时为宾客分配资源。管理程序位于物理机和虚拟机之间,并向虚拟机提供虚拟化服务。为了实现它,它拦截虚拟机上的来宾操作系统操作,并模拟主机操作系统上的操作。
虚拟化技术(主要是云技术)的快速发展进一步推动了虚拟化的使用,允许在虚拟机管理程序(如Xen、VMware Player、KVM等)的帮助下,在单个物理服务器上创建多个虚拟服务器,并将硬件支持纳入商品处理器(如Intel VT和AMD-V)。
虚拟化类型
虚拟化方法可以根据其模拟客户操作系统的硬件和模拟客户操作环境的方式进行分类。主要有三种类型的虚拟化:
仿真准虚拟化基于容器的虚拟化
仿真
仿真(也称为完全虚拟化)完全在软件中运行虚拟机OS内核。此类型中使用的管理程序称为类型2管理程序。它安装在主机操作系统的顶部,负责将来宾操作系统内核代码转换为软件指令。翻译完全由软件完成,不需要硬件参与。仿真使运行任何支持被仿真环境的未修改操作系统成为可能。这种虚拟化的缺点是额外的系统资源开销,与其他类型的虚拟化相比,这会导致性能下降。
此类别中的示例包括VMware Player、VirtualBox、QEMU、Bochs、Parallels等。
准虚拟化
准虚拟化(Paravirtualization)也称为第1类虚拟机管理程序,直接在硬件或“裸机”上运行,并直接向其上运行的虚拟机提供虚拟化服务。它帮助操作系统、虚拟化硬件和真实硬件协作以实现最佳性能。这些虚拟机监控程序通常占地面积很小,本身不需要大量资源。
此类别中的示例包括Xen、KVM等。
基于容器的虚拟化
基于容器的虚拟化,也称为操作系统级虚拟化,支持在单个操作系统内核中执行多个独立的执行。它具有最佳的性能和密度,并具有动态资源管理功能。这种类型的虚拟化提供的隔离虚拟执行环境被称为容器,可以被视为一组可跟踪的进程。
通过添加到Linux内核2.6.24版本中的命名空间特性,容器的概念成为可能。容器将其ID添加到每个进程,并将新的访问控制检查添加到每个系统调用。它由clone()系统调用访问,该系统调用允许创建先前全局命名空间的单独实例。
命名空间可以以多种不同的方式使用,但最常见的方法是创建一个独立的容器,该容器对容器外部的对象没有可见性或访问权限。在容器内运行的进程似乎在正常的Linux系统上运行,尽管它们与位于其他命名空间中的进程共享底层内核,其他类型的对象也是如此。例如,当使用命名空间时,容器内的根用户不会被视为容器外的根用户,从而增加了额外的安全性。
Linux控制组(cgroups)子系统是实现基于容器的虚拟化的下一个主要组件,用于对进程进行分组并管理其总资源消耗。它通常用于限制容器的内存和CPU消耗。由于容器化的Linux系统只有一个内核,并且内核对容器具有完全的可见性,因此只有一个级别的资源分配和调度。
Linux容器有多种管理工具,包括LXC、LXD、systemd nspawn、lmctfy、Warden、Linux VServer、OpenVZ、Docker等。
容器与虚拟机
与虚拟机不同,容器不需要启动操作系统内核,因此可以在不到一秒钟的时间内创建容器。这一特性使基于容器的虚拟化比其他虚拟化方法更为独特和可取。
由于基于容器的虚拟化几乎不会或根本不会增加主机的开销,因此基于容器的虚化具有接近本机的性能
对于基于容器的虚拟化,与其他虚拟化不同,不需要额外的软件。
主机上的所有容器共享主机的调度程序,从而节省了额外的资源。
与虚拟机映像相比,容器状态(Docker或LXC映像)的大小较小,因此容器映像易于分发。
容器中的资源管理是通过cgroups实现的。Cgroups不允许容器消耗比分配给它们的资源更多的资源。然而,到目前为止,主机的所有资源在虚拟机中都是可见的,但无法使用。这可以通过同时在容器和主机上运行top或htop来实现。所有环境的输出看起来都很相似。
更新:
Docker如何在非Linux系统中运行容器?
如果由于Linux内核中的可用特性,容器是可能的,那么显而易见的问题是非Linux系统如何运行容器。Docker for Mac和Windows都使用Linux虚拟机来运行容器。Docker工具箱用于在Virtual Box VM中运行容器。但是,最新的Docker在Windows中使用Hyper-V,在Mac中使用Hypervisor.framework。
现在,让我详细描述Docker for Mac如何运行容器。
Docker for Mac使用https://github.com/moby/hyperkit为了模拟hypervisor功能,Hyperkit在其核心中使用hypervisor.framework。Hypervisor.framework是Mac的本地管理程序解决方案。Hyperkit还使用VPNKit和DataKit分别命名网络和文件系统。
Docker在Mac上运行的Linux VM是只读的。但是,您可以通过运行以下命令来实现:
screen~/Library/Containers/com.docker.docker/Data/vms/0/tty。
现在,我们甚至可以检查此VM的内核版本:
#uname-aLinux linuxkit-025000000001 4.9.93-linuxkit-aufs#1 SMP 6月6日星期三16:86_64 Linux。
所有容器都在此VM内运行。
hypervisor.framework有一些限制。因为Docker没有在Mac中公开docker0网络接口。因此,您无法从主机访问容器。目前,docker0仅在VM中可用。
Hyper-v是Windows中的本机管理程序。他们还试图利用Windows 10的功能以本机方式运行Linux系统。
他们都很不同。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的照片:
有三种不同的设置提供了运行应用程序的堆栈(这将帮助我们认识到容器是什么,以及是什么使它比其他解决方案更强大):
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使用写时复制技术来减少容器消耗的内存空间。在此处阅读更多信息
Docker是这样介绍自己的:
Docker是推动集装箱运输的公司,也是唯一容器平台提供程序,以解决混合云。今天的企业面临着数字化的压力转换,但受现有应用程序和同时合理化日益多样化的投资组合云、数据中心和应用程序架构。Docker启用应用程序和基础架构之间的真正独立性开发人员和IT运营人员释放他们的潜力并创建一个模型以实现更好的协作和创新。
所以Docker是基于容器的,这意味着你有可以在当前机器上运行的图像和容器。它不包括像VM这样的操作系统,而是像Java、Tomcat等一组不同的工作包。
如果你了解容器,你就会了解Docker是什么,以及它与VM的区别。。。
那么,什么是容器?
容器映像是一个轻量级、独立的可执行包一个包含运行它所需的一切的软件:代码,运行时、系统工具、系统库、设置。两者都可用基于Linux和Windows的应用程序、容器化软件将始终运行无论环境如何,都是一样的。容器隔离软件从其环境来看,例如发展和分段环境,帮助减少运行团队之间的冲突同一基础设施上的不同软件。
如下图所示,每个容器都有一个单独的包,并且在一台机器上运行,共享该机器的操作系统。。。它们安全且易于运输。。。