【编者的话】以 Docker 为代表的容器技术一度被认为是虚拟化技术的替代品,然而这两种技术之间并不是不可调和的。作者分别列举了容器技术以及虚拟化技术的优缺点,并提出将两者结合取长补短的解决方案。
容器为应用程序提供了隔离的运行空间:每个容器内都包含一个独享的完整用户环境空间,并且一个容器内的变动不会影响其他容器的运行环境。为了能达
到这种效果,容器技术使用了一系列的系统级别的机制诸如利用Linux
namespaces来进行空间隔离,通过文件系统的挂载点来决定容器可以访问哪些文件,通过cgroups来确定每个容器可以利用多少资源。此外容器之
间共享同一个系统内核,这样当同一个库被多个容器使用时,内存的使用效率会得到提升。
对于系统虚拟化技术来说,虚拟层为用户提供了一个完整的虚拟机:包括内核在内的一个完整的系统镜像。CPU虚拟化技术可以为每个用户提供一个独享且和其他用户隔离的系统环境,虚拟层可以为每个用户分配虚拟化后的CPU、内存和IO设备资源。
哪家强?
通常来说,这取决于你的需求。如果你只是希望将应用运行的实例进行隔离,那么对于管理应用运行环境、启动应用实例以及控制资源
开销方面容器将是一个极为高效的工具。像Docker这一类的容器,其设计原则就是为了解决这种应用环境的修改以及应用部署的问题,并且这十分符合
DevOps理念(你可能希望知道更多关于DevOps理念的内容)。
如果你从服务器虚拟化的角度来寻找最好的环境隔离方案,那么系统级的虚拟化是更好的方案:和容器相比,邻居租户(Noisy
neighbours
)对系统的影响在虚拟化的方案下将不是一个问题。尽管现在很多容器都在专注于提高其隔离能力,但是虚拟机的隔离还是要优于容器。从物理服务器过渡到虚拟服
务器是一个很自然的过程,并且现在针对虚拟服务器的管理的生态系统也很完善。
在z系统中,Linux具有很好的伸缩性(运行容器),但是z是一个极度高效虚拟化(运行虚拟服务器)的平台,它继承了整个系统架构。尽管没有精确的测量,将虚拟化和容器技术相结合,在z系统中会比其他平台要容易。
还有第三条路:两者兼而有之。
有多种方式可以将系统虚拟化及容器技术相结合:
1.一个容器中运行一个虚拟机
Docker在部署容器方面十分灵活。其中一个选择(execution
driver)是利用KVM镜像。这样就可以在最好的隔离性情况下发挥DevOps所擅长的使用Docker各种方式。但是这也付出了需要在启动容器时启
动整个操作系统实例的代价。这也就意味着较长的启动时间以及低效的内存使用,只能通过内核共享内存(KSM)来提升内存利用率。这种方法效果和效率都不理
想,但是这是一个好的开始。
2.一个虚拟机中运行一个容器
与之相反的,你一可以在虚拟机中启动一个容器。这里的虚拟机并不是由Docker控制,而是通过现有的虚拟化管理设施来控制。一旦系统实例启动,
就可以通过Docker来运行容器而武器其他特殊的设置。同时,由于不同容器运行在不同的虚拟机上,容器之间也能有很好的隔离。而内存的使用率需要通过虚
拟层的内存共享来提升。
2b.一个虚拟机中运行多个容器
对于多租户的情况,可以用另一种形式在虚拟机中运行Docker。这种情况下,我们假设在不同租户的容器之间需要强隔离,而对于同一用户的不同容
器,简单的Linux容器隔离已经足够。这样我们就可以在减少虚拟机个数的情况下保证租户之间的隔离,同时可以利用Docker带来的各种便利。
总结来说:需要根据实际需求进行选择。
原文链接:Virtualization vs. Containerization?
翻译:DockerOne/刘梦馨 校对:李颖杰
译者介绍
刘梦馨,一个做过前端、后端和测试的运维人员,在阿里巴巴挖宝,顺便去点亮 DBA 的技能树。关注Docker,虚拟化和云计算技术。
最新评论(16)
引用来自“eechen”的评论
虚拟化带来的性能损失:在一台物理服务器配置16个虚拟主机站点,共用一套Apache,PHP,MySQL以及Linux系统资源,这种模式下是最高效的.如果把这台物理服务器虚拟成16个实例,每个实例都安装一套Linux,Apache,PHP,MySQL,那就比物理主机多出了15套,加上虚拟化程序比如Xen,KVM本身也占用母机资源,所以在这种场景下,性能损失还是比较大的.像Docker这种容器级虚拟化好处则是能够共享母机Linux系统资源,不像Xen,KVM要虚拟一个完整的Linux实例操作系统,所以能够减少性能损失.
虽然Xen/KVM这样的传统虚拟化性能损失比Docker大,但自由度远比Docker高,毕竟虚拟的是一个完整的系统.而传统的虚拟主机性能又远比Docker高,比如多个站点共享一套LAMP环境.Docker在传统虚拟化和虚拟主机的夹缝中找生存空间,很难.
引用来自“eechen”的评论
虚拟化带来的性能损失:在一台物理服务器配置16个虚拟主机站点,共用一套Apache,PHP,MySQL以及Linux系统资源,这种模式下是最高效的.如果把这台物理服务器虚拟成16个实例,每个实例都安装一套Linux,Apache,PHP,MySQL,那就比物理主机多出了15套,加上虚拟化程序比如Xen,KVM本身也占用母机资源,所以在这种场景下,性能损失还是比较大的.像Docker这种容器级虚拟化好处则是能够共享母机Linux系统资源,不像Xen,KVM要虚拟一个完整的Linux实例操作系统,所以能够减少性能损失.
虽然Xen/KVM这样的传统虚拟化性能损失比Docker大,但自由度远比Docker高,毕竟虚拟的是一个完整的系统.而传统的虚拟主机性能又远比Docker高,比如多个站点共享一套LAMP环境.Docker在传统虚拟化和虚拟主机的夹缝中找生存空间,很难.
引用来自“Neo”的评论
传统虚拟主机的性能远比Docker高根本无从谈起,我大可让Docker只运行我的应用服务器,然后让主机自己的网页服务器进行负载均衡,那就是进程级别的隔离,KVM/Xen的隔离比进程级别的高,然后性能比进程级别的高?引用来自“SupNatural”的评论
他说的虚拟主机是http服务器里的VirtualHost引用来自“eechen”的评论
虚拟化带来的性能损失:在一台物理服务器配置16个虚拟主机站点,共用一套Apache,PHP,MySQL以及Linux系统资源,这种模式下是最高效的.如果把这台物理服务器虚拟成16个实例,每个实例都安装一套Linux,Apache,PHP,MySQL,那就比物理主机多出了15套,加上虚拟化程序比如Xen,KVM本身也占用母机资源,所以在这种场景下,性能损失还是比较大的.像Docker这种容器级虚拟化好处则是能够共享母机Linux系统资源,不像Xen,KVM要虚拟一个完整的Linux实例操作系统,所以能够减少性能损失.
虽然Xen/KVM这样的传统虚拟化性能损失比Docker大,但自由度远比Docker高,毕竟虚拟的是一个完整的系统.而传统的虚拟主机性能又远比Docker高,比如多个站点共享一套LAMP环境.Docker在传统虚拟化和虚拟主机的夹缝中找生存空间,很难.
引用来自“Neo”的评论
传统虚拟主机的性能远比Docker高根本无从谈起,我大可让Docker只运行我的应用服务器,然后让主机自己的网页服务器进行负载均衡,那就是进程级别的隔离,KVM/Xen的隔离比进程级别的高,然后性能比进程级别的高?引用来自“eechen”的评论
虚拟化带来的性能损失:在一台物理服务器配置16个虚拟主机站点,共用一套Apache,PHP,MySQL以及Linux系统资源,这种模式下是最高效的.如果把这台物理服务器虚拟成16个实例,每个实例都安装一套Linux,Apache,PHP,MySQL,那就比物理主机多出了15套,加上虚拟化程序比如Xen,KVM本身也占用母机资源,所以在这种场景下,性能损失还是比较大的.像Docker这种容器级虚拟化好处则是能够共享母机Linux系统资源,不像Xen,KVM要虚拟一个完整的Linux实例操作系统,所以能够减少性能损失.
虽然Xen/KVM这样的传统虚拟化性能损失比Docker大,但自由度远比Docker高,毕竟虚拟的是一个完整的系统.而传统的虚拟主机性能又远比Docker高,比如多个站点共享一套LAMP环境.Docker在传统虚拟化和虚拟主机的夹缝中找生存空间,很难.
在一台物理服务器配置16个虚拟主机站点,共用一套Apache,PHP,MySQL以及Linux系统资源,这种模式下是最高效的.如果把这台物理服务器虚拟成16个实例,每个实例都安装一套Linux,Apache,PHP,MySQL,那就比物理主机多出了15套,加上虚拟化程序比如Xen,KVM本身也占用母机资源,所以在这种场景下,性能损失还是比较大的.像Docker这种容器级虚拟化好处则是能够共享母机Linux系统资源,不像Xen,KVM要虚拟一个完整的Linux实例操作系统,所以能够减少性能损失.
虽然Xen/KVM这样的传统虚拟化性能损失比Docker大,但自由度远比Docker高,毕竟虚拟的是一个完整的系统.而传统的虚拟主机性能又远比Docker高,比如多个站点共享一套LAMP环境.Docker在传统虚拟化和虚拟主机的夹缝中找生存空间,很难.
引用来自“开源中国匿名会员”的评论
我一直喜歡在虛擬機裏面裝虛擬機裝虛擬機裝虛擬機裝虛擬機...引用来自“首席撸破皮”的评论
我最渴望就是:电脑虚拟出地球,然后虚拟出的地球再虚拟出地球,里面的地球再虚拟出地球,里里里里面的地球继续虚拟出地球,...虚拟出地球...