• home > tools > Virtual > Docker >

    虚化技术新冠Docker的优势与传统虚拟机VMware的异同

    Date:

    各种虚拟机技术开启了云计算时代;而Docker,作为下一代虚拟化技术,有着小巧、迁移部署快速、运行高效等特点。但是需要根据不同的应用场景和需求采用不同的方式使用Docker技术或使用服务器虚拟化技术。

    什么是docker

    Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源。

    Docker 是一个开源的应用容器引擎,使用 Go 语言 进行开发实现,它不同于与 KVM 和 Xen,docker 基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。

    Docker 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。所以它非常的轻量。使用 docker 可以解决我们的软件开发中的依赖和开发环境统一等问题。

    Docker容器简介

    Docker是一个虚拟环境容器,可以将你的可执行文件、配置文件及一切其他你需要的文件一并打包到这个容器中,并发布和应用到任意平台。

    什么是虚拟化?

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

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

    Docker容器并非虚拟机!

    Docker与传统虚拟化的区别

    各种虚拟机技术开启了云计算时代;而Docker,作为下一代虚拟化技术,正在改变我们开发、测试、部署应用的方式。那虚拟机与Docker究竟有何不同呢?

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

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

    Docker与传统虚拟化架构对比

    docker与虚拟机

    • 传统虚拟化是站在硬件物理资源的基础上,虚拟出多个OS,然后在OS的基础上构建相对独立的程序运行环境

    • Dokcer是在OS的基础上进行虚拟,显然Dokcer轻量得多,因此其资源占用、性能消耗相比传统虚拟化都有很大优势。

    • 虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。

    • Docker通常用于隔离不同的应用,例如前端,后端以及数据库。


    虚拟机结构

    使用虚拟机运行多个相互隔离的应用时

    • 基础设施(Infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机。

    • 主操作系统(Host Operating System)。你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版。

    • 虚拟机管理系统(Hypervisor)。利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。类型2的Hypervisor有VirtualBox和VMWare。

    • 从操作系统(Guest Operating System)。假设你需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个从操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存。

    • 各种依赖。每一个从操作系统都需要安装许多依赖。如果你的的应用需要连接PostgreSQL的话,则需要安装libpq-dev;如果你使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库。

    Docker容器结构

    • 主操作系统(Host Operating System)。所有主流的Linux发行版都可以运行Docker。对于MacOS和Windows,也有一些办法"运行"Docker。

    • Docker守护进程(Docker Daemon)。Docker守护进程取代了Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器。

    • 各种依赖。对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的。

    • 应用。应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。

    理解docker的精髓

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

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

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

    Docker里的几个基本概念

    • 镜像:镜像可以理解为一堆静态的文件。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

      镜像是标准的,无论在哪个容器运行环境,将同样的镜像运行起来,都能还原当时的那一刻。

    • 容器:容器则是镜像run起来之后的一个实例。镜像之于容器就好比面向对象编程里的class之于object,镜像就好像是类而容器就是实例容器有两个特性,一个是封装,一个是标准。有了容器镜像,就可以将应用的各种配置,文件路径,权限封装起来,然后像孙悟空说“定”,就定在了封装好的那一刻。

      容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样

    • 仓库:镜像构建完成后,需要地方保存,这个地方就是仓库。可以用它来集中的存储、分发镜像。Docker Registry 就是这样的服务

    容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为 容器存储层。当容器消亡时,容器存储层也随之消亡,上面的存储的信息都会被删除。如果想数据不随着容器退出而被删除,可以使用数据卷或绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。容器消亡,数据卷不会消亡。

    参考文章:

    【Docker&VM】docker容器与虚拟机有什么区别?https://www.jianshu.com/p/50f48eb25215

    容器如“衣服”,而虚拟机却是“房子” https://virtual.51cto.com/art/201803/568648.htm

    Docker 零基础入门 https://www.centos.bz/2019/07/docker-零基础入门/#镜像



    转载本站文章《虚化技术新冠Docker的优势与传统虚拟机VMware的异同》,
    请注明出处:https://www.zhoulujun.cn/html/tools/Virtual/docker/8350.html