基于Docker 的在线虚拟仿真实验容器系统设计与应用实践
2019-07-25陶铭曲超
陶铭,曲超
(东莞理工学院计算机科学与技术学院,东莞523808)
0 引言
“新工科”建设背景下,需要培养复合型人才和创新性人才,这就需要培养学生将所学理论知识应用于实践的能力,以及将所学的专业知识创造性地应用于新的领域或跨多重领域,进行研发或创新的能力[1]。因此,实验教学成为培养学生这些能力的重要环节。然而,现有的实验教学模式受到场地、设备及师资等多方面的影响,严重制约着实验教学水平的提升以及学生实践能力的培养。
近年来,逐步发展起来的虚拟仿真实验作为物理实验的一种替代技术,以其低成本等特点,已被广泛应用于实验教学,且被证明是应用信息技术解决高校实验教学环节中存在问题的可行途径。然而,目前虚拟仿真实验的开发利用相对比较初步,研究重点主要集中于实验功能的实现,往往仅局限于物理实验的替代,而极少地进一步发挥其信息处理能力,并且在扩展能力和集成能力等方面存在严重的不足,如:缺乏远程访问和并发服务能力。虚拟仿真软件往往是一个纯客户端软件,可以在单机上运行,实验人员往往需要分别下载并各自运行。既不能运程访问,也不具备并发服务能力,难以同其他软件进行直接交互,无法直接进行在线实验[2]。
为此,为更充分地发挥虚拟仿真实验的优势,更好地培养学生实践创新的能力,以及提升学生“学以致用”的水平,本文基于轻量级的操作系统虚拟化解决方案Docker[3],设计并实现了一种在线虚拟仿真实验容器系统。系统实现了后台服务器系统、资源服务器、客户端、管理员等功能模块,旨在通过图形化界面,结合Docker 的相关指令以及其他辅助功能,降低用户使用容器过程中的门槛,提高用户进行在线虚拟仿真实验的便捷性。
1 系统功能需求分析
本系统的用户有两种:普通用户和管理员。普通用户的主要功能包括两大模块:容器和工单。容器模块包括申请、管理及使用,用例图如图1 所示。用户申请容器通过填写并提交表单来执行。用户对容器的管理包括开启、关闭及删除。用户对容器的使用分为容器内的文件操作、服务管理。容器内的文件操作包括在容器中上传、创建、删除、重命名、移动、复制文件以及新建、删除文件夹;服务管理中的“服务”指的是Linux 命令,Linux 命令保存为服务后,点击执行可以在容器内执行该命令,对容器外的环境没有影响。服务管理还包括修改服务、删除服务、添加默认服务。
图1 容器模块用例图
工单模块包括了创建、回复、查看、搜索、关闭,用例图如图2 所示。工单是作为用户和管理员交流沟通的重要途径。用户填写工单后,管理员能够接收到用户发出的消息,进而回复并跟进用户提出的问题,用户也能在工单中与管理员继续反馈。关闭工单功能是给用户在认为已经解决问题后,手动将工单状态设置为关闭。
图2 (普通用户)工单模块用例图
管理员的主要功能包括以下模块:用户、控制台、容器、工单。用户模块包括显示用户信息列表、显示用户操作记录,用例图如图3 所示。用户信息列表中是用户的基本信息,包括其学号、用户名等。用户操作记录指用户登录、申请容器、使用容器、创建工单、回复工单等操作。用户在进行这些操作时会被系统记录,并形成日志文件便于分析。
图3 管理员端用户模块用例图
控制台模块包括显示当前用户数、显示当前容器数、显示当前未读消息数、显示当前资源服务器的CPU及内存占用情况、定时处理过期容器,用例图如图4 所示。未读消息指的是未查看的工单回复,若是刚创建的工单,工单内的第一条消息也被认为是未读消息。
图4 控制台模块用例图
管理员端容器模块包括显示容器列表、显示容器详情、容器管理、容器信息统计,用例图如图5 所示。容器管理包括开启、关闭、删除。容器信息统计是从容器创建日期分布、已开启容器数量、镜像使用分布这些角度进行统计。
图5 管理员端容器模块用例图
管理员端工单模块包括查看工单列表、新建工单、查看工单详情、回复工单,用例图如图6 所示。工单列表能够突出显示有未读消息的工单,表现为该工单标题后有个带数字的徽章,徽章内数字表示当前未读消息的数量。
图6 管理员端工单模块用例图
2 系统设计
2.1 系统体系结构设计
本系统在体系结构上分为三部分:界面表示层、业务逻辑层以及数据与资源层[4],如图7 所示。客户端和管理员端为界面表示层,为普通用户和管理员展示所需要的界面,并显示从后台获取的数据;后台服务器系统属于业务逻辑层,作为一个中间层,既负责为客户端和管理员端提供必要数据和业务逻辑,又负责管理数据与资源层;数据与资源层有资源服务器和数据库,其中,资源服务器是安装有Docker 的Linux 宿主机。
图7 系统体系结构示意图
2.2 系统功能设计
基于上述对普通用户及管理员的功能需求分析,将分别展示申请容器、开启容器、上传文件、复制文件及添加自定义服务的功能时序图。其他的功能在流程上与上述功能有相似之处。
申请容器是根据收集填写的信息并创建容器,其功能时序图如图8 所示。
开启容器操作除了在资源服务器中开启容器外,还会收集容器的相关信息,其功能时序图如图9 所示,操作流程如图10 所示。关闭容器和删除容器与其类似,只是少了向资源服务器查询容器信息的步骤。
图8 申请容器功能时序图
图9 开启容器功能时序图
图10 开启容器的流程图
添加自定义服务的功能时序图如图11 所示。编辑服务、删除服务在流程上与其类似。而添加默认服务与其不同点在于服务的信息是通过检索数据库获得。
图11 添加自定义服务功能时序图
3 系统实现及应用
本系统的实现基于ThinkPHP 框架,遵循MVC 架构,采用HTML、CSS、jQuery、PHP 等进行开发[5],如图12 所示。具体地,前端采用HTML 语言显示基本内容,使用CSS 对页面进行格式排版,使用ThinkPHP 框架的View 视图层进行封装;业务处理采用ThinkPHP框架的Controller 控制器,在对客户请求进行处理时,调用相应的业务逻辑层函数完成相应的功能;采用ThinkPHP 框架的数据库扩展功能实现MySQL 数据库的连接,并采用ThinkPHP 框架的Model 数据模型层实现PHP 代码与MySQL 数据库表连接,以面向对象的方式处理数据库。本文以《Web 前端开发实践》课程中搭建一个基于Apache 的Web 服务器为例,介绍Docker容器的应用效果。
图12 系统实现架构示意图
3.1 申请容器
用户填写相应信息,选择镜像、资源文件夹大小、开放端口,程序判断无误后即可创建容器。用户可选择的连接容器使用AJAX 异步查询并显示。收到用户的申请后,后台先根据用户填写的需求拼接Docker 操作命令,然后再交由DockerHelper 类执行[6]。若在创建容器时选择了需要资源文件夹,则需要在资源服务器上分配所选容量的文件夹给用户使用。本系统使用磁盘配额技术限制该文件夹的大小。申请容器的功能界面如图13 所示,主要代码实现如下所示。
图13 申请容器
//通过数据库,生成一个资源文件夹id
if(isset($resSize)&&$resSize!==""&&$resSize!==0){
$res=new Res();
……
$res->data($info);
$res->save();
$res=Res::get($info);
$resId=$res->id;
}else{
$resSize=0;
$resId=-1;
}
//解析要连接容器,并产生真正的容器名
if($linkChoice!==""&&$linkChoice!=="(无)"&&$link-Choice!=="(无)"){
$linkChoice=$account.'-'.$linkChoice;
}else{
$linkChoice="";
}
$helper=$this->getDockerHelper();
//执行Docker 中的创建容器命令
$result=$helper->createContainer($account,$imageName,
$cname,$linkChoice,$resSize,$resId,$cportList)->getData();
3.2 容器管理
容器开启时将连接资源服务器并作如下操作:①查看其端口映射情况,更新数据并显示;②查看硬盘占用情况;③获取容器默认目录下的文件。容器管理功能界面如图14 所示。
图14 容器管理
4 结语
本文应对在线虚拟仿真实验在提升学生实践创新能力方面存在的不足,设计并实现了一种基于Docker的在线虚拟仿真实验容器系统。该系统实现了后台服务器系统、资源服务器、客户端、管理员等功能模块。在实际的实践教学环节应用过程中,该系统通过图形化界面,结合Docker 的相关指令及其他辅助功能,可降低用户使用容器过程中的门槛,提高用户进行在线虚拟仿真实验的便捷性,体现出良好的应用效果,在深化信息技术与教育教学的融合发展中具有明显的积极意义。