问:

我多次重读Docker.io文档,希望搞明白Docker.io和一个完全的虚拟机的区别。Docker是如何做到提供一个完整的文件系统,独立的网络环境等等这些功能,同时还没有如此庞大?

为什么部署软件在一个docker镜像(image)比部署在一致的生产环境上要容易?

答:

当前,Docker内部使用的是Linux容器技术(LXC),这是运行在与它的宿主机器同样的操作系统上。这准许它可以和宿主机器共享许多系统资源。它也会使用AuFS作为文件系统,也为你管理网络。

AuFS是一个层状的文件系统,因此你可以有一个只读部分和一个只写部分,然后将二者组合起来。你可以使系统的共同的部分用作只读,那块是被所有容器共享,并且给每个容器自己的可写区域

好吧,让我们假设你有一个容器镜像(image)容量是1GB,如果你想用一个完整的虚拟机来装载,你得需要容量的大小是1GB乘上你需要虚拟机的数量。但使用Linux容器虚拟化技术(LXC)和AuFS,你可以共享1GB容量,如果你需要1000个容器,假设他们都运行在同样的系统影像上,你仍然可以用稍微比1GB多一点的空间来给容器系统,

一个完整的虚拟化系统得到了分给它的自有全部资源,只有最小的共享。你获得了更多的隔离,但是这是很庞大的(需要更多的资源)

使用Linux容器虚拟化技术(LXC),隔离性方面有所缺失,但是他们更加轻量,而且需要更少资源。所以你可以轻松运行1000个容器在一个宿主机器上,甚至眼都不眨。试着用Xen来实现那个,我想除非你有一个超级强大的主机,不然我看是不可能的了

一个完整的虚拟系统通常得用几分钟去启动,linux容器虚拟技术(LXC)只要数秒,甚至有时时间更短。

对于每种虚拟系统都有反对者和支持者。如果你希望一个完全隔离的和资源有保障的环境,那么完全的虚拟机是你的选择。如果你只希望进程之间相互隔离,并且希望大量运行他们在一个合理大小的宿主机器上。那么linux容器虚拟技术(LXC)是你的选择。

更多有关信息,可以参考这些博客,这非常详细介绍了LXC的工作 http://blog.dotcloud.com/under-the-hood-linux-kernels-on-dotcloud-part

"为嘛在docker镜像上部署软件比在一致生产环境上容易?"我觉得问这个问题是非常愚蠢的

部署一个一致的生产环境说起来容易做起来难。即使你使用了chef 和puppet之类的工具,像操作系统升级,还有一些其它的事情而造成的主机及环境之间的改变,往往是常有的事。

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

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

编辑:来着评论…

  有趣!我觉得我仍然对于“系统快照”的概念有些模糊,如何没有使用这些系统 镜像(image)会怎么样啊?

好的,试着看我能不能解释。你开始有个基础 镜像(image),然后进行改变数据,并且使用docker提交这些改变,这个会建立一个镜像(image),这个 镜像(image)只包含数据改变的部分。当你想运行你的这个 镜像(image)你仍然需要这基础 镜像(image),然后使用层式的文件系统,将你的映像置于基础映像之上,这个例子中用AUFS,AUFS将不同层融合起来,然后你就会得到你想要的,你只要简单运行就可以了。你可以增加许多的 镜像(image),这些 镜像(image)只会记录改变的地方。

译文链接:http://www.oschina.net/translate/how-is-docker-io-different-from-a-normal-virtual-machine

原文链接:http://stackoverflow.com/questions/16047306/how-is-docker-io-different-from-a-normal-virtual-machine

这是我翻译的国外博客,如需转载请注明出处和原文链接,还要感谢 super0555的帮助

原文链接:http://blog.golang.org/playground

Docker 和一个正常的虚拟机有何区别?的更多相关文章

  1. 关于容器、虚拟机以及 Docker 的一个入门教程

    Yves yao · 2017-09-05翻译 · 1315阅读 原文链接 huangxiaolu审校   源地址:http://zcfy.cc/article/a-beginner-friendly ...

  2. 如何使用Docker部署一个Go Web应用程序

    熟悉Docker如何提升你在构建.测试并部署Go Web应用程序的方式,并且理解如何使用Semaphore来持续部署. 简介 大多数情况下Go应用程序被编译成单个二进制文件,web应用程序则会包括模版 ...

  3. 手把手教你用Docker部署一个MongoDB集群

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的.支持类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引 ...

  4. Swoft 新手向教程 - 通过 Docker 搭建一个开发环境

    本系列文章将从使用层面介绍 Swoft 框架的使用及业务开发,面向初中级的 PHPer Swoft首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈组件化框架,内置协程网络服务器及常用的 ...

  5. Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅

    通过 Docker 化一个博客网站来开启我们的 Docker 之旅 这篇文章包含 Docker 的基本概念,以及如何通过创建一个定制的 Dockerfile 来 Docker 化Dockerize一个 ...

  6. 如何通过Docker搭建一个swoft开发环境

    本篇文章给大家分享的内容是关于如何通过Docker搭建一个swoft开发环境 ,内容很详细,有需要的朋友可以参考一下,希望可以帮助到你们. Swoft首个基于 Swoole 原生协程的新时代 PHP ...

  7. 访问docker desktop创建的Hyper-v虚拟机DockerDesktopVM

    平常我们部署kubernetes ,一般都是先安装个linux操作系统,不管是centos或者ubuntu或者其他,都是我们手工操作的.安装好的这个操作系统都开启了SSH,能够远程登录访问. 但是do ...

  8. 用Docker搭建一个支持https的nginx代理服务

    用Docker搭建一个支持https的nginx代理服务 说明:本文所提的服务只是作者平常测试使用,可能含有未知bug或不成熟的解决方案,仅供参考,请不要用于正式环境,当然,使用过程中有任何问题欢迎提 ...

  9. Docker 运行一个Web应用

    使用 docker 构建一个 web 应用程序. 我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用 参数说明: -d:让容器在后台运行. -P:将容器内部使用的网 ...

随机推荐

  1. Java程序的结构

    1.由一个或多个独立的类组成: 2.最多一个公有类 3.源代码文件名必须与类名相同 4.类由一个或多个方法组成,其中公有类中的main()方法作为程序的入口. 注:javaSE中一定有main方法. ...

  2. 算法笔记_076:蓝桥杯练习 结点选择(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多 ...

  3. Win10注销在哪?怎么注销电脑

    进入Win10电脑桌面,同时按住键盘上的[Alt]+[F4]组合快捷键,可以快速呼出[关闭Windows]操作选项,在下面的"您希望计算机所什么"里选择[注销],然后点击底部的[确 ...

  4. struts2 ValueStack的作用

    Value Stack的作用: 1.       可以作为一个数据中转站 2.       用于在前台-后台之间传递数据,最典型的做法就是struts2标签也ognl表达式的结合.我用得最多的就是数据 ...

  5. 一个编译可执行jar包 jar包中不包含resources下config.properties且可以读到config.properties文件且classpath中有当前路径的pom

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  6. Java Jaxb JavaBean与XML互转

    1.Jaxb - Java Arcitecture for XML Binding 是业界的一个标准,是一项能够依据XML Schema产生Java类的技术. Jaxb2.0是Jdk1.6的组成部分. ...

  7. java 判断一个字符串是否包含某个字符串中的字符

    public static void main(String[] args) {       if(isHave("购买ab","出售AssBC"))   Sy ...

  8. 每秒处理3百万请求的Web集群搭建-如何生成每秒百万级别的 HTTP 请求?

    本文是构建能够每秒处理 3 百万请求的高性能 Web 集群系列文章的第一篇.它记录了我使用负载生成器工具的一些经历,希望它能帮助每一个像我一样不得不使用这些工具的人节省时间. 负载生成器是一些生成用于 ...

  9. 键盘enter按钮出发登陆事件

    $("#nameInput").focus();$(".txtUserName").keydown(function (event) { if (event.k ...

  10. property 与 attribute 的区别?

    一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质. 属性: class TimePeriod { private double seconds; public double Ho ...