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

这是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)只会记录改变的地方。

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

null

时间: 2024-10-14 06:49:27

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

知道docker与虚拟机的性能区别吗?

1)docker与虚拟机实现的原理是怎样的呢?     从结构 来看,左图虚拟机的Guest OS层和Hypervisor层在docker中已经被Docker Engine层所取代,在这里我们 需要知道的是Guest OS是虚拟机安装的操作系统,是一个完整的系统内核,另外,Hypervisor可以理解为一个硬件 虚拟化平台,它在Host OS层是以内核驱动状态存在的:虚拟机实现资源隔离的方式就是利用独立的Guest OS,并Hypervisor虚拟化CPU,内存,IO等设备实现:     对比虚

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

上篇文章我们成功在Windows下安装了Docker,输出了一个简单的Hello World程序.本文中我们将利用Docker已有的云端镜像training/webapp来发布一个简单Python的Web程序,在浏览器中输出hello world. 本文内容的测试环境是Windows7下的Docker,用例基于官方文档用例.   一:从运行一个简单的Python Web程序说起 启动Docker客户端并登陆.在客户端中输入以下内容: $ sudo docker run -d -P trainin

struts2的标签和一般的html标签的区别

1.s:textfield 和 input <s:textfield name="type.name" id="type_name" label="名称"></s:textfield> 相当于 <td ><label >名称:</label></td> <td> <input type="text" name="type.nam

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

先说和虚拟化技术的区别 难道虚拟技术就做不到吗? 不不不,虚拟技术也可以做到,但是会有一定程度的性能损失,灵活度也会下降.容器技术不是模仿硬件层次,而是 在Linux内核里使用cgroup和namespaces来打造轻便的.将近裸机速度的虚拟技术操作系统环境.因为不是虚拟化存储,所以容器技术不会管 底层存储或者文件系统,而是你放哪里,它操作哪里. 这从根本上改变了我们如何虚拟化工作负载和应用程序,因为容器速度比硬件虚拟化技术更快,更加便捷,弹性扩容的更加高效,只是它的工作负载要求操作系统,而不是

Windows安装Docker Xshell无法连接虚拟机解决方案

因为公司需要做项目,在自己电脑上安装了docker,安装的方法见链接:http://my.oschina.net/u/188924/blog/388052 但是到了链接xshell的时候一直链接不上VirtualBox.ping VirtualBox里面的docker的IP也ping不通,找了各种方法. git执行boot2docker.exe ssh能连接,就是Xshell跟ping不通IP. 修改VirtualBox的网络的设置后就可以了,网卡1的设置,可以改端口号: 主要是网卡2的设置:改

Asp.Net Core 发布到 Docker(Linux Centos 虚拟机,使用Dockerfile)

实践一下 Asp.Net Core (基于.net core 2.2)部署到Docker 一.准备工作: 1. 使用Virtualbox创建一个Centos系统的虚拟机,并安装docker和vim 2. 配置好端口(如下图,后面需要使用) 3. 准备一个网站发布包(我采用的默认的Asp.Net Core MVC),windows发布时的配置(也可以在linux上进行发布),将发布包放入linux虚拟机(我的路径是:/root/Root/DefaultHttp/publish) 4. 测试一下发布

云计算学习路线图课件:云计算和虚拟机有什么区别?

云计算是一种服务模式,这种模式并不是计算机行业所特有,也不是现代所特有,而是一种已经存在很久的服务模式.其思路就是把各种资源整合起来,然后租给有需要的用户. 拿图书馆做比较,大家都很熟悉了,图书馆收集了很多书,如果你想看书,只需要到图书馆根据自己的需求去借就好了,图书馆会根据你借的数量以及时间收费,你看完了就还给图书馆,书重新放回到原来的书架,其他用户 云计算的好处也出来了,你为什么要租服务器,而不是自己买,因为你可能只是想用一段时间,相对于你自己买服务器,成本太高了,租用更方便.另外,你自己买

基于OpenStack+Docker设计与实现CI/CD

基于Docker容器技术的OpenStack研发.测试.运维及其相关的CI/CD.DevOps等活动.思想是相通的,读者可以取其可用部分用于自己的业务需求中. IaaS云和容器云不是可有可无.相互竞争的关系,而是相互弥补彼此缺陷的关系.容器改变了应用部署和管理的模式,众所周知,IaaS云通过提供基本的计算.存储和网络来运行虚拟机(VM),在IaaS(基础设施即服务)之上,还有PaaS(平台即服务).SaaS(软件即服务).CaaS(容器即服务).OpenStack作为一个IaaS云的基础设施管理

Docker介绍

Docker 是 Golang 编写的, 自 2013 年推出以来,受到越来越多的开发者的关注.如果你关注最新的技术发展,那么你一定听说过 Docker.不管是云服务还是微服务(Microservices),越来越多的厂商都开始基于 Docker 作为基础设施自动化的工具.那么什么是 Docker?Docker与传统的虚拟机有什么区别?为何要采用 Docker?如何使用 Docker? 本文,就针对上述提到的问题,来简单介绍下 Docker. 什么是 Docker Docker 是开源的应用容器