1.2 虚拟化使云计算轻松落地
1.2.1 虚拟化为云计算“铺上了轻轨”
前面我们了解了云计算的弹性,即时间灵活性和空间灵活性。解决云计算的弹性问题经历了漫长的时间。
在很长一段时间内,物理设备的发展是“王道”,为了提高性能和计算能力,人们将主要精力投入更加优质的资源研究上,如扩展内存、增强CPU,以至于物理设备越来越强悍,内存达到TB 级别,但是强悍的物理设备却不能很好地解决灵活性的问题。
为了解决这个问题,虚拟化技术出现了。虚拟化技术使不同的客户看起来是隔离的,但实际上很有可能多个用户在使用相同的资源。虚拟化的出现使用户的需求可以得到快速响应,因此在任意一个云平台上创建计算资源,在发出需求之后,很快(一般几分钟)就可以使用了。在虚拟化阶段,VMware 是实现计算、网络、存储的虚拟化技术。类似的虚拟化技术还有Xen 和KVM 等。
在虚拟化出现之后,为了解决复杂的人工配置问题,出现了很多调度器和相关的算法。通俗一点地说,就是有一个调度中心,几千台机器都在一个池子中,无论用户需要多少CPU、内存、硬盘,调度中心都会自动在这个池子中找到满足用户需求的机器,启动虚拟电脑并做好配置,用户就能直接使用了。这个阶段称为池化阶段或云化阶段,到了这个阶段,云计算的雏形已经显现出来了。
虚拟化技术解决了计算机基础设施在计算、网络、存储等方面的弹性问题,但是它遗留了两个问题:应用的扩展性和迁移性。为了解决这两个问题,容器(Container)技术随之出现了。容器技术中最关键的是镜像(Image),镜像就像一个集装箱,将所有相关的应用和插件都打包封装起来,在需要使用时,下载这个镜像并将其解压即可使用,非常巧妙地解决了应用的扩展性和迁移性问题。容器技术使PaaS 对用户自身应用的自动部署变得快速而优雅。
为了保证用户数据的隔离,在容器技术中,有两种隔离技术,一种是Namespace,每个Namespace 中的应用看到的是不同的IP 地址、用户空间、进程号等;另一种是Cgroups,一个应用只能用其中一部分机器的资源。
Docker 是容器技术的代表,应用非常广泛。下面介绍Docker 的发展过程和基本概念。
1.2.2 Docker 的“燎原之火”
Docker 是从2013 年开始进入人们的视野中的,各大IT 公司对Docker 的支持力度日益加大,争先恐后地为Docker 的发展做出贡献,致使其在GitHub 上一时之间名声大噪。笔者还记得当年刚开始使用Docker 时,Docker 仅支持Ubuntu 操作系统的容器,但没过多久,Red Hat 就宣布了从Red Hat 6.5 开始支持Docker 的集成,再后来,Google 将其云计算引擎搬到了Docker 容器中。
那么究竟什么是Docker 呢?官方对它的解释如下:Docker 是PaaS 提供商dotCloud开源的一个基于LXC 的高级容器引擎。
Docker 基于Go 语言并遵从Apache 2.0 协议开源,开源是Docker 受热捧的原因之一。除了开源,Docker 还有什么优点呢?
首先得说说容器技术,其实容器是一个老生常谈的话题,早在2000 年容器的概念就已经有了,只不过因为诸多原因,容器技术普遍不被看好,正是Docker 给容器技术带来了一把“燎原之火”。传统虚拟机(Hyper-V、KVM、Xen)都是基于虚拟化硬件仿真机制的,这对系统要求很高,但Docker 容器技术使用的是共享的操作系统。虚拟机和Docker容器的架构区别如图1-3 所示。
图1-3 虚拟机和Docker 容器的架构区别
在图1-3 中,Docker 容器与虚拟机最大的区别是少了虚拟机OS 层,使容器小了很多,所以有人说容器省略了99.9%的虚拟机垃圾,只剩下一个小巧而精悍的胶囊。
所以,从某种层面上说,Docker 容器是容器的一种实现方式,它是容器技术的一种标准化封装,也是最流行的容器技术解决方案之一,是它将容器技术带向了高潮。
Docker 容器和传统虚拟机的对比如表1-1 所示。
表1-1 Docker 容器和虚拟机的对比
Docker 镜像是一个分层式机构,它的分层结构如图1-4 所示。Docker 镜像有严格的分层式管理标准,只有最上面一层(Container)面向用户且支持读/写操作,其他层只支持读操作。用户的所有操作都会被记录到Container 层。
图1-4 Docker 镜像的分层结构
Docker 的精华在于镜像的层级关系,在启动容器时,一个新的可写层被加载到镜像的顶部,这一层通常称为容器层,容器层之下的都称为镜像层。所有对容器的改动(添加文件、删除文件、修改文件)都只会发生在容器层。只有容器层是可写的,容器层之下的所有镜像层都是只读的。镜像层数量可能有很多,所有镜像层联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,如testfile 文件,上层的testfile文件会覆盖下层的testfile 文件,即用户只能访问上层的testfile 文件。在容器层中,用户看到的是一个叠加之后的文件系统。
1.2.3 Docker 的hello-world 应用
本节运行Docker 的第一个应用——hello-world。
想要安装Docker,只需运行下面的yum 命令(针对的是Red Hat 系统或CentOS 系统;对于Ubuntu 系统,需要运行apt-get 命令安装)。
同时,Docker 官方为了在测试或开发环境中简化安装,提供了一套便捷的安装脚本。
在安装完成之后,可以运行docker --version 命令或docker info 命令检查Docker 的版本和详细信息。
接下来运行docker pull 命令,从远程仓库下载hello-world 应用的Docker 镜像。
在下载了Docker 镜像后,即可启动hello-world 应用。
我们可以看到,hello-world 应用已经启动了。需要注意的是,因为在使用国内网络访问Docker 仓库时,要么无法访问,要么速度特别慢,所以一般需要更改为国内仓库进行加速。
创建/etc/docker/daemon.json 文件,添加如下内容,并且将<website of docker ustc mirrors>替换为ustc docker 的镜像网址。
这里使用ustc 镜像库进行加速,如果是国内用户,也可以选择使用阿里云的镜像库进行加速。重启Docker,使镜像库配置生效。