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

D伯爵D


我们单位最近在推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容器是一个在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轻量得多,因此其资源占用、性能消耗相比传统虚拟化都有很大优势。


互联网技术面试


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

在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是进程级别的


分享到:


相關文章: