03.05 docker容器与虚拟机有什么区别?

D伯爵D


谢谢了!docker容器域虚拟机有什么区别呢?

docker容器:Docker 容器是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。

虚拟机:虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。虚拟系统通过生成现有操作系统的全新虚拟镜像,它具有真实windows系统完全一样的功能,进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件,保存数据,拥有自己的独立桌面,不会对真正的系统产生任何影响 ,而且具有能够在现有系统与虚拟镜像之间灵活切换的一类操作系统。虚拟系统和传统的虚拟机(Parallels Desktop ,Vmware,VirtualBox,Virtual pc)不同在于:虚拟系统不会降低电脑的性能,启动虚拟系统不需要像启动windows系统那样耗费时间,运行程序更加方便快捷;虚拟系统只能模拟和现有操作系统相同的环境,而虚拟机则可以模拟出其他种类的操作系统;而且虚拟机需要模拟底层的硬件指令,所以在应用程序运行速度上比虚拟系统慢得多。对比虚拟机与DockerDocker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。说了这么多Docker的优势,大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用,例如前端,后端以及数据库。


我是IT小明,感谢您的赏阅,欢迎点赞,评论,点击关注,发现更多精彩。回答真心不易,渴求你点个赞,鼓励一下,万分感谢!


IT小明


很高兴为您解答。

Docker悄无声息的来到我们身边,正在改变我们的开发、测试、部署应用的方式,那么,到底Docker和虚拟机VM有什么区别,我们通过一个图,再配上简明扼要的文字就很容易理解两者之间的区别。

首先要明确:Docker是一个开源的应用容器引擎,而VM是一个完整的操作系统。

1、使用VM运行多个相互隔离的应用

解释:

INFRASTRUCTURE:基础设施,直观的理解成个人计算机。
HOST OPERATIONG SYSTEM:个人计算机上的操作系统,可能是MacOS、Windowos或者Linux。
HYPERVISOR:个人计算机操作系统上的虚拟机管理系统,可以在主操作系统上运行多个从操作系统。
GUEST OS:虚拟机。

可以看到,APP #1、APP #2、APP #3如果要独立运行,相互隔离,则需要安装三个操作系统。如果一个虚拟操作系统按1G算,总共需要占3G的存储空间,更槽糕的是,光运行这三个操作系统就要耗费很大的内存和CPU。

2、使用Docker运行多个相互隔离的应用

DOCKER DAEMON:Docker守护进程,负责管理Docker容器。

Docker运行在主操作系统之上,APP #1、APP #2、APP #3在Docker中是完全隔离的、相经独立的容器。跟VM相比,省去了庞大的操作系统,耗费硬件资源较少。


除了以上架构上的差异之外,VM和Docker在启动时间上也有着很大的差距,VM启动大概需要2分钟的时间,而Docker启动则只需2秒。


随着互联网的发展,Docker的应用会越来越广,Build once,run anywhere,一次构建,到处运行。


程序员也有梦想


我们单位最近在推docker,已经在开发测试环境使用(稍显落后),下面我就谈谈自己的Docker的理解,以及Docker和虚拟机的区别。

虚拟机

先说说什么是虚拟机:在一台物理机器上,利用虚拟化技术,虚拟出来多个操作系统,每个操作系统之间是隔离的。

说起来有些绕,那么我们看看虚拟机的架构图,就容易理解了。例如我们要在一台物理机器运行三个Java项目,彼此之间隔离。

从下往上看,解释起来其实很简单:

最下面的一层就是物理机,可以是服务器,设置是一台个人电脑;

  • 电脑上需要安装操作系统,比如我们安装了win10的操作系统;


  • 再往上就是虚拟机软件了,比如我们常用的VirtualBox、VMWare,它们的作用是模拟计算机硬件;

  • 继续向上,就是虚拟机模拟出来的操作系统了;

  • 在虚拟的操作系统中,安装所需的软件、组件等。比如我们需要在虚拟操作系统中安装JDK、Tomcat等;

  • 最后就是具体的应用了,例如部署到Tomcat中。

Docker

再说说什么是Docker,找了一句官方的解释:Docker是开源的应用容器引擎。是不是又一头雾水?我们还是先看看Docker的架构图。

依然从下往上看:

  • 最下面两层,概念同上。

  • 往上,可以看做Docker容器的管理器。

  • 依赖和应用都被打包成了Docker镜像。例如,JDK、Tomcat、应用都被打包在了一起,运行在Docker容器里,容器和容器间是隔离的。

  • 这里提示:Linux支持Docker,Windows和MacOS的话,不直接支持(win10专业版好像可以直接支持,不过我都是安装Linux的虚拟机,在上面跑Docker)。

Docker和虚拟机的区别

  • 从两者的架构图上看,虚拟机是在硬件级别进行虚拟化,模拟硬件搭建操作系统;而Docker是在操作系统的层面虚拟化,复用操作系统,运行Docker容器。


  • Docker的速度很快,秒级,而虚拟机的速度通常要按分钟计算。

  • Docker所用的资源更少,性能更高。同样一个物理机器,Docker运行的镜像数量远多于虚拟机的数量。

  • 虚拟机实现了操作系统之间的隔离,Docker算是进程之间的隔离,虚拟机隔离级别更高、安全性方面也更强。

  • 虚拟机和Docker各有优势,不存在谁替代掉谁的问题,很多企业都采用物理机上做虚拟机,虚拟机中跑Docker的方式。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。


会点代码的大叔


从计算机软件层级来看,docker和虚拟机的区别在于虚拟的软件层级不一样。虚拟机基于同一个硬件,模拟出不同的操作系统;而docker基于同一个操作系统,模拟出不同的运行时环境。我们依次来看:

1. 先看看计算机的软件层次,从下到上依次为:操作系统内核、文件系统(运行时环境)、上层APP。

2. 虚拟机运行在同一个硬件上,可以虚拟出不同的操作系统。比如vmware可以在一台pc上既模拟出一个windows系统,同时也可以模拟出一台linux系统。借助虚拟机,两个不同的操作系统可以同时运行在同一个硬件之上。

3. 而docker则运行在同一个操作系统内核上,虚拟出不同的文件系统或者也可以叫做运行时环境。不同的运行时环境,其对应的文件系统也是不同的。比如java的运行时环境就要求文件系统里存在jdk,而golang的运行时环境则需要有go相关的底层库。在docker上既可以虚拟出一个java的运行时环境,也可以虚拟出go的运行时环境。甚至,

基于docker,你既可以虚拟出一个java-1.6的运行时候环境,也可以虚拟出一个java-1.8的运行时环境,而这两个运行时环境可以同时运行在同一个操作系统之上


以上就是虚拟机和docker的区别,更多容器云平台原创内容可关注我!


云平台架构


每日分享科技领域相关内容,有缘相遇,期待关注。

在IT行业从业多年,也算从看着时代从物理服务器走向虚拟化云计算时代,又准备进入Docker时代,作为下一代虚拟化技术,Docker正改变着整个行业开发、测试、部署应用的方式,至于虚拟化技术和docker技术到底有什么不同,下面来分析一下。


01 什么是虚拟化?

顾名思义,虚拟化技术是将物理资源以某种技术虚拟成资源池的形式,主要有一虚多和多虚一两种形式,比如个人电脑安装Vmware软件,可以在这个软件上安装其他Win系统、MacOS、Linux系统等,实现一台电脑/笔记本承载多个系统的优点,目前苹果笔记本用户双系统解决方案也以虚拟机为主,普通Windows用户可能需求量不大,而技术人员基本是必备软件了。


从企业层面来看,多虚一为主要形式,也就是将大量物理服务器集群虚拟化,形成一个资源池,在这个资源上创建各种不同的虚拟机,实现灵活部署。


02 什么是Docker

其实docker和虚拟技术很像,但又有一些不同点,一方面是两个技术的层级上,虚拟机一般是底层硬件Hardware支撑,上层是虚拟管理系统Hypervisor层,在上层开启不同的VM业务,如果需要将这些业务进行隔离,需要每个VM启动客户机操作系统,非常消耗资源。



Docker完全不同,底层有硬件和Host OS系统支撑,比如Windows/MacOS/Linux,中间抛去了臃肿的系统,而是以Docker守护进程代替,上层建立不同的容器,不同的应用镜像打包在不同的容器中,他们互相隔离。


03 虚拟化与docker的区别

docker设计小巧,部署迁移快速,运行高效,应用之间相互独立,管理人员可以看到所有容器的内容,虚拟化技术比较臃肿,不论什么应用都需要先创建新的系统,并且并非按照应用隔离,而是按照系统隔离,管理员无法看到系统内部信息。

举个例子,Docker就是手机中的各种APP,只需要一个系统就可以下载自己所需的应用,但是虚拟化技术相当于你的苹果手机安装一个庞大软件,这个软件上安装安卓系统、魅族系统等,每个系统上还要安装各类应用,比较麻烦。


但两者没有绝对的好坏,主要还是看应用场景,根据不同的需求选择不同的解决方案即可。



科技银狐


Docker容器基础知识

Docker容器是一个在Unix操作系统(如BSD和Solaris)中已经存在数十年的思想的最现代的体现,该思想认为给定进程可以在一定程度上独立于操作环境的其他部分而运行,虚拟机通过将整个操作系统实例用于需要划分的每个应用程序来提供隔离。这种方法提供了几乎完全隔离,但以显著的开销为代价。每个客户操作实例占用内存和处理能力,可以更好地致力于应用程序本身。

容器采取不同的方法。每个应用程序及其依赖项都使用操作系统资源的分区段。容器运行时(Docker,最常见)通过利用宿主操作系统提供的低级容器服务来设置和拆卸容器。

例如:要理解Linux容器,我们必须从cgroups和命名空间开始,Linux内核功能可以在容器和主机上运行的其他进程之间创建隔离。最初由IBM开发的Linux命名空间包装了一套系统资源,并将它们呈现给一个进程,使其看起来像是专门用于该进程。

最初由Google开发的Linux cgroup管理一组进程的系统资源(例如CPU和内存)的隔离和使用。例如,如果您的应用程序占用了大量CPU周期和内存(例如科学计算应用程序),则可以将应用程序放在cgroup中以限制其CPU和内存使用量。

命名空间处理单个进程的资源隔离,而cgroups管理一组进程的资源。cgroup和命名空间一起用于创建容器技术,称为Linux容器或LXC。

Docker如何更改容器

最初的Linux容器技术LXC是一种Linux操作系统级虚拟化方法,用于在单个主机上运行多个独立的Linux系统。命名空间和cgroup使LXC成为可能。

容器将应用程序与操作系统分离,这意味着用户可以拥有干净且最小的Linux操作系统,并在一个或多个隔离容器中运行其他所有操作系统。此外,由于操作系统是从容器中抽象出来的,因此您可以将容器移动到支持容器运行时环境的任何Linux服务器上。

Docker对LXC进行了几项重大更改,使容器更具便携性和灵活性。使用Docker容器,您可以比使用虚拟机更快速,更轻松地部署,复制,移动和备份工作负载。

Docker为任何能够运行容器的基础架构带来了类似云的灵活性。

Docker还提供了一种创建容器映像的方法 - 指定给定容器将运行的软件组件以及如何运行。Docker的容器镜像工具允许开发人员构建镜像库,将镜像组合成新镜像,并在本地或远程基础架构中启动应用程序。

Docker还可以更轻松地协调容器之间的行为,从而通过将容器连接在一起来构建应用程序堆栈。这些行为的更高级版本- 所谓的容器编排 - 由第三方产品提供。例如Kubernetes,Docker为此提供了基础。

通过采用LXC概念并围绕它构建API和生态系统,Docker的开发人员使得开发人员更容易使用容器,对企业更有用。最后,尽管Docker最初是在LXC上构建的,但最终Docker团队创建了自己的运行时,称为Libcontainer。Libcontainer不仅为容器提供了更丰富的服务层,而且使Docker团队更容易与Linux分开开发Docker容器技术。

如今,Docker是一个Linux或Windows实用程序,可以高效地创建,发送和运行容器。

Docker优势

Docker容器提供了一种构建企业和业务线应用程序的方法,这些应用程序比传统的应用程序更容易组装,维护和移动。

  • Docker容器支持隔离与限制

Docker容器使应用程序不仅彼此隔离,而且与底层系统隔离。这不仅可以实现更清晰的软件堆栈,还可以更轻松地指定给定的容器化应用程序如何使用系统资源- CPU,GPU,内存,I / O,网络等。它还可以更轻松地确保数据和代码保持独立。(请参阅下面的“Docker容器是无状态且不可变的”。)

  • Docker支持可移植性

Docker容器在支持容器运行时环境的任何机器上运行。应用程序不必绑定到主机操作系统,因此应用程序环境和底层操作环境都可以保持清洁和最小化。

例如,MySQL for Linux容器将在大多数支持容器的Linux系统上运行。应用程序的所有依赖项通常都在同一容器中提供。

基于容器的应用程序可以轻松地从本地系统移动到云环境或从开发人员的笔记本电脑移动到服务器,只要目标系统支持Docker以及可能与之一起使用的任何第三方工具,例如Kubernetes(请参阅下面的“Docker容器简化编排和缩放”)。

通常,必须为特定平台构建Docker容器映像。例如,Windows容器不能在Linux上运行,反之亦然。以前,解决此限制的一种方法是启动运行所需操作系统实例的虚拟机,并在虚拟机中运行容器。

然而,Docker团队后来设计了一种更优雅的解决方案,称为清单,它允许多个操作系统的镜像在同一镜像中并排打包。清单仍然被认为是实验性的,但它们暗示了容器如何成为跨平台应用程序解决方案以及跨环境应用程序解决方案。

  • Docker容器支持隔离与限制可组合性

大多数业务应用程序由几个单独的组件组成,这些组件组织成一个堆栈- 一个Web服务器,一个数据库,一个内存缓存。容器可以将这些部件组合成具有易于更换的部件的功能单元。每件作品都由不同的容器提供,可以独立于其他容器进行维护,更新,换出和修改。

这本质上是应用程序设计的微服务模型。通过将应用程序功能划分为独立的自包含服务,微服务模型提供了减缓传统开发过程和不灵活的单片应用程序的办法,轻量级和便携式容器使构建和维护基于微服务的应用程序变得更加容易。

  • Docker容器支持隔离与限制可组合性简化了编排和扩展

由于容器重量轻且开销很小,因此可以在给定系统上启动更多容器。但容器也可用于跨系统集群扩展应用程序,以及启动和关闭服务以满足需求高峰或节约资源。

用于部署,管理和扩展容器的大多数企业级版本的工具都是通过第三方项目提供的。其中最主要的是Google的Kubernetes,一个用于自动化容器部署和扩展方式的系统,以及它们如何连接在一起,负载平衡和管理。Kubernetes还提供了创建和重用多容器应用程序定义或“Helm charts”的方法,以便可以按需构建和管理复杂的应用程序堆栈。

Docker的告诫

容器解决了很多问题,但它们并非万能,有些缺点是设计上的; 有些是其性质的副作用

Docker容器不是虚拟机。人们用容器做出的最常见的概念错误就是将它们与虚拟机等同起来。但是,由于容器和虚拟机使用不同的隔离机制,因此它们具有明显不同的优点和缺点。

虚拟机为进程提供高度隔离,因为它们在自己的操作系统实例中运行。该操作系统也不必与主机上运行的操作系统相同。Windows虚拟机可以在Linux管理程序上运行,反之亦然。


相反,容器使用主机操作系统资源的受控部分; 许多应用程序以高度管理的方式共享相同的操作系统内核。因此,容器化应用程序不像虚拟机那样完全隔离,但它们为绝大多数工作负载提供了足够的隔离。

Microsoft在Windows上提供了两种类型的容器,这些容器在容器和虚拟机之间略微模糊了线条:

  • Windows Server Containers实际上是Windows上的Docker样式容器。Microsoft本质上为Windows内核提供了一些在Linux中用于执行隔离的相同机制,因此Docker容器可以在两个平台上具有相同的行为。

  • Hyper-V容器是在其自己的虚拟机中运行的容器,具有自己的内核以进行额外隔离。因此,如果需要,Hyper-V容器可以运行不同版本的Windows内核。如果需要,可以将常规容器转换为Hyper-V容器。

  • 请记住,虽然Hyper-V容器在Hyper-V管理程序上运行并利用Hyper-V隔离,但它们仍然是与完整虚拟机是不同的物种。

Docker容器不提供裸机速度

容器几乎没有虚拟机的开销,但它们的性能影响仍然是可测量的。如果您的工作负载需要裸机速度,那么容器可能能够让您足够接近- 比VM更接近- 但您仍然会看到一些开销。

Docker容器是无状态且不可变的

容器从描述其内容的镜像启动并运行。默认情况下,该镜像是不可变的- 一旦创建,它就不会改变。因此,容器没有持久性。如果启动容器实例,然后将其终止并重新启动它,则新容器实例将不会具有与旧容器关联的任何有状态信息。

这是容器与虚拟机不同的另一种方式。默认情况下,虚拟机在会话中具有持久性,因为它具有自己的文件系统。对于容器,唯一坚持的是用于引导容器中运行的软件的映像; 改变它的唯一方法是创建一个新的,修改过的容器镜像。


从好的方面来说,容器的无状态使得容器的内容更加一致,并且更容易且可预测地组成应用程序堆栈。它还迫使开发人员将应用程序数据与应用程序代码分开。

如果您希望容器具有任何类型的持久状态,则需要将该状态置于其他位置。这可能是数据库或在启动时连接到容器的独立数据卷。


Docker容器不是微服务

我之前提到容器如何用于创建微服务应用程序。这并不意味着接受一个给定的应用程序并将其粘贴到一个容器中会自动创建一个微服务。微服务应用程序必须根据微服务设计模式构建,无论它是否部署在容器中。可以将应用程序容器化作为将其转换为微服务的过程的一部分,但这只是许多步骤中的一个。

当虚拟机出现时,它们可以将应用程序与它们运行的系统分离。Docker容器将这一想法进一步发展- 不仅仅是通过比虚拟机更轻量级,更便携,更快速地启动,还通过提供虚拟机无法实现的扩展,组合和管理功能。


启迪云Tuscloud


docker解决的主要问题

有过后台开发经验的同学,一定遇到过下面这些问题:

  1. 程序在开发环境跑得好好的,但是部署到生产环境,却状况频出;

  2. 假设某个程序要在客户的环境上进行部署,虽然在自己的环境上部署、验证成功,但始终担心客户的环境上缺少某些必要的库文件,或者某些文件的版本不符合要求;

那么,有了docker,这些问题都将不复存在。

什么是docker

Docker是一个虚拟环境容器,可以将你的可执行文件、配置文件及一切其他你需要的文件一并打包到这个容器中,并发布和应用到任意平台。比如,你在本地用Python开发了一个网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。

如果不好理解,我们再拿集装箱打个比方。

集装箱解决了什么问题呢?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。

docker也是类似的理念。我们可以在一台机器上跑多个互相毫无关联的docker容器,每一个容器就相当于一个集装箱。

docker里的几个基本概念

  • 镜像

    镜像可以理解为一堆静态的文件

  • 容器

    容器则是镜像run起来之后的一个实例。镜像之于容器就好比面向对象编程里的class之于object。

  • 仓库

    镜像需要地方保存,这个地方就是仓库

与传统虚拟化的区别

这里我们顺便讲一下传统虚拟化。

我们看到,传统虚拟化是站在硬件物理资源的基础上,虚拟出多个OS,然后在OS的基础上构建相对独立的程序运行环境,而Dokcer则是在OS的基础上进行虚拟,显然Dokcer轻量得多,因此其资源占用、性能消耗相比传统虚拟化都有很大优势。


深夜老王


你好,我是全栈技术栈,很高兴回答你的问题

Docker是什么

Docker是一个软件箱子,或者称之为一个容器,容器间相互隔离的一钟容器技术。系统级别的容器,比如说一个CentOS,或一个Ubuntu的容器,只要一次构建,你就可以发布到在任何地方(各种您熟悉的操作系统),并且获得一个Linux(CentOS或Ubuntu)的虚拟运行环境。当然Docker也能提供服务级别(PHP,Go,C++等等)的容器,甚至是自定义应用程序(一个博客,一个电子商务网站等等)容器。注意:容器技术不只是单单指得是Docker,Docker比较流行,几乎成为容器技术的代名词。适合学习的人群本教程适用于那些有兴趣将Docker学习为容器服务的人。该产品在整个行业中像野火一样蔓延,并且正在对新一代应用的开发产生影响。所以有兴趣学习Docker所有方面的人都应该阅读本教程。学习具备的条件前提条件是读者应熟悉Windows的基本概念以及Windows操作系统上已有的各种程序。此外,如果读者对Linux有所了解,这将有所帮助。

Docker跟虚拟机的区别

虚拟机

  • 资源占用多,虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有1MB,虚拟机依然需要几百 MB 的内存才能运行。
  • 冗余步骤多,虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
  • 启动慢,启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

Docker

  • 启动快,容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
  • 资源占用少,容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要
希望我的回答能够帮到你,谢谢!

全栈技术栈


Docker容器启动、停止速度快\r\r Docker容器对资源需求较少\r\r Docker操作简单\r\r Dockerfile自动构建和部署方便




花老厮


结果上相似,都是提供独立的操作环境。

机制上南辕北辙,前者共享,后者封闭。

前者是共享单车,用了拿来,不用还回,资源独占少一些,后者是租赁汽车,资源要的多那么些,不过用起来更有保障。


分享到:


相關文章: