[关闭]
@adamhand 2018-08-25T13:42:48.000000Z 字数 5471 阅读 777

Docker札记


1. 从历史讲起:环境配置的难题

  软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?
  用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。
  如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:"它在我的机器可以跑了"(It works on my machine),言下之意就是,其他机器很可能跑不了。
  环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

2. 虚拟化技术

2.1 几个概念

(1)物理平台----实现虚拟技术的真实物理硬件和操作系统平台。
(2)虚拟平台----在物理平台上,虚拟出来的运行不同操作系统的各种虚拟机。
(3)VMM----虚拟机监视器,一种监控和管理虚拟机运行的核心软件层,也叫Hypervisor。
(4)宿主机----真实的物理服务器,上面可以运行虚拟出来的虚拟机。
(5)客户机----就是指从宿主机上虚拟出来的虚拟机。

2.2 什么是虚拟化

  虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

2.3 Hypervisor是什么

  Hypervisor一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。也可叫做VMM( virtual machine monitor ),即虚拟机监视器。
  Hypervisor是一种在虚拟环境中的“元”操作系统。他们可以访问服务器上包括磁盘和内存在内的所有物理设备。Hypervisor不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。当服务器启动并执行Hypervisor时,它会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存,CPU,网络和磁盘。

2.4 虚拟化技术的分类

2.4.1 完全向虚拟化

  最流行的虚拟化方法,使用Hypervisor这种中间层软件,在虚拟服务器和底层硬件之间建立一个抽象层。
  Hypervisor可以捕获CPU指令,为指令访问硬件控制器和外设充当中介。因而,完全虚拟化技术几乎能让任何一款操作系统不用改动就能安装到虚拟服务器上,而它们不知道自己运行在虚拟化环境下。主要缺点是,性能方面不如裸机,因为Hypervisor需要占用一些资源,给处理器带来开销。
  在完全虚拟化的环境下,Hypervisor运行在裸硬件上,充当主机操作系统,而由Hypervisor管理的虚拟服务器运行客户端操作系统(Guest OS)。

2.4.2 准虚拟化

  完全虚拟化是处理器密集型技术,因为它要求Hypervisor管理各个虚拟服务器,并让它们彼此独立。减轻这种负担的一种方法就是,改动客户操作系统,让它以为自己运行在虚拟环境下,能够与Hypervisor协同工作,这种方法就叫准虚拟化。
  准虚拟化技术的优点是性能高。经过准虚拟化处理的服务器可与Hypervisor协同工作,其响应能力几乎不亚于未经过虚拟化处理的服务器。它的客户操作系统(Guest OS)集成了虚拟化方面的代码。该方法无需重新编译或引起陷阱,因为操作系统自身能够与虚拟进程进行很好的协作。

2.4.3 操作系统层虚拟化

  实现虚拟化还有一个方法,那就是在操作系统层面增添虚拟服务器功能。就操作系统层的虚拟化而言,没有独立的Hypervisor层。相反主机操作系统本身就负责在多个虚拟服务器之间分配硬件资源,并且让这些服务器彼此独立。一个明显的区别是,如果使用操作系统层虚拟化,所有虚拟服务器必须运行同一操作系统。
  虽然操作系统层虚拟化的灵活性比较差,但本机速度性能比较高。此外,由于架构在所有虚拟服务器上使用单一、标准的操作系统,管理起来比异构环境要容易。

2.4.4 桌面虚拟

  服务器虚拟化主要针对服务器而言,而虚拟化最接近用户的还是要算的上桌面虚拟化了,桌面虚拟化主要功能是将分散的桌面环境集中保存并管理起来,包括桌面环境的集中下发,集中更新,集中管理。桌面虚拟化使得桌面管理变得简单,不用每台终端单独进行维护,每台终端进行更新。终端数据可以集中存储在中心机房里,安全性相对传统桌面应用要高很多。桌面虚拟化可以使得一个人拥有多个桌面环境,也可以把一个桌面环境供多人使用,节省了license。另外,桌面虚拟化依托于服务器虚拟化。没有服务器虚拟化,这个桌面虚拟化的优势将完全没有了。不仅如此,还浪费了许多管理资本。

2.4.5. 硬件虚拟化

  英特尔虚拟化技术(IVT,Intel Virtualization Technology)是由英特尔开发的一种虚拟化技术,利用IVT可以对在系统上的客操作系统,通过虚拟机查看器(VMM,Virtual Machine Monitor)来虚拟一套硬件设备,以供客操作系统使用。这些技术以往在VMware与Virtual PC上都通过软件实现,而通过IVT的硬件支持可以加速此类软件的进行。
  AMD虚拟化(AMD Virtualization),缩写为“AMD-V”,是AMD为64位的x86架构提供的虚拟化扩展的名称,但有时仍然会用“Pacifica”(AMD开发这项扩展时的内部项目代码)来指代它。

2.5 常见的虚拟化技术

  虚拟化技术指的是软件层面的实现虚拟化的技术,整体上分为开源虚拟化和商业虚拟化两大阵营。典型的代表有:Xen,KVM,WMware,Hyper-V、Docker容器等。
  Xen和KVM,是开源免费的虚拟化软件;WMware是付费的虚拟化软件;Hyper-V微软的收费虚拟化技术;Docker是一种容器技术,属于一种轻量级虚拟化技术。
  虚拟化软件产品有很多,无论是开源还是商业的,上面只是列举了很少的几款,每款软件产品有其优缺点以及应用场景,需要根据业务场景选择,下面简单介绍一下KVM和Xen。

2.5.1 传统虚拟化技术(VirtualBox,VMWare)

  通过在Linux上安装虚拟化软件, 然后通过虚拟化软件来安装虚拟机系统, 大致结构如下:

  VM是由虚拟化软件(VirtualBox, VMWare…)来管理的, Linux Kernel不能直接管理到各个VM。
  VirtualBox:oracle公司的直接基于Intel VT及AMD-V的虚拟机管理软件。
  VMware Workstation:Wmware公司的基于Wmware虚拟技术的虚拟机管理软件。

2.5.2 Xen

  Xen是第一类运行在裸机上的虚拟化管理程序(Hypervisor)。它支持全虚拟化和准虚拟化,Xen支持hypervisor和虚拟机互相通讯,而且提供在所有Linux版本上的免费产品,包括Red Hat Enterprise Linux和SUSE Linux Enterprise Server。
  Xen最重要的优势在于准虚拟化,此外未经修改的操作系统也可以直接在Xen上运行(如Windows),能让虚拟机有效运行而不需要仿真,因此虚拟机能感知到Hypervisor,而不需要模拟虚拟硬件,从而能实现高性能。

2.5.3 KVM(Kernel-based Virtual Machine)基于内核的虚拟化

  KVM是集成到Linux内核的Hypervisor,是X86架构且硬件支持虚拟化技术(Intel VT或AMD-V)的Linux的全虚拟化解决方案。它是Linux的一个很小的模块,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。KVM是Linux的虚拟机基于KVM虚拟技术的单机版虚拟机管理软件。

2.5.4 linux容器(LXC-Linux container)

  LXC 是非常轻量级的, 它将 VM 的进程也伪装成 HOST 的进程. 大致的结构如下:

  那么, 对于某些系统进程, PID是固定的, 比如 init进程的PID=1, VM中的 init进程的PID是如何处理的呢?
  原来, VM的 init进程的PID在 HOST的进程表中会显示成其它PID(>1)。
  从上面可以看出, LXC这种虚拟化, VM的进程就像HOST的进程一样运行, 管理, 所以创建和销毁都是非常快速的。

2.5.5 云计算中的虚拟化技术

  云计算中的虚拟化指的是IaaS(Infrastructure as a Service 基础设施即服务)层虚拟化解决方案,而不是虚拟机技术。IaaS层虚拟化解决方案,要符合IaaS层的基础特点,除了最基础的虚拟化软件之外,还包括,共享存储服务,镜像服务,身份认证服务,统一监控服务,以及收费管理等其他配套的服务。当然,既然是IaaS服务,必须支持对外API接口开放,支持定制开发。一般来说不是一个软件,而是一组软件组成的整理解决方案。
  VMware vSphere是基于VMware虚拟化技术的虚拟化管理软件,目前在行业内来说算是最成熟,生产环境应用度最广的IaaS层虚拟化技术的解决方案。目前对整个集群的虚拟机监控管理也是最好的。(vSphere本身收费,而且监控软件还需要单独收费)。
  Openstack是基于linux的IaaS层解决方案(支持多种虚拟化技术,比如KVM),是目前用户最多,影响最大的开源解决方案,得到了HP,IBM等知名厂商的大力支持,国内的虚拟化解决方案也大部分是基于Openstack开发定制。主要运行在cent os和ubuntu server操作系统上。
  CloudStack是使用 java开发的基于linux的IaaS层解决方案(支持多种虚拟化技术,比如KVM),目前发展潜力非常不错,也得到了很多知名厂商的认可,不过相对起步比较晚,在国内的推广度也不如Openstack。

3.虚拟机

  虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。
  虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。
(1)资源占用多
  虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。
(2)冗余步骤多
  虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
(3)启动慢
  启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

4.Linux容器

  由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
  Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
  由于容器是进程级别的,相比虚拟机有很多优势。
 (1)启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
 (2)资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
 (3)体积小
  容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
  总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

5.Docker原理

5.1 原理简介

  Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
  Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
  总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
  所以,当Docker运行在linux系统上的时候,相当于一个被隔离的系统进程,一个linux系统上可以运行多个Docker容器,这些容器共享这个linux内核。那么,当Docker运行在Windows系统上的时候呢?实际上,Docker运行在windows上的时候,在windows上有一层Linux虚拟系统,Docker是运行在这个虚拟系统上的,为了支持运行Linux虚拟机,就要启动windows的Hyper-v。
  那么,既然Docker容器之间是共享一个内核,那么在Ubuntu上制作的镜像,能够在CentOS上生成容器并执行吗?是可以的。因为Ubuntu和CentOS虽然是Linux不同发行版,但是它们使用的内核都是相同的,虽然版本可能不一样,但是这并不影响。

5.2 原理深入理解

待续

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注