陶銘,曲超
(東莞理工學院計算機科學與技術學院,東莞523808)
“新工科”建設背景下,需要培養復合型人才和創新性人才,這就需要培養學生將所學理論知識應用于實踐的能力,以及將所學的專業知識創造性地應用于新的領域或跨多重領域,進行研發或創新的能力[1]。因此,實驗教學成為培養學生這些能力的重要環節。然而,現有的實驗教學模式受到場地、設備及師資等多方面的影響,嚴重制約著實驗教學水平的提升以及學生實踐能力的培養。
近年來,逐步發展起來的虛擬仿真實驗作為物理實驗的一種替代技術,以其低成本等特點,已被廣泛應用于實驗教學,且被證明是應用信息技術解決高校實驗教學環節中存在問題的可行途徑。然而,目前虛擬仿真實驗的開發利用相對比較初步,研究重點主要集中于實驗功能的實現,往往僅局限于物理實驗的替代,而極少地進一步發揮其信息處理能力,并且在擴展能力和集成能力等方面存在嚴重的不足,如:缺乏遠程訪問和并發服務能力。虛擬仿真軟件往往是一個純客戶端軟件,可以在單機上運行,實驗人員往往需要分別下載并各自運行。既不能運程訪問,也不具備并發服務能力,難以同其他軟件進行直接交互,無法直接進行在線實驗[2]。
為此,為更充分地發揮虛擬仿真實驗的優勢,更好地培養學生實踐創新的能力,以及提升學生“學以致用”的水平,本文基于輕量級的操作系統虛擬化解決方案Docker[3],設計并實現了一種在線虛擬仿真實驗容器系統。系統實現了后臺服務器系統、資源服務器、客戶端、管理員等功能模塊,旨在通過圖形化界面,結合Docker 的相關指令以及其他輔助功能,降低用戶使用容器過程中的門檻,提高用戶進行在線虛擬仿真實驗的便捷性。
本系統的用戶有兩種:普通用戶和管理員。普通用戶的主要功能包括兩大模塊:容器和工單。容器模塊包括申請、管理及使用,用例圖如圖1 所示。用戶申請容器通過填寫并提交表單來執行。用戶對容器的管理包括開啟、關閉及刪除。用戶對容器的使用分為容器內的文件操作、服務管理。容器內的文件操作包括在容器中上傳、創建、刪除、重命名、移動、復制文件以及新建、刪除文件夾;服務管理中的“服務”指的是Linux 命令,Linux 命令保存為服務后,點擊執行可以在容器內執行該命令,對容器外的環境沒有影響。服務管理還包括修改服務、刪除服務、添加默認服務。

圖1 容器模塊用例圖
工單模塊包括了創建、回復、查看、搜索、關閉,用例圖如圖2 所示。工單是作為用戶和管理員交流溝通的重要途徑。用戶填寫工單后,管理員能夠接收到用戶發出的消息,進而回復并跟進用戶提出的問題,用戶也能在工單中與管理員繼續反饋。關閉工單功能是給用戶在認為已經解決問題后,手動將工單狀態設置為關閉。

圖2 (普通用戶)工單模塊用例圖
管理員的主要功能包括以下模塊:用戶、控制臺、容器、工單。用戶模塊包括顯示用戶信息列表、顯示用戶操作記錄,用例圖如圖3 所示。用戶信息列表中是用戶的基本信息,包括其學號、用戶名等。用戶操作記錄指用戶登錄、申請容器、使用容器、創建工單、回復工單等操作。用戶在進行這些操作時會被系統記錄,并形成日志文件便于分析。

圖3 管理員端用戶模塊用例圖
控制臺模塊包括顯示當前用戶數、顯示當前容器數、顯示當前未讀消息數、顯示當前資源服務器的CPU及內存占用情況、定時處理過期容器,用例圖如圖4 所示。未讀消息指的是未查看的工單回復,若是剛創建的工單,工單內的第一條消息也被認為是未讀消息。

圖4 控制臺模塊用例圖
管理員端容器模塊包括顯示容器列表、顯示容器詳情、容器管理、容器信息統計,用例圖如圖5 所示。容器管理包括開啟、關閉、刪除。容器信息統計是從容器創建日期分布、已開啟容器數量、鏡像使用分布這些角度進行統計。

圖5 管理員端容器模塊用例圖
管理員端工單模塊包括查看工單列表、新建工單、查看工單詳情、回復工單,用例圖如圖6 所示。工單列表能夠突出顯示有未讀消息的工單,表現為該工單標題后有個帶數字的徽章,徽章內數字表示當前未讀消息的數量。

圖6 管理員端工單模塊用例圖
本系統在體系結構上分為三部分:界面表示層、業務邏輯層以及數據與資源層[4],如圖7 所示。客戶端和管理員端為界面表示層,為普通用戶和管理員展示所需要的界面,并顯示從后臺獲取的數據;后臺服務器系統屬于業務邏輯層,作為一個中間層,既負責為客戶端和管理員端提供必要數據和業務邏輯,又負責管理數據與資源層;數據與資源層有資源服務器和數據庫,其中,資源服務器是安裝有Docker 的Linux 宿主機。

圖7 系統體系結構示意圖
基于上述對普通用戶及管理員的功能需求分析,將分別展示申請容器、開啟容器、上傳文件、復制文件及添加自定義服務的功能時序圖。其他的功能在流程上與上述功能有相似之處。
申請容器是根據收集填寫的信息并創建容器,其功能時序圖如圖8 所示。
開啟容器操作除了在資源服務器中開啟容器外,還會收集容器的相關信息,其功能時序圖如圖9 所示,操作流程如圖10 所示。關閉容器和刪除容器與其類似,只是少了向資源服務器查詢容器信息的步驟。

圖8 申請容器功能時序圖

圖9 開啟容器功能時序圖

圖10 開啟容器的流程圖
添加自定義服務的功能時序圖如圖11 所示。編輯服務、刪除服務在流程上與其類似。而添加默認服務與其不同點在于服務的信息是通過檢索數據庫獲得。

圖11 添加自定義服務功能時序圖
本系統的實現基于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 系統實現架構示意圖
用戶填寫相應信息,選擇鏡像、資源文件夾大小、開放端口,程序判斷無誤后即可創建容器。用戶可選擇的連接容器使用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();
容器開啟時將連接資源服務器并作如下操作:①查看其端口映射情況,更新數據并顯示;②查看硬盤占用情況;③獲取容器默認目錄下的文件。容器管理功能界面如圖14 所示。

圖14 容器管理
本文應對在線虛擬仿真實驗在提升學生實踐創新能力方面存在的不足,設計并實現了一種基于Docker的在線虛擬仿真實驗容器系統。該系統實現了后臺服務器系統、資源服務器、客戶端、管理員等功能模塊。在實際的實踐教學環節應用過程中,該系統通過圖形化界面,結合Docker 的相關指令及其他輔助功能,可降低用戶使用容器過程中的門檻,提高用戶進行在線虛擬仿真實驗的便捷性,體現出良好的應用效果,在深化信息技術與教育教學的融合發展中具有明顯的積極意義。