这是StackOverflow上的一个问题及其回答的翻译(原文:Docker.io跟一般的虚拟机有什么区别?)。原文主要回答了三个问题:

1. Docker.io的基本原理是什么?
2. 为什么在docker中部署软件很方便?
3. docker是如何保存系统镜像的?

前两个问题是主问题,最后一个问题是有人在评论中提出的,原作者也做了回答。

问题:

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

回答:

当前,Docker内部使用的是Linux容器技术(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镜像中部署软件要比直接在持久化的生产环境中部署软件便捷?

回答

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

docker所做的事情就是赋予你一种能力,使你可以将OS快照存入一个通用的镜像,并使得在往其它的docker主机上部署时变得容易。对于本地,开发、质量管理、产品等等,都是用的同一个镜像。当然你也可以用其它的工具来做到这一点,但是可能没有这么容易或者这么快。

这对于单元测试是非常棒的。让我们来看看你有1000个测试,而且都需要连接数据库。为了不破坏任何事情,你需要一个接着一个的运行,以便这些测试不会相互影响(每个测试都在事务中,然后回滚回去)。使用Docker,那么你可以创建一个数据库的镜像(image),既然你知道这些测试会运行在相同的的数据库快照下,那么就可以并行地运行所有测试。既然这些测试都是并行运行在linux容器中,那么他们可以同时运行在同样的环境中。这样你的测试会完成的非常快。试着用完整的虚拟机来做这件事。

问题

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

回答

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

 

Docker跟一般的虚拟机有什么区别的更多相关文章

  1. Docker,容器,虚拟机和红烧肉

    Docker火了,有多火你自己看看下面的统计数据就知道了 在发布4个月的时间里,下载量就超过50000次,github上收到超过4000个star,涌现了超过100个贡献者,并且有超过150个项目和超 ...

  2. 从Docker在Linux和Windows下的区别简单理解Docker的层次结构

    上篇文章我们成功在Windows下安装了Docker,输出了一个简单的Hello World程序.本文中我们将利用Docker已有的云端镜像training/webapp来发布一个简单Python的W ...

  3. docker Dockerfile指令ADD和COPY的区别,添加目录方法

    docker Dockerfile指令ADD和COPY的区别,添加目录方法 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中.其格式是: ADD 源 ...

  4. Docker基础:VMware虚拟机Centos7环境下docker安装及使用

    1.docker简介 2.docker安装 3.卸载docker 4.阿里云镜像加速 5.docker的常用命令 5.1 帮助命令 5.2 镜像命令 5.3 容器命令 5.4 后台启动命令 5.5 查 ...

  5. docker安装,和虚拟机区别

    docker安装 1 在 CentOS 6.4 上安装 docker docker当前官方只支持Ubuntu,所以在 CentOS 安装Docker比较麻烦(Issue #172). docker官方 ...

  6. 【Docker】容器、虚拟机与Docker概念全解析

    导读 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.本文立足于新手,从容器和虚拟机两个大 ...

  7. 3.Docker与LXC、虚拟化技术的区别——虚拟化技术本质上是在模拟硬件,Docker底层是LXC,本质都是cgroups是在直接操作硬件

    先说和虚拟化技术的区别 难道虚拟技术就做不到吗? 不不不,虚拟技术也可以做到,但是会有一定程度的性能损失,灵活度也会下降.容器技术不是模仿硬件层次,而是 在Linux内核里使用cgroup和names ...

  8. Docker的save和export命令的区别

    我最近在玩Docker,一种应用程序容器和Linux的虚拟技术.它太酷了,创建Docker镜像和容器只需要几分钟.所有的工作都是开箱即用的. 在结束我一天的工作之前,我希望能保存下我的工作.但我在Do ...

  9. 【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别

    From the previous posts, I have analysed 4 different Docker multi-host network solutions - Calico, F ...

随机推荐

  1. canvas反向裁剪技巧

    我们都知道在canvas 可以通过clip来实现剪裁功能,其步骤一般是先设置要裁剪的区域(路径),然后通过ctx.clip()的实现裁剪,裁剪之后,后续的绘制只能在裁剪的区域显示效果,比如如下一段代码 ...

  2. Netty源码分析第1章(Netty启动流程)---->第2节: NioServerSocketChannel的创建

    Netty源码分析第一章:  Server启动流程 第二节:NioServerSocketChannel的创建 我们如果熟悉Nio, 则对channel的概念则不会陌生, channel在相当于一个通 ...

  3. QRCode 二维码

    一.生成二维码 1.二维码就是绘制成黑白相间的图片,所谓的黑白相间就是代表0和1 ,二维码大约可以容纳500多个中文,所以用途之广显而易见. 所需的jar包  http://pan.baidu.com ...

  4. 【一】,python简单爬虫实现

    一: 1.获取当前页的课程名称,地址:https://www.ichunqiu.com/courses/webaq 2.选取其中一门课程名称查看源代码: 代码如下: <p class=" ...

  5. MariaDB远程连接问题

    MariaDB在设置完通过Navicat Premium远程连接账号验证通过,但是无法正常使用工具的功能,只能使用sql语句查询,但是通过控制台命令功能正常. 经过修改账号权限,添加新用户等功能都无法 ...

  6. JavaScript设计模式-----模板方法模式

    模板方法模式是一种只需要使用继承就可以实现的非常简单点的模式. 模板方法模式有两部分组成,第一部分是抽象父类,第二部分是具体的实现子类.通常在抽象父类中封装了子类的算法框架,包括实现 一些公共方法以及 ...

  7. The serializable class XXX does not declare a static final serialVersionUID field of type long的警告

    原文: http://blog.csdn.net/ultrakang/article/details/41820543

  8. 20181023-11 Alpha发布

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2283 文案: Learning by Playing 界面清爽明快,UI ...

  9. 第26次Scrum会议(11/14)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/14 11:35~11:57,总计22min.地点:东北 ...

  10. Scrum Meeting 10.27

    1.会议内容: 姓名 今日任务 明日任务 预估时间(h) 徐越 配置SQLserver 学习本地和服务器之间的通信 4 卞忠昊 找上届代码的bug 学习安卓布局(layout)的有关知识,研究上届学长 ...