Linux容器虚拟技术及GIS应用前景

地信行业我知道 发布于 2015/11/27 11:47
阅读 318
收藏 1

1 引言

云计算的核心价值是是通过集约化计算和服务,节约资源,怎么利用技术手段使硬件资源的性能得到最大发挥,并使应用的部署更简单、快捷,是技术人员一直努力的目标,在云GIS中更是如此。

云GIS是云计算的技术和理念应用于GIS领域的结果,云GIS的发展离不开云计算大环境的发展。作为云GIS技术与实践系列的系列文章之一,本期将从IT技术的新视角来审视云GIS的发展,以云计算的一项新技术为着眼点,探究Linux容器虚拟技术(LXC)的新发展,以及该技术的发展为云GIS部署带来的机遇、挑战和收益。

2 传统的虚拟化技术及不足

虚拟化是云计算的基础,不论是 IaaS(基础设施即服务)、PaaS(平台即服务)还是SaaS(软件即服务),都离不开虚拟化基础,虚拟化使计算资源可度量,使硬件的资源利用率更高,使应用的部署更灵活。

在传统的虚拟化技术中,应用被封装在虚拟机中,通过集中硬件资源,运用虚拟化手段使资源可集中管理,通过资源池化技术实现按需使用、弹性伸缩等云特性,使计算资源的投入契合实际需求的曲线,避免了资源浪费,并可通过横向扩展快速填补需求过高资源不足时的困境。

图1:云计算中传统的虚拟化技术架构

如图1所示,虚机使GIS应用得以隔离,并形成可调配资源占用、可复制、可迁移的整体单元,这个单元由客户机操作系统、GIS应用及其依赖库构成,资源按需分配、系统弹性伸缩等特性都是以该单元为基础的。在云计算管理平台中,该单元被制作成虚机镜像,使GIS应用的部署更加便捷、灵活,为GIS服务器的部署带来了变革,在过去以及将来很长一段时间内都为GIS的云端一体化带来持续收益。

然而,从资源节约的角度来看,虚机并不是最好的解决方案。虚机提供的是完整的操作系统环境,它们包含了大量类似系统库、硬件驱动、虚拟处理器、网络接口等等GIS应用并不直接关心的信息。除GIS应用本身外,每个虚机都还要占用维系一个操作系统所需的各类资源,即每个操作系统本身都会占用一定的内存、CPU等资源。这从资源节约的角度来看,并不划算。

另外,一个完整的操作系统占用的体积也不容小视,从镜像启动的虚拟机都是镜像的一个完整拷贝,虚拟机的启动和迁移、传输都需要花较长时间(同等网络条件下)。

利用Linux容器虚拟化技术,这类问题将得到改善。

3 Linux容器虚拟技术(LXC)

Linux容器虚拟技术(LXC,LinuxContainer)是一种轻量级的虚拟化手段,它利用内核虚拟化技术提供轻量级的虚拟化,来隔离进程和资源。LXC有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:

  • 与宿主机使用同一个内核,性能损耗小;
  • 不需要指令级模拟;
  • 容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
  • 避免了准虚拟化和系统调用替换中的复杂性;
  • 轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源(例如文件系统)共享。

在LXC中,由单个操作系统管理的资源被容器(Container)有效隔离,形成独立单元。通过提供一种创建和进入容器(Container)的方式,操作系统让应用程序就像在独立的机器上运行一样,但又能共享很多底层的资源。例如,可以有效地共享公共文件(比如 glibc)的页缓存,因为所有容器都使用相同的内核,而且所有容器还常常共享相同的libc 库(取决于容器配置)。这种共享常常可以扩展到目录中其他不需要写入内容的文件。

容器在提供隔离的同时,还通过上述资源共享节省开销,这意味着容器比真正的虚拟化的开销要小得多。这就意味着,采用LXC技术,云计算平台中的应用程序不再需要单独占用一台操作系统资源。

4 Docker:基于LXC的开源应用容器引擎

Docker 是 dotCloud 开源的一个基于 LXC 的高级容器引擎,它的初衷是将各种应用程序和他们所依赖的运行环境打包成标准的Container/镜像,进而发布到不同的平台上运行,Container发挥类似 VM 的作用,但它启动得更快和需要更少的资源。

Docker是从LXC技术发展而来的,但并不是LXC的替代品。LXC提供了低层次的LinuxKernel特性,Docker直接利用了这些Kernel特性,并在此基础上提供了新的功能,封装了高层次的特性工具。Docker提供了如下特性:

  • 在多个机器之间提供便捷的部署策略
  • 提供了应用镜像的自动构建机制。允许开发者从源代码直接打包依赖、工具、库等等。
  • 组件复用。Docker容器可以基于“基础镜像”创建许多个独立的、不同功能的组件,这意味着一次制作的镜像可以再将来的许多项目中不断复用。
  • 共享。有一个公开的登记中心(http://index.docker.io),在这里可以发现现成的、有用的容器,每个人也都可以共享自己的容器。
  • Docker提供了创建、部署容器的API,并且有大量工具集成了Docker的特性,来为第三方平台(Openstack Nova等)提供更多功能。

图2:Docker的技术架构

跟前面提到的传统虚拟化手段不同,Docker中一个应用程序的部署单元不是一个虚机,而是一个Container,应用程序是运行在众多Container内部的。如上图所示,宿主机的资源不再需要指令级的模拟形成资源池,并通过指令模拟来支撑完整的操作系统,而是通过Docker引擎直接供给Container。

Container与虚机的最大不同在于Container并不包含操作系统内核,它与宿主机使用同一个内核,减少了指令模拟的损耗,而且多个Container之间可以共用同一套系统库、应用程序依赖库。每个Container看起来也像是一个独立的系统(实际上资源的确得到了有效隔离),但它们的公共部分是复用的。

Docker的中文字面意思是“码头工人”,Docker设想的是交付运行环境如同海运,操作系统如同一个货轮,每一个在操作系统基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是交付一系列标准化组件的集合,如同堆积木,用户只需要选择合适的积木组合,并且在最顶端搭上自己的积木(即用户的应用程序)。这就是Docker构建云计算单元的基本理念。

这就意味着,多个不同应用的交付件可以共用一组基础的标准组件集合,同类应用只需稍加改动(叠加新的积木,例如用户配置项等),即可形成新的交付件。Docker的特性使这些交付件的公共部分在运行时得以复用,从而节约计算资源开销;在交付件构建、部署时只需要增加、变更公共集合之外的部分(最上层的积木),从而使构建、部署的过程也相当迅速。

Docker中也有镜像的概念,Docker镜像用于Container的创建,它是只读的。当Docker从镜像运行一个Container时,实际是在镜像的顶端直接增加了一个读写层,在读写层内部运行Container。在Docker中,你可以直接从登记中心搜索、拉取一个基本镜像,然后在本地部署应用、进行修改,通过Commit方法形成一个新的Container(即应用程序运行单元),并推送至登记中心(可以是公有的Docker.io,也可以是组织内部搭建私有的)。

5 Docker对GIS服务器的适用性

Docker为计算密集型的GIS应用更充分的利用计算机硬件资源提供了一种不错的解决方案。然而,Docker不是全能的,运行在Docker中的应用有如下限制:

  • Docker是基于Linux 64位的,无法在windows/unix或32位的linux环境下使用,所以需要应用必须是Linux 64位的;
  • 网络管理相对简单,主要是基于namespace隔离;
  • Container随着用户进程的停止而销毁,Container中的log等用户数据不便收集;
  • Docker对磁盘的管理比较有限;
  • Docker中的cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量。

在GIS服务器部署中,以上限制几乎没有影响。首先,Linux平台部署也是GIS的发展趋势,Linux平台有更高的并发支持能力、更高的安全性、更稳定,并且操作系统采购成本跟Windows相比性价比很高,越来越多的GIS应用已采取在Linux下部署的策略;其次,GIS服务器的群集只需要一个网络出口,并不关心内部群集的IP策略,通过Docker中的网络端口映射,可以把GIS Container群中的GIS功能出口映射到宿主机;关于日志收集,GIS群集内部可以提供日志收割能力;关于磁盘的管理,GIS原始矢量数据往往存储在数据库中,缓存瓦片往往存储在MongoDB等分布式文件存储系统中,对直接磁盘管理的需求不大。综上所述,云GIS采用Docker进行部署,来提高资源利用率是可行的。

在GIS服务器部署时,可以借鉴Docker的理念:

  • 系统精简的理念。Docker的基础镜像采用了CoreOS,将OS极其精简。GIS服务器也可以提供deploy包,实际部署时,节约资源耗费和拉取、推送的时间成本,例如在GIS群集中,示例程序、示范服务、联机帮助等往往是不需要的,可以精简。
  • 同一类GIS应用的依赖库是可以共享的,例如iServer运行时的UGO库、X11库、字体库、许可驱动库等。
  • 制作基础GIS容器镜像,将可以共用的库都装配进去(如数据库客户端、中间件、JRE等),为需要部署的GIS项目提供快速部署的基础。
  • 借助Docker搭建GIS从源代码到编译、部署的整套持续集成生态环境。

此外,因为Docker的登记中心是基于开源的Docker-Registry实现的,这就为搭建私有的Docker登记中心提供了可能。云GIS可以利用Docker-Registry搭建私有的GIS应用登记中心,方便组织内部快速部署GIS应用,这样也规避了连接Docker公有登记中心时的网络带宽、网络限制以及地理信息的安全保密问题。

示例GIS 镜像的构建

构建一个Ubuntu环境的iServer 基本镜像的过程如下:

第一步:创建iServer的DockerFile文件,如下:

#镜像制作以登记中心的ubuntu 14.04操作系统为基础

FROM ubuntu:14.04

MAINTAINER iserverteam@supermap.com

ENV ISERVER_VERSION 7.0

#安装wget

RUN apt-get update

RUN apt-get install -y -q wget

#安装iserver,192.168.245.1是一个内网下载地址

RUN wgethttp://192.168.245.1/download/smiserver_700_10815_1050_linux64_deploy_chs.tar.gz-O /tmp/iserver.tar.gz

RUN tar xzf /tmp/iserver.tar.gz -C /opt

RUN rm /tmp/iserver.tar.gz

# 增加默认的admin管理员账户

ADD shiro.ini /opt/SuperMapiServer7C/webapps/iserver/WEB-INF/shiro.ini

# Container启动时立即运行iServer

CMD/opt/SuperMapiServer7C/bin/catalina.sh run

第二步:根据DockerFile文件构建iServer镜像,supermap是登记中心的用户名,iserver是库名称

$ sudo docker build --tag supermap/iserver.

         运行构建的结果如图3所示,一旦构建成功,镜像会被标记为supermap/iserver,并可通过”sudo docker images”命令查看到。

图3:iServer 基本镜像构建结果

         注意:实际应用中可以基于iServer基本镜像制作GIS业务镜像,配置更多的环境(如数据库、业务服务配置等),来满足行业应用的需求。

第三步:镜像构建成功后,本机可以直接使用,通过推送镜像到登记中心可共享给其他用户,方便其他宿主机部署。推送到登记中心的命令如下,推送前需要通过sudo docker login登陆。

$ sudo docker push supermap/iserver

使用Docker搭建示例GIS群集

使用上述创建的iServer基本镜像,可以快速搭建一个GIS集群,部署结构如图4所示:

图4:GIS群集搭建示意图

首先使用supermap/iserver镜像,快速创建一个iServer实例(Container)作为父节点,如下:

$ sudo docker run --name iserver1 -d –p 8081:8090 supermap/iserver

--name表示的是Container名称,这里为iserver1,-d表示支持后台进程(daemon)模式,8090是iserver启动后的默认服务端口,-p8081:8090表示将Container的8090端口映射到宿主机网络接口的8081端口,使iserver1实例可以被外部用户在8081端口访问到(通过宿主机的外部网络)。

利用supermap/iserver镜像,还可快速创建iserver子节点,搭建一个GIS群集,向iserver1父节点报告。

$ sudo docker run --name iserverson1 -d --link iserver1:iserver_master supermap/iserver

$ sudo docker run --name iserverson2 -d --link iserver1:iserver_master supermap/iserver

GIS群集的出口只需1个,子节点iserverson1和iserverson2不再做端口映射,--linkiserver1:iserver_master ,创建了Container间的安全连接(iserver_master是iserver1的别名),将iserver1作为主节点与iserverson1和iserverson2连接了起来,使iserverson1和iserverson2启动时,自动向GIS父节点(iserver1的8090端口)报告,这样就快速搭建了一个由iserver1、iserverson1、iserverson2构成的GIS基本群集。

6 小结

Docker是LXC技术的新发展,是近期非常活跃的一个开源项目,它为云GIS中心的搭建提供了一种新的技术方案,SuperMap GIS 7C系列中的GIS服务器产品原生支持64位Linux系统,并提供有deploy包(体积约200M),利用iServer deploy包制作的Ubuntu环境的Docker镜像体积在800M左右,便于部署和共享。另外,iServer的GIS缓存支持在独立的MongoDB系统中存取,iServer群集支持基于网络的许可授权。利用SuperMap GIS 7C和Docker部署云GIS平台前景广阔。

    Docker项目虽然才启动1年多,但发展迅速,前不久已经发布了1.0正式版本。其方案也已被Google等越来越多的云计算厂商接受,并投入对接支持。我们相信这是云计算的一个重要技术发展方向,将来会在云GIS中心的部署中发挥更大价值。


加载中
返回顶部
顶部