杨旭明 李 忠 杨百一

(防灾科技学院应急管理学院,河北 三河 065201)

随着有关灾情监测网站越来越多,造成部署和维护的Web 应用呈现几何级数增长,直接导致了两个问题:一是在有限的资源条件下服务器的负载过重,响应缓慢,资源浪费现象严重;二是不同的应用程序所依赖的环境不一样,如果把它们依赖的软件都安装在一个服务器上,不仅造成调试麻烦,而且可能出现冲突,给运维人员带来繁重的不必要劳动。

目前的信息技术,虽然可以在服务器上创建不同的虚拟机,运行不同的应用,但是虚拟机的开销比较高。Docker 容器作为轻量级的虚拟机,是一个很好的工具,与传统的虚拟机相比,容器更加轻量化、启动的速度更快,在同样数量的硬件设备中,可以部署更多的容器实例。Docker 作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后容易地发布和应用到任意平台中。测试和运维人员可以直接部署软件镜像来进行测试和发布,大大简化了系统集成、测试和发布的过程。同时可以消除线上线下环境的差异,保证了应用生命周期的环境一致性标准化,是灾害信息数据网站群部署的理想思路。

1 Docker 容器技术

1.1 传统虚拟化与容器技术

传统虚拟机(virtual machine)就是带环境安装的一种解决方案,可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统上运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,缺点是资源占用多、冗余步骤多、启动速度慢等。

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有更多优势。基于容器运行的Docker 虚拟化技术并没有虚拟一个完整的Linux 操作系统,而只保留了应用程序运行所必需的核心操作系统环境,具有启动时间短、空间占用少、分发和复制方便、资源开销少等特点,具备和传统虚拟机一样的隔离性和安全性。Docker 容器与传统虚拟机对比如表1 所示。

表1 Docker 容器与虚拟机之间性能对比

1.2 Docker 工作原理

Docker 最初实现是基于LXC 的一个开源项目,诞生于2013年初,使用Google 公司推出的Go 语言进行开发实现,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它隔离的进程,因此也称为容器。Docker 能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员。用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Docker 服务器端负责处理创建、运行、保存容器的作用,客户端负责连接并控制服务端进程,客户端和服务端的守护进程可以通过RESTful API 或 者socket 进行进程间通信。Docker的 核 心 组 件 包 括Client、Docker Deamon、Docker Container、Docker Images 和Docker Register,如图1 所示。Docker 镜像(image)是指包含文件系统、可执行程序以及程序的相关依赖配置文件的软件包,可移植和重复使用。Docker 仓库(Docker Register)是用来存放镜像的地方,可以把创建好的基础镜像保存在仓库中,供其他开发和运维人员下载使用,避免反复构建镜像的麻烦。Docker Hub 是目前Docker 官方维护的一个公共仓库,用户可以直接下载镜像来实现应用。但是实际生产环境中,一般采用创建自己的私有仓库,来实现镜像的内部共享。Docker 容器(Docker Container)是通过Docker 镜像运行的实例,可以共享操作系统内核,能够迅速启动,占用很少的计算和内存资源。通过docker run 命令并指定一些参数完成容器执行一些进程服务。容器可以被启动、停止、删除等,而且每个容器之间具有安全的隔离空间。

图1 Docker 基本架构

2 基于Docker 的灾害信息网站群部署实现

2.1 需求分析

近年来,国家对各类灾害的监测和监控力度加大,对各类灾害信息发布提出了新的要求。本文以灾害信息网站群设计为例,研究网站群的快速部署和运维问题。灾害信息发布系统包括地震信息发布系统、疫情在线、社会力量参与灾后救援管理系统、智能灾害信息分析工场等。由于每个网站属于不同的开发团队,而每个开发团队使用的开发环境可能不太相同,如表2 所示。由于实验室环境仅提供两台云服务器可供使用,这就需要解决在有限的资源条件下,如何实现对信息网站群的快速部署和运维问题。

表2 灾害信息网站群开发环境

2.2 灾害信息网站群规划部署

2.2.1 服务器规划

本文采用一台服务器作为Docker 服务器,一台服务器作为数据库服务器,实现应用与数据分离的设计方案。同时Docker 服务器中的容器与数据库服务器之间使用内网进行通信,如图2 所示。其中在Mysql 数据库中分别为每个网站项目创建自己的账号和数据库,具体规划如表3所示。

图2 容器与数据库访问

表3 服务器资源规划表

2.2.2 网站群容器化部署实现

首先在服务器上安装Docker 软件,作为服务器端,再根据灾害信息网站群中的不同网站的开发环境,需要为每种开发环境分别构建Docker 镜像。下面以地震信息中心网站的容器化部署为例说明具体部署过程,如图3 所示。

图3 网站容器化部署流程

2.2.2.1 创建运行环境并完成Docker 镜像的构建。地震信息中心网站使用的Tomcat8.5.61 和Jdk1.8 运行环境,可以先从Docker Hub 公共仓库中使用Docker pull 命令下载官方Tomcat8.5.61 镜像,使用Docker run 命令运行该容器。进入容器后,再为此容器安装Jdk1.8 的运行环境,同时把网站所需的war 包通过宿主主机拷入到容器的tomcat/webapps 目录下,并修改相应的配置文件,实现对该特定网站镜像的构建。2.2.2.2 提交Docker 新镜像并部署。对2.2.2.1 中构建好的镜像通过docker commit 命令提交为新的镜像,使用docker run 命令重新启动新的镜像容器,并将容器中的8080 端口映射到宿主机的8002 端口上,实现地震信息中心网站通过http://宿主机IP:8002 的正常访问。2.2.2.3 把Docker 镜像上传到私有仓库。在Docker 服务器上创建一个本地私有仓库用来存放镜像文件,这样可以把制作好的镜像文件存到本地仓库,以便供其他开发人员和运维人员直接下载使用。先通过Docker tag 命令把镜像标记为私有仓库镜像,然后再通过Docker push 命令把标记号的镜像上传保存到私有仓库中。

3 系统测试

Docker 技术具有持续集成、版本控制、可移植性、隔离性和安全性等特性,本文通过对其在某些方面的优势进行系统测试,来进一步验证Docker 技术在灾害信息网站群中的使用价值。

3.1 安全性与隔离性测试

通过对每个容器的CPU、内存和IO 资源进行控制,可以避免某个容器因占用太多资源而影响其他容器乃至整个宿主机的性能。本次测试以内存为例,在一台已经运行多个容器的Docker 宿主机上,运行stress 压力测试工具镜像,设置内存限制资源为128M,同时分别给定内存压力值memory 为120M 和512M,使用默认的memory-swap 值0(表示容器可以使用swap大小为memory 值得两倍),观察压力测试容器运行状态,如图4所示。当使用内存压力值120M进行测试时,容器运行正常;使用内存压力值512M进行测试时,容器运行失败。再次使用内存压力值255M进行测试,由于压力值没有达到内存限制资源的两倍,通过使用swap,容器可以运行成功;当使用内存压力值256M进行测试时,压力值达到了内存限制资源的两倍,容器运行失败。

图4 docker 内存压力测试图

测试结果表明,通过容器的内存进行控制,有效地限制了容器对宿主机内存的使用,从而避免了因某个容器占用资源过多而影响其他容器乃至整个宿主机性能的情况发生。

3.2 快速部署与恢复测试

和标准部署与集成过程一样,Docker 可以构建、测试和发布镜像,这个镜像可以跨多个服务器进行部署。当部署多个来自同一个基础镜像的容器时,避免了多次复制操作,运维人员通过把运行正常的镜像存储到私有仓库中。当网站出现问题或者需要在其他服务器部署时,可以第一时间利用仓库中的镜像进行快速恢复和部署,提高网站维护效率。本次测试分为两个阶段,第一阶段测试通过基础镜像部署多个容器的能力以及版本控制功能;第二阶段测试快速恢复能力。

首先,由于疫情在线和地震信息中心网站的开发环境都是一样的,就以web:base 作为基础镜像,运行yqzx 和earthweb 两个容器来部署两个网站。部署成功后可以保存为v1 版本的镜像,当后续涉及到软件升级等操作时,可以通过保存为v2 版本,实现版本控制功能,如图5 所示。

图5 Docker 镜像的多版本展示

其次,通过把运行中的earthweb 容器中的tomcat 程序停掉,制造出网站异常的现象。此时可以直接把当前异常容器删掉,再直接运行earthweb:v2 镜像来启动容器。此时测试网站恢复正常,如图6 所示。

图6 Docker 快速恢复测试

测试结果表明,可以通过同一个基础镜像同时部署多个容器,实现网站的快速部署。当运行在容器中的网站由于版本升级等原因出现问题时,可以通过运行最新正常版本的镜像来重新启动容器,启动过程也都是秒级的,体现了快速恢复能力。

4 结论

传统的Web 网站发布技术多采用单机提供或者多端口并发访问服务,容易造成严重的资源浪费和访问速度缓慢等问题,一直制约着网站群的设计和建设。本文在分析云存储和云计算技术基础上,利用Docker 虚拟化容器技术,通过运行多个应用实例,实现了将多个不同开发环境的Web 网站部署到Docker容器中,解决了在有限的资源条件下实现对灾害信息网站群的部署困难问题,实现了网站群建设的快速部署和高利用率。对于开发测试和运维人员,可以利用Docker 虚拟化技术直接部署软件镜像,完成系统测试和相关信息发布,简化了系统集成、测试和发布的过程,管理更加简单方便,这对网站群设计具有实际应用价值。