陶銘,曲超
(東莞理工學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,東莞523808)
“新工科”建設(shè)背景下,需要培養(yǎng)復(fù)合型人才和創(chuàng)新性人才,這就需要培養(yǎng)學(xué)生將所學(xué)理論知識(shí)應(yīng)用于實(shí)踐的能力,以及將所學(xué)的專業(yè)知識(shí)創(chuàng)造性地應(yīng)用于新的領(lǐng)域或跨多重領(lǐng)域,進(jìn)行研發(fā)或創(chuàng)新的能力[1]。因此,實(shí)驗(yàn)教學(xué)成為培養(yǎng)學(xué)生這些能力的重要環(huán)節(jié)。然而,現(xiàn)有的實(shí)驗(yàn)教學(xué)模式受到場地、設(shè)備及師資等多方面的影響,嚴(yán)重制約著實(shí)驗(yàn)教學(xué)水平的提升以及學(xué)生實(shí)踐能力的培養(yǎng)。
近年來,逐步發(fā)展起來的虛擬仿真實(shí)驗(yàn)作為物理實(shí)驗(yàn)的一種替代技術(shù),以其低成本等特點(diǎn),已被廣泛應(yīng)用于實(shí)驗(yàn)教學(xué),且被證明是應(yīng)用信息技術(shù)解決高校實(shí)驗(yàn)教學(xué)環(huán)節(jié)中存在問題的可行途徑。然而,目前虛擬仿真實(shí)驗(yàn)的開發(fā)利用相對(duì)比較初步,研究重點(diǎn)主要集中于實(shí)驗(yàn)功能的實(shí)現(xiàn),往往僅局限于物理實(shí)驗(yàn)的替代,而極少地進(jìn)一步發(fā)揮其信息處理能力,并且在擴(kuò)展能力和集成能力等方面存在嚴(yán)重的不足,如:缺乏遠(yuǎn)程訪問和并發(fā)服務(wù)能力。虛擬仿真軟件往往是一個(gè)純客戶端軟件,可以在單機(jī)上運(yùn)行,實(shí)驗(yàn)人員往往需要分別下載并各自運(yùn)行。既不能運(yùn)程訪問,也不具備并發(fā)服務(wù)能力,難以同其他軟件進(jìn)行直接交互,無法直接進(jìn)行在線實(shí)驗(yàn)[2]。
為此,為更充分地發(fā)揮虛擬仿真實(shí)驗(yàn)的優(yōu)勢(shì),更好地培養(yǎng)學(xué)生實(shí)踐創(chuàng)新的能力,以及提升學(xué)生“學(xué)以致用”的水平,本文基于輕量級(jí)的操作系統(tǒng)虛擬化解決方案Docker[3],設(shè)計(jì)并實(shí)現(xiàn)了一種在線虛擬仿真實(shí)驗(yàn)容器系統(tǒng)。系統(tǒng)實(shí)現(xiàn)了后臺(tái)服務(wù)器系統(tǒng)、資源服務(wù)器、客戶端、管理員等功能模塊,旨在通過圖形化界面,結(jié)合Docker 的相關(guān)指令以及其他輔助功能,降低用戶使用容器過程中的門檻,提高用戶進(jìn)行在線虛擬仿真實(shí)驗(yàn)的便捷性。
本系統(tǒng)的用戶有兩種:普通用戶和管理員。普通用戶的主要功能包括兩大模塊:容器和工單。容器模塊包括申請(qǐng)、管理及使用,用例圖如圖1 所示。用戶申請(qǐng)容器通過填寫并提交表單來執(zhí)行。用戶對(duì)容器的管理包括開啟、關(guān)閉及刪除。用戶對(duì)容器的使用分為容器內(nèi)的文件操作、服務(wù)管理。容器內(nèi)的文件操作包括在容器中上傳、創(chuàng)建、刪除、重命名、移動(dòng)、復(fù)制文件以及新建、刪除文件夾;服務(wù)管理中的“服務(wù)”指的是Linux 命令,Linux 命令保存為服務(wù)后,點(diǎn)擊執(zhí)行可以在容器內(nèi)執(zhí)行該命令,對(duì)容器外的環(huán)境沒有影響。服務(wù)管理還包括修改服務(wù)、刪除服務(wù)、添加默認(rèn)服務(wù)。
圖1 容器模塊用例圖
工單模塊包括了創(chuàng)建、回復(fù)、查看、搜索、關(guān)閉,用例圖如圖2 所示。工單是作為用戶和管理員交流溝通的重要途徑。用戶填寫工單后,管理員能夠接收到用戶發(fā)出的消息,進(jìn)而回復(fù)并跟進(jìn)用戶提出的問題,用戶也能在工單中與管理員繼續(xù)反饋。關(guān)閉工單功能是給用戶在認(rèn)為已經(jīng)解決問題后,手動(dòng)將工單狀態(tài)設(shè)置為關(guān)閉。
圖2 (普通用戶)工單模塊用例圖
管理員的主要功能包括以下模塊:用戶、控制臺(tái)、容器、工單。用戶模塊包括顯示用戶信息列表、顯示用戶操作記錄,用例圖如圖3 所示。用戶信息列表中是用戶的基本信息,包括其學(xué)號(hào)、用戶名等。用戶操作記錄指用戶登錄、申請(qǐng)容器、使用容器、創(chuàng)建工單、回復(fù)工單等操作。用戶在進(jìn)行這些操作時(shí)會(huì)被系統(tǒng)記錄,并形成日志文件便于分析。
圖3 管理員端用戶模塊用例圖
控制臺(tái)模塊包括顯示當(dāng)前用戶數(shù)、顯示當(dāng)前容器數(shù)、顯示當(dāng)前未讀消息數(shù)、顯示當(dāng)前資源服務(wù)器的CPU及內(nèi)存占用情況、定時(shí)處理過期容器,用例圖如圖4 所示。未讀消息指的是未查看的工單回復(fù),若是剛創(chuàng)建的工單,工單內(nèi)的第一條消息也被認(rèn)為是未讀消息。
圖4 控制臺(tái)模塊用例圖
管理員端容器模塊包括顯示容器列表、顯示容器詳情、容器管理、容器信息統(tǒng)計(jì),用例圖如圖5 所示。容器管理包括開啟、關(guān)閉、刪除。容器信息統(tǒng)計(jì)是從容器創(chuàng)建日期分布、已開啟容器數(shù)量、鏡像使用分布這些角度進(jìn)行統(tǒng)計(jì)。
圖5 管理員端容器模塊用例圖
管理員端工單模塊包括查看工單列表、新建工單、查看工單詳情、回復(fù)工單,用例圖如圖6 所示。工單列表能夠突出顯示有未讀消息的工單,表現(xiàn)為該工單標(biāo)題后有個(gè)帶數(shù)字的徽章,徽章內(nèi)數(shù)字表示當(dāng)前未讀消息的數(shù)量。
圖6 管理員端工單模塊用例圖
本系統(tǒng)在體系結(jié)構(gòu)上分為三部分:界面表示層、業(yè)務(wù)邏輯層以及數(shù)據(jù)與資源層[4],如圖7 所示??蛻舳撕凸芾韱T端為界面表示層,為普通用戶和管理員展示所需要的界面,并顯示從后臺(tái)獲取的數(shù)據(jù);后臺(tái)服務(wù)器系統(tǒng)屬于業(yè)務(wù)邏輯層,作為一個(gè)中間層,既負(fù)責(zé)為客戶端和管理員端提供必要數(shù)據(jù)和業(yè)務(wù)邏輯,又負(fù)責(zé)管理數(shù)據(jù)與資源層;數(shù)據(jù)與資源層有資源服務(wù)器和數(shù)據(jù)庫,其中,資源服務(wù)器是安裝有Docker 的Linux 宿主機(jī)。
圖7 系統(tǒng)體系結(jié)構(gòu)示意圖
基于上述對(duì)普通用戶及管理員的功能需求分析,將分別展示申請(qǐng)容器、開啟容器、上傳文件、復(fù)制文件及添加自定義服務(wù)的功能時(shí)序圖。其他的功能在流程上與上述功能有相似之處。
申請(qǐng)容器是根據(jù)收集填寫的信息并創(chuàng)建容器,其功能時(shí)序圖如圖8 所示。
開啟容器操作除了在資源服務(wù)器中開啟容器外,還會(huì)收集容器的相關(guān)信息,其功能時(shí)序圖如圖9 所示,操作流程如圖10 所示。關(guān)閉容器和刪除容器與其類似,只是少了向資源服務(wù)器查詢?nèi)萜餍畔⒌牟襟E。
圖8 申請(qǐng)容器功能時(shí)序圖
圖9 開啟容器功能時(shí)序圖
圖10 開啟容器的流程圖
添加自定義服務(wù)的功能時(shí)序圖如圖11 所示。編輯服務(wù)、刪除服務(wù)在流程上與其類似。而添加默認(rèn)服務(wù)與其不同點(diǎn)在于服務(wù)的信息是通過檢索數(shù)據(jù)庫獲得。
圖11 添加自定義服務(wù)功能時(shí)序圖
本系統(tǒng)的實(shí)現(xiàn)基于ThinkPHP 框架,遵循MVC 架構(gòu),采用HTML、CSS、jQuery、PHP 等進(jìn)行開發(fā)[5],如圖12 所示。具體地,前端采用HTML 語言顯示基本內(nèi)容,使用CSS 對(duì)頁面進(jìn)行格式排版,使用ThinkPHP 框架的View 視圖層進(jìn)行封裝;業(yè)務(wù)處理采用ThinkPHP框架的Controller 控制器,在對(duì)客戶請(qǐng)求進(jìn)行處理時(shí),調(diào)用相應(yīng)的業(yè)務(wù)邏輯層函數(shù)完成相應(yīng)的功能;采用ThinkPHP 框架的數(shù)據(jù)庫擴(kuò)展功能實(shí)現(xiàn)MySQL 數(shù)據(jù)庫的連接,并采用ThinkPHP 框架的Model 數(shù)據(jù)模型層實(shí)現(xiàn)PHP 代碼與MySQL 數(shù)據(jù)庫表連接,以面向?qū)ο蟮姆绞教幚頂?shù)據(jù)庫。本文以《Web 前端開發(fā)實(shí)踐》課程中搭建一個(gè)基于Apache 的Web 服務(wù)器為例,介紹Docker容器的應(yīng)用效果。
圖12 系統(tǒng)實(shí)現(xiàn)架構(gòu)示意圖
用戶填寫相應(yīng)信息,選擇鏡像、資源文件夾大小、開放端口,程序判斷無誤后即可創(chuàng)建容器。用戶可選擇的連接容器使用AJAX 異步查詢并顯示。收到用戶的申請(qǐng)后,后臺(tái)先根據(jù)用戶填寫的需求拼接Docker 操作命令,然后再交由DockerHelper 類執(zhí)行[6]。若在創(chuàng)建容器時(shí)選擇了需要資源文件夾,則需要在資源服務(wù)器上分配所選容量的文件夾給用戶使用。本系統(tǒng)使用磁盤配額技術(shù)限制該文件夾的大小。申請(qǐng)容器的功能界面如圖13 所示,主要代碼實(shí)現(xiàn)如下所示。
圖13 申請(qǐng)容器
//通過數(shù)據(jù)庫,生成一個(gè)資源文件夾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;
}
//解析要連接容器,并產(chǎn)生真正的容器名
if($linkChoice!==""&&$linkChoice!=="(無)"&&$link-Choice!=="(無)"){
$linkChoice=$account.'-'.$linkChoice;
}else{
$linkChoice="";
}
$helper=$this->getDockerHelper();
//執(zhí)行Docker 中的創(chuàng)建容器命令
$result=$helper->createContainer($account,$imageName,
$cname,$linkChoice,$resSize,$resId,$cportList)->getData();
容器開啟時(shí)將連接資源服務(wù)器并作如下操作:①查看其端口映射情況,更新數(shù)據(jù)并顯示;②查看硬盤占用情況;③獲取容器默認(rèn)目錄下的文件。容器管理功能界面如圖14 所示。
圖14 容器管理
本文應(yīng)對(duì)在線虛擬仿真實(shí)驗(yàn)在提升學(xué)生實(shí)踐創(chuàng)新能力方面存在的不足,設(shè)計(jì)并實(shí)現(xiàn)了一種基于Docker的在線虛擬仿真實(shí)驗(yàn)容器系統(tǒng)。該系統(tǒng)實(shí)現(xiàn)了后臺(tái)服務(wù)器系統(tǒng)、資源服務(wù)器、客戶端、管理員等功能模塊。在實(shí)際的實(shí)踐教學(xué)環(huán)節(jié)應(yīng)用過程中,該系統(tǒng)通過圖形化界面,結(jié)合Docker 的相關(guān)指令及其他輔助功能,可降低用戶使用容器過程中的門檻,提高用戶進(jìn)行在線虛擬仿真實(shí)驗(yàn)的便捷性,體現(xiàn)出良好的應(yīng)用效果,在深化信息技術(shù)與教育教學(xué)的融合發(fā)展中具有明顯的積極意義。