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守护进程实现了静态向动态的转变。

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-11-11 13:09  IMSCZ  阅读(307)  评论(0编辑  收藏  举报