zoukankan      html  css  js  c++  java
  • Docker虚拟化之<基础理论>

    1.虚拟化技术的概念


    (1)虚拟化技术主要是将物理的资源转变为逻辑上可以管理的资源,以打破物理结构上的壁垒,让计算元件运行在虚拟的基础上,而不是真实的物理资源上。
    (2)虚拟化技术的底层是要进行虚拟化的 物理机硬件设备,通过虚拟化技术软件,可以将物理机虚拟生成N台虚拟机;应用程序、软件服务都可运行在虚拟机上,而不是直接运行在物理机设备上。

    2.虚拟化技术的意义


    (1)虚拟化技术主要是为了最大化的利用高配物理机的资源,提高资源的利用率,降低企业硬件成本、维护和管理成本。
    (2)淘汰老旧服务器资源,对老旧服务器资源进行重组重用。
    (3)加快企业服务器资源高效的管理和自动化运维的进程。

    例:企业生产环境,要求部署100个nginx服务,要求nginx服务独立部署,用户可以独立访问,可以使用如下方案:
    1)采购100台硬件服务器,标准配置(4C8G100GB),每台服务器部署1个nginx服务;
    2)采购10台高配硬件服务器,每台硬件服务器虚拟10台虚拟机(4C8G100GB),每个虚拟机服务部署一个nginx服务。
    注:从费用成本、维护成本考虑,应选择第二种方案。

    3.目前主流的虚拟化技术


    (1)KVM (2)VMware ESXI (3)XEN (4)VirtualBox (5)Open-vz (6)Hper-v (7)Docker

    4.虚拟化技术的种类


    (1)完全虚拟化技术:实际上是通过软件实现对操作系统的资源再分配,比较成熟。例如:KVM、VirtualBox
    (2)半虚拟化技术:通过代码修改已有的系统,形成一种新的可虚拟化的系统,调用硬件资源去安装多个操作系统,整体速度相对快一些。例如:Xen
    (3)轻量级虚拟化技术:介于完全虚拟化和半虚拟化之间。例如:Docker虚拟化 

     5.docker虚拟化简介


    (1)Docker是一个开源的应用容器引擎,让开发者可以打包他们的 应用以及依赖包 到一个可移植的容器中,然后发布到任何流行的Linux机器上。
    (2)容器时完全使用沙箱机制,相互之间不会有任何接口;几乎没有性能开销,可以很容易地在机器和数据中心中运行;不依赖任何语言、框架、系统。
    (3)Docker的基础是Linux容器(LXC),在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。
    (4)用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。 

     6.Docker虚拟化和传统虚拟化的不同


    (1)Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统。
    (2)传统虚拟化则是在硬件的基础上,虚拟出自己的系统,然后在系统上部署相关的应用。

     7.镜像、容器、仓库


    (1)镜像:Docker镜像跟Linux ISO镜像类似,主要是存储各种应用程序、软件服务、各种数据等。Docker镜像内容是只读的,不能被修改。
    (2)容器:Docker容器是基于Docker镜像运行之后的实例,类似进程和程序的关系。Docker容器是可读、可写的,但不能直接修改镜像的数据内容,镜像是持续为容器提供服务,没有镜像就没有容器。
    (3)仓库:存放镜像的地方,分为公共仓库和私有仓库。企业测试、生产环境 推荐自建私有仓库,安全、稳定、高效。

     8.Docker的Linux容器(LXC)和CGroup

    (1)CGroup在最底层落实资源管理,LXC在CGroup上封装了一层,Docker又在LXC上封装了一次。

    (2)CGroup是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制。

    (3)没有CGroup就没有LXC,也就没有Docker。

    (4)LXC可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制 以及全虚拟化的其他复杂性。

    (5)LXC有效地将 由单个操作系统管理的资源 划分到孤立的组中,以更好地在孤立的组之间 平衡有冲突的资源使用需求。

    (6)LXC建立在CGroup基础上,LXC=CGroup+namespace+Chroot+veth+用户态控制脚本。

    (7)LXC利用内核的新特性(CGroup)来提供用户空间的对象,用来保证资源的隔离和对于应用或者系统的资源控制。

    注1:典型的Linux系统由bootfs和rootfs两部分组成。

    (1)bootfs(boot file system)主要包含bootloader和kernel;bootloader主要是引导加载kernel,当kernel被加载到内存中后,bootfs就被卸载(umount)。

    (2)rootfs(root file system)包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等目录和文件。

    注2:

    (1)Docker容器的文件系统最早建立在AUFS基础上。

    (2)AUFS(another union file system),是一种Union FS,支持将不同的目录挂载到同一个虚拟文件系统下,并实现一种层(layer)的概念。

    (3)由于AUFS未能加入到Linux内核,因考虑兼容性问题,加入了DeviceMapper的支持。Docker目前默认运行在DeviceMapper基础上。

    注3:

    (1)AUFS将挂载到同一虚拟文件系统下的多个目录分别设置成read-only、read-write、whiteout-able权限。

    (2)对read-only目录只能读,而写操作只能实施在read-write目录中。

    (3)写操作是在read-only上的一种增量操作,不影响read-write目录。当挂载目录的时候,要严格按照各目录之间的这种增量关系,将被增量操作的目录优先于 在他基础上增量操作的 目录挂载,待所有目录挂载结束,继续挂载一个read-write目录,如此形成一种层次结构。

    注4:

    (1)传统的Linux加载bootfs时,会先将rootfs设为read-only,然后在系统自检之后将rootfs从read-only改为read-write,然后就可以在rootfs上进行写和读的操作。

    (2)Docker的镜像却不想上述那样,它在bootfs自检完毕之后并不会把rootfs的read-only改为read-write。而是利用union mount(UnionFS的一种挂载机制) 将一个或多个read-only的rootfs加载到之前的read-only的rootfs层之上。

    (3)在加载了多层的rootfs之后,仍然让它看起来只像一个文件系统,在Docker的体系里,把union mount的这些read-only的rootfs叫做 Docker的镜像。但此时的每一层rootfs都是read-only的,还不能对其进行操作。

    (4)当创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。

    9.Device Mapper

    (1)Device Mapper是Linux2.6内核中支持逻辑卷管理的通用设备映射机制,它为实现 用于存储资源管理的 块设备驱动 提供一个高度模块化的内核架构。

    (2)在内核中,它通过一个一个模块化的target driver插件实现对IO请求的过滤或者重定向等工作。

    (3)当前已经实现的target driver(目标驱动程序)插件包括:raid、软加密、逻辑卷条带、多路径、镜像、快照等。途中linear、mirror、snapshot、multipath表示的就是这些目标驱动程序。

    (4)Device Mapper进一步体现了Linux内核涉及中 策略和机制分离的原则,将所有与策略相关的工作放到用户空间完成,内核中主要提供完成这些策略所需要的机制。

    注:

    (1)Device Mapper用户空间相关部分,主要负责配置具体的策略和控制逻辑,比如逻辑设备和哪些物理设备建立映射,怎么建立这些映射关系等。

    (2)具体过滤和重定向IO请求的工作由内核中相关代码完成。

    (3)因此,整个Device Mapper机制由两部分组成:内核空间的Device Mapper驱动、用户空间的Device Mapper库以及它提供的dmsetup工具。

     10.Docker虚拟化的特点

    (1)操作启动快

    • 运行时的性能可以获取极大提升,管理操作(启动、停止、重启等)都是以秒或毫秒为单位。

    (2)轻量级虚拟化

    • 仅需添加或减小镜像,就可以获得足够的“操作系统”。只要配置够高,一台服务器上可以虚拟出100台以上的容器。

    (3)开源免费

    • 开源免费,成本低。由现代Linux内核支持并驱动。

    (4)前景及云支持

    • 正越来越受欢迎,各大主流公司都在推动Docker的发展,性能有很大的优势。

    (5)跟传统VM比较,具有以下缺点

    • 目前知道的人比较少;
    • 相关的中文技术资料欠缺;
    • Go语言还未完全成熟;

     11.Docker的优势

    (1)交付和部署更快速

    • Docker允许开发者在装有应用和服务的本地容器做开发。可以直接集成到可持续开发流程中。
    • 开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。
    • Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。
    • 启动时间是秒级的,大量节约开发、测试、部署的时间。

    (2)部署和扩容更高效

    • Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序 从一个平台直接迁移到另一个平台。
    • Docker的兼容性和轻量特性可以很轻松的实现负载的动态管理。你可以快速扩容 或 下线你的应用和服务。

    (3)资源利用率更高

    • 一台主机上可以同时运行数千个Docker容器。
    • 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高。
    • 传统虚拟机方式运行10个不同的应用就要启动10个虚拟机,而Docker只需启动10个隔离的应用即可。

    (4)管理更方便

    • 使用Docker,只需小小的修改,就可以替代以往大量的更新工作。
    • 所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

    12.Docker引擎架构

    (1)Docker引擎是一个C/S结构的应用 。

    (2)server是一个常驻进程。

    (3)REST API实现了client和server间的交互协议。

    (4)CLI实现容器和镜像的管理,为用户提供统一的操作界面。

    (5)Client通过接口 与 Server进程通信,实现容器的构建、运行和发布。

    (6)Client和Server可以运行在同一台集群,也可以通过跨主机实现远程通信。

    13.Docker镜像原理

    (1)一个完整的Docker镜像可以支撑一个Docker容器的运行;在Docker容器运行的过程中,主要提供文件系统数据支撑。

    (2)Docker镜像有以下特性

    • 镜像分层,每个镜像都由一个或多个镜像层组成。
    • 可以通过在某个镜像上 加一定的镜像层 得到新镜像。(此过程可以通过编写dockerfile 或 基于容器commit实现)
    • 每个镜像层都拥有唯一镜像ID。
    • 镜像在存储和使用时,会根据ID共享相同的镜像层,所以在pull镜像时,已有的镜像层会自动跳过下载。
    • 每个镜像层都是只读,即使启动成容器,也无法对其真正的修改,修改只会作用于最上层的容器层。

    (3)Docker容器,可以理解为一个或多个运行进程,这些运行进程占有相应的内存、CPU、虚拟网络设备、文件系统 等资源。

    (4)Docker容器所占用的文件系统资源,通过Docker镜像的镜像层文件来提供。

    (5)Docker可以通过解析Docker镜像的json文件,获知应该在这个镜像之上运行什么样的进程,应该为进程配置怎么样的环境变量,Docker守护进程实现了静态向动态的转变。

     

     

     

     

     

     

     

  • 相关阅读:
    86. Partition List
    328. Odd Even Linked List
    19. Remove Nth Node From End of List(移除倒数第N的结点, 快慢指针)
    24. Swap Nodes in Pairs
    2. Add Two Numbers(2个链表相加)
    92. Reverse Linked List II(链表部分反转)
    109. Convert Sorted List to Binary Search Tree
    138. Copy List with Random Pointer
    为Unity的新版ugui的Prefab生成预览图
    ArcEngine生成矩形缓冲区
  • 原文地址:https://www.cnblogs.com/IMSCZ/p/11551664.html
Copyright © 2011-2022 走看看