李慧春
(吉林大學 公共計算機教學與研究中心,長春 130021)
高校實驗室是進行實驗教學、科學研究、人才培養的重要基地。如何高質量高效率地管理實驗室,創新實驗室管理方法,是實驗技術人員必須認真研究與探索的問題[1-3]。本文在實驗室內利用Docker技術快速搭建起來一個HTTP服務器,同一局域網內其他計算機通過瀏覽器訪問這臺服務器,可以下載各種格式的文件。這種瀏覽器與服務器(B/S)的架構模式,既有利于實驗員在各臺學生機上安裝教學軟件,也有利于教師隨時隨地分享教學課件給學生。相比于傳統的U盤拷貝方式,具有節省時間,防止U盤病毒傳播的優點。
局域網內傳輸文件是一種普遍性的需求,目前應用比較廣的解決方案有以下幾種[4-6]:
(1)操作系統自帶的文件共享方式。把文件或驅動器設置為網絡共享的,同一局域網內的其他電腦可以通過訪問共享文件夾下載文件。這種方法雖然不需要額外安裝軟件,但是由于操作系統版本、組策略設置、Windows防火墻等問題,用戶使用并不是很方便。
(2)專用的文件傳輸軟件。專業軟件如飛鴿傳書、飛秋、Dukto等都做得很優秀。這些軟件由于是局域網內進行文件傳輸的專業工具,所以具有操作簡單,傳輸速度快的優點。缺點是傳輸雙方需要安裝同一個軟件。
(3)FTP/WEB服務器模式。用戶通過FTP客戶端或瀏覽器訪問服務器可以下載所需要的資源。目前應用比較多的有HFS(HTTP File Server)工具等。這種模式使用起來很方便,接收方只需要安裝瀏覽器就可以了。本文方法屬于此模式。
(4)其他工具,如QQ,BitTorrent,百度云網盤等。這類工具帶有局域網傳輸文件的功能但并非僅限于局域網傳輸,大部分需要外網支持。它們功能強大,但針對性不強。
Docker是基于go語言實現的開源的容器引擎,誕生于2013年[7]。Docker容器是在操作系統層面上實現虛擬化,直接使用本地主機的操作系統。傳統虛擬化方式下每個虛擬機都會有虛擬的GuestOS,需要額外的操作系統開銷。相比起來,Docker容器更加輕量級。Docker具備的諸多優點使其發展前景被業內普遍看好。現在主流的Linux操作系統都已經支持Docker。在最近Linux基金會的調查中,Docker是僅次于OpenStack的最受歡迎的云計算開源項目[8]。
Docker的大部分操作都圍繞著它的3大核心概念——鏡像、容器和倉庫而展開。Docker鏡像可以包含一個基本的操作系統環境,里面僅安裝了Apache應用程序,或用戶需要的其他軟件。容器是從鏡像創建的運行實例。可以把Docker容器看作是一個簡易版的Linux系統環境(包括root 用戶權限、進程空間、用戶空間和網絡空間等)以及運行在其中的應用程序打包而成的盒子。Docker倉庫類似于代碼倉庫,它是Docker集中存放鏡像文件的場所。目前最大的公開倉庫是官方提供的Docker Hub,其中存放了數量龐大的鏡像供用戶下載[9]。
Docker在主流的操作系統和云平臺上都可以使用,包括Linux操作系統(如Ubuntu、Debian、CentOS、Redhat等)、MacOS操作系統和Windows操作系統,以及AWS等云平臺。目前Linux操作系統對Docker的支持是原生的,使用體驗最好。對于Windows操作系統來說,目前只有Win10專業版和企業版用戶可以使用官方的Docker for Windows應用來安裝Docker,其他版本需要通過虛擬機方式安裝[10-11]。
超文本傳輸協議(HyperText Transfer Protocol,HTTP)是用于從www服務器傳輸超文本到本地瀏覽器的傳送協議[12]。
HTTP url的格式如下
http://host[:port][abs_path]
其中,http表示要通過HTTP協議來定位網絡資源;host表示合法的Internet主機域名或者ip地址;port指定一個端口號,為空則使用默認端口80;abs_path指定請求資源在服務器上的位置。
客戶端發送一個url到服務器后,服務器會給予相應的響應信息。客戶端接收服務器所返回的信息,通過瀏覽器顯示在用戶的顯示屏上。
如果在以上過程中的某一步出現錯誤,那么產生的錯誤信息將返回到客戶端,由顯示屏輸出。對于用戶來說,這些過程是由HTTP自己完成的,用戶只要用鼠標點擊,等待信息顯示就可以了。
由于實驗室的計算機操作系統多為Windows,本文在實驗室中選擇作為HTTP服務器的計算機系統為Win10家庭版,因此需要通過在Docker官網下載Docker Toolbox來安裝Docker[13]。安裝過程結束后,Docker Toolbox自動在物理主機上安裝了VirtualBox軟件,該軟件內運行了Linux虛擬機,也可以稱為Docker主機或Docker虛擬機。在Docker虛擬機中可以創建Linux系統,稱為容器。桌面上多出Docker Quickstart Terminal、Oracle VM VirtualBox和Kitematic 3個應用圖標。其中Docker Quickstart Terminal可以啟動Docker虛擬機。打開Oracle VM VirtualBox應用圖標,會看到Docker默認創建的虛擬機default。
主機上的任意文件夾都可以掛載到Docker虛擬機下。為了避免出現不必要的麻煩,文件夾和里面存放的文件名稱最好不要出現中文。不失一般性,在主機的E盤建立一個文件夾,命名為FolderWin,在該文件夾下加入hello.txt和singer.rar文件。現在把FolderWin目錄掛載到Docker的虛擬機下。進入default虛擬機的設置頁面,添加共享文件夾,并且把共享文件夾在虛擬機中也命名為“FolderWin”,操作如圖1所示。
然后在default虛擬機上點擊右鍵,選擇“顯示”,進入虛擬機,輸入以下命令:
cd /mnt
mkdir FolderVM
mount -t vboxsf FolderWin /mnt/FolderVM

圖1 主機與虛擬機共享文件夾設置
這段命令表示:首先進入虛擬機根目錄下的mnt文件夾,新建FolderVM文件目錄。將物理機上FolderWin目錄掛載到虛擬機上,文件系統類型為vboxsf。掛載后查看FolderVM的子目錄。如圖2所示,可以看到主機E:FolderWin文件夾下的文件已經可以顯示出來了。此時在主機的FolderWin文件夾下再加入其它文件,在default虛擬機的/mnt/FolderVM目錄下運行“ls”命令也是可以看到的。這樣就達到了教師隨時隨地在FolderWin目錄下放入文件供學生下載的目的。

圖2 主機文件夾掛載到Docker虛擬機
Dockerfile是構建鏡像的基本方式,它通過一系列的指令來告訴Docker怎樣創建和配置容器[14]。本文使用http-server程序來建立服務器。http-server是一個簡單的、無需任何配置的命令行服務器,用戶可以通過HTTP協議查看服務器所指定工作目錄下的文件[15]。
(1)進入default虛擬機,創建一個目錄,假定命名為myHTTPServer。在該目錄下,用touch命令創建一個文件,命名為Dockerfile,沒有擴展名。需要注意的是default虛擬機默認的工作目錄是/root,它僅僅掛載在內存中,關閉系統后數據會丟失。所以最好切換到其他目錄下再創建myHTTPServer目錄。
(2)打開Dockerfile,在該文件中輸入如下內容:
FROM ubuntu:latest
MAINTAINER abcdeabcde@example.com
RUN apt-get update
RUN apt-get install -y nodejs
RUN apt-get install -y npm
RUN npm install -g http-server
WORKDIR /usr/apps/myProjects/
CMD [“http-server”,“-s”]
這幾句命令的意思是:以ubuntu:latest為基礎鏡像新建一個鏡像。接下來是創建者的姓名和郵箱,也可以不寫。然后更新apt-get工具,并使用它來安裝nodejs和npm。這里使用npm工具來安裝http-server。工作目錄設置為/usr/apps/myProjects/。最后使用http-server命令來運行http-server。Dockerfile文件寫好后保存退出即可。
(3)在myHTTPServer目錄下執行如下命令:
docker build -t “spring:http-server” .
這個命令使用當前目錄下的Dockerfile文件創建了一個spring:http-server的鏡像,其中spring是本文示例倉庫的名字,可以任意指定,http-server是鏡像的標簽。
(4)在Docker終端的命令行工具下,執行如下命令:
docker run -d -v /mnt/FolderVM:/usr/apps/myProjects/-p 8080:8080 “spring:http-server”
這段命令表示:啟動spring:http-server程序,創建容器。通過“-d”參數,把啟動的程序設置到后臺運行。通過參數“-v”,把虛擬機的/mnt/FolderVM目錄掛載到容器的/usr/apps/myProjects/目錄,實現二者之間的數據交換。由于前面已經把主機的E:FolderWin與/mnt/FolderVM 做了對應,所以這里間接實現了主機文件夾和容器工作目錄的對應。最后實現了容器的8080端口與虛擬機的8080端口的映射。命令中的前一個8080是虛擬機的端口號,后一個8080是容器的端口號。容器的端口號必須是8080,因為它是http-server對外提供服務的指定端口。
(5)為確認程序spring:http-server是否運行,可以通過執行命令“docker ps”進行查看。
由于Docker的底層使用了Linux容器技術(LXC),其實它只能運行在Linux上,而在Windows系統下要運行Docker,實際上是在虛擬機下運行的。在2.3小節中實現了容器的8080端口與虛擬機的8080端口之間的映射,還需要在VirtualBox的設置中,為NAT網絡模式增加端口轉發規則,把虛擬機的8080端口與主機的8080端口進行映射,如圖3所示。

圖3 端口轉發設置
查看作為服務器的物理主機的ip,學生機在瀏覽器輸入網址http://ip:8080,就可以訪問服務器文件夾FolderWin并下載所需資料了(實驗所用服務器的ip為192.168.31.14)。
為了驗證本文方法的性能,在實驗室機房進行了文件分發性能測試。測試機房安裝有40臺學生機,1臺教師機。學生機與教師機的配置均為:cpu型號i5-6500,4GB內存,1TB硬盤,Win10家庭版64位操作系統。所有計算機連接在2臺24口H3C千兆交換機上,型號為S1224R。所有交換機連接在1臺H3C路由器上,型號為S5120。
把教師機配置為本文方法的服務器。在學生機上使用IE瀏覽器訪問服務器下載文件。為了測試多點同時下載時服務器的抗壓性能,測試文件選用2.40GB的大文件。學生機下載前打開IE瀏覽器自帶的抓包工具,下載完成后,記錄下載文件所用的時間。統計結果如表1所示。
由表1可以看出,從教師機下載文件時的速度會隨著學生機結點數的增多而變慢。這與局域網中計算機的網卡速率,網絡環境有關系。另外,服務器在多點下載時能夠穩定運行,沒有出現崩潰現象。

表1 不同學生機結點下載文件花費時間表
本文研究并實現了一種基于Docker的實驗室文件共享方法。我校由于Docker的引入,只需要簡單的幾步操作就可以快速搭建起來一個HTTP服務器,為實驗室內其他學生機提供所需的下載文件。雖然現在能夠實現局域網內文件共享的方法很多,但是本文另辟蹊徑,具有一定的參考意義。未來將繼續研究實驗室管理的新方法。