Docker跟一般的虚拟机有什么区别?

时间:2022-12-23 20:15:28

 

这是*上的一个问题及其回答的翻译(原文:Docker.io跟一般的虚拟机有什么区别?)。原文主要回答了三个问题:Docker.io的基本原理是什么?为什么在docker中部署软件很方便?docker是如何保存系统镜像的?前两个问题是主问题,最后一个问题是有人在评论中提出的,原作者也做了回答。

问题:

我正在学习Docker.io的文档(http://docs.docker.io/en/latest/terms/container/),试图找到Docker.io跟完整的虚拟机之间到底有什么差别。Docker.io是如何在实现一个完整的文件系统,隔离网络环境等特性的同时又能保持轻量化的?

回答:

Docker使用的是Linux容器(LinuX Container, 简称LXC),跟其宿主运行同样的操作系统。这使得LXC可以跟共享其宿主操作系统的很多资源。它还用AuFS作为文件系统。它还可以为你管理网络。

AuFS是一个分层文件系统,可以有一个只读分区,一个可写分区,然后将两者合并。所以,可以让所有的容器共享同一个只读分区,并各个容器设置各自的写分区。

比如有一个1GB大小的容器镜像。如果使用一般的虚拟机,需要N台机器的话,就需要N GB的存储空间。有了LXC和AuFS,可以让运行相同操作系统的多个容器共享这1GB,这样即使需要1000个容器,所需的空间也比1GB多不了多少。

完全的虚拟化系统会完全占有分配给它的资源,很少共享。隔离性很好,但很重(需要更多的资源)。

LXC的隔离性弱一下,但非常轻量化,需要的资源很少。类似在一个主机上运行1000个容器这种任务,对LXC来说就是秒杀。如果用Xen来实现这么多虚拟机,除非主机异常强悍,否则是不可能的。

一般的虚拟系统需要数分钟来启动,LXC容器的启动时间只有几秒钟,有时甚至不到一秒。

两种虚拟系统都有各自的优缺点。如果需要彻底的隔离,确保资源分配,那就应该用完整的虚拟机。如果只是要隔离各个进程,同时需要在一般的主机上运行大量的此类进程,LXC就是最佳选择。

关于LXC的具体解释可以看看这篇博客文章:http://blog.dotcloud.com/under-the-hood-linux-kernels-on-dotcloud-part

问题

为什么在docker镜像中部署软件要比直接在持久化的生产环境中部署软件便捷?

回答

在持久化的生产环境中部署软件是说起来容器做起来难。就算是用上了诸如chef和puppet一类的工具,主机和生产环境之间还是会有诸如OS更新之类的差异。

用Docker可以讲操作系统放入同一个镜像中,在其他的docker主机上部署就变得非常同意。在本地主机上,开发、质控、生产环境等都可以是一个镜像。用其他工具也可以实现这些,但用docker无疑是最便捷的解决方案。

对于单元测试这也是个好东西,假设有1000个测试,它们都需要连接数据库,为了确保测试不会破坏原有的东西,需要逐个地运行这些测试(运行测试,回滚,然后下一个测试)。有了Docker,可以给数据库建一个镜像,然后同时运行所有的测试,因为你知道他们所使用都是数据库的同一个镜像。测试是并行执行的,而且在LXC容器中,他们可以同时在一个环境中运行,测试的速度可以大大提升。可以试试在完整的虚拟机中做这个测试。

问题

很有意思!我依然觉得我对“snapshot the OS”这个概念感到困惑。怎么可能实现这个功能却不需要做一个OS的镜像?

回答

好吧,我试着解释一下。首先你有一个基础镜像,做一些修改,用docker提交这些修改,docker会创建一个镜像。但这个镜像中保存的只是你修改后的镜像跟基础镜像之间的差异。在运行你的镜像时,依然需要基础镜像,docker会通过分层文件系统,就是AuFS,将你的镜像放在基础镜像之上。AuFS会将各层系统合并,你就能得到你自己的镜像,直接运行即可。可以添加更多的镜像(层),docker只会保存它们之间的差异