Docker跟一般的虚拟机有什么区别?
2014-03-15 16:52
465 查看
Posted on 2013年12月9日
by 陈钢 (http://gossipcoder.com/?p=1435)
这是StackOverflow上的一个问题及其回答的翻译(原文: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只会保存它们之间的差异
相关文章推荐
- 如何从docker将image镜像到私有的registry
- 如何使用 docker 及常用命令(二)
- 如何使用 docker 及常用命令(一)
- 如何从docker将image镜像到私有的registry
- docker 安装和使用 注意
- 快速理解Docker - 容器级虚拟化解决方案
- Docker简要操作
- 开始LXC,DOCKER,VAGRANT,COREOS之旅
- Cgroup与LXC简介
- 集装箱式的轻量级Linux虚拟化技术PaaS——Docker相关学习资料
- LXC是如何与CGROUP,namespace扯上关系的?再加上DOCKER.IO。完美!!!
- Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
- 在Redhat/Centos下安装Docker(不升级内核)
- Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
- Redhat下Docker、LXC、CGroup的协同配置 推荐
- Docker web管理界面——Shipyard
- 具有中国特色的docker折腾记(下)
- Docker入门——image制作
- Linux开源容器Docker初探
- [译] 第二十一天: Docker - 缺失的指南