139 期 - 共用系統核心資源,玩轉 Windows Server 容器


網管人雜誌

本文刊載於 網管人雜誌第 139 期 - 2017 年 8 月 1 日出刊,NetAdmin 網管人雜誌 為一本介紹 Trend Learning 趨勢觀念、Solution Learning 解決方案、Technology Learning 技術應用的雜誌,下列筆記為本站投稿網管人雜誌獲得刊登的文章,網管人雜誌於每月份 1 日出刊您可於各大書店中看到它或透過下列圖示連結至博客來網路書店訂閱它。





文章目錄

前言
Windows 容器類型
Windows 容器運作環境需求
實戰架設 Windows Server 容器環境
          下載及安裝 Docker 運作環境
          下載 Windows Server 基礎容器映像檔
          部署第 1 個 Windows Server 容器 - Hello World
          部署第 2 個 Windows Server 容器 - IIS
客製化 Windows Server 容器
          重新建立新的容器映像檔
          推送容器映像檔至 Docker Hub
          測試客製化的 IIS 容器
結語





前言

在 2013 年時,有家名為 dotCloud 提供 SaaS 服務的公司,在該公司內有項名稱為 Docker 的業餘專案,它是使用 Google 的 Go 語言進行實作。後來,dotCloud 公司讓此專案加入 Linux 基金會並在 GitHub 進行推廣及維護,此專案迅速受到廣大開發人員的喜愛同時也讓 DevOps 議題捲起更大的浪潮,甚至 dotCloud 公司後來直接改名公司名稱為 Docker Inc。

Docker 容器管理技術如此受歡迎的主要原因之一,在於過去最困擾開發人員與維運人員的部分便是快速建立完備的開發環境,舉例來說,當開發人員需要某些開發環境時,企業或組織的維運人員便依需求建立 VM 虛擬主機、安裝作業系統、組態設定網路環境……等,接著再交由開發人員安裝相關應用程式或載入函式庫……等,此時才準備好整個開發環境,而 Docker 的出現剛好能夠解決這個困擾已久的問題。
Docker 容器管理技術,已經在 DockerCon 2017 大會上由 Docker 創辦人兼技術長 Solomon Hykes 發佈說明,從今天開始 GitHub 上原有 Docker 專案的程式碼、運作元件……等,都屬於新的開放原始碼專案「Moby」。

事實上,「容器」(Container)技術早已出現許久,而 Docker 則是讓容器管理這項工作任務便得容易操作及管理。一開始,Docker 容器管理技術普遍只能運作在 Linux 環境中,而微軟自從新任執行長 Satya 上任並大力擁抱開放原始碼之後,也在新一代的 Windows Server 2016 雲端作業系統中與 Docker 公司合作,打造出在 Windows Server 2016 作業系統中原生執行 Docker 引擎的容器管理環境。

雖然,在 Windows Server 2016 作業系統中已經成功打造 Docker 容器管理環境,但是整個 Docker 容器管理實作技術與 Linux 作業系統環境是完全不同的。簡單來說,Linux 容器映像檔並無法運作在Windows Server Container 容器環境內,而 Windows 容器映像檔也無法運作在 Linux Container 容器環境中,根本原因是採用「不同 API」(Windows API vs Linux API)的運作環境,那麼我們來看看有哪些根本上的不同:

Linux 容器環境
  • Control Group: 控制群組,針對共享資源進行隔離並管控硬體資源的使用,例如,記憶體、檔案快取、CPU、磁碟 I/O……等資源使用率的管理。
  • Namespaces: 命名空間,確保每個容器都有單獨的命名空間,讓容器之間的運作互相隔離不受任何影響。
  • AUFS: 檔案系統,不同容器之間可以共享相同基礎的檔案系統層,實現分層功能並將不同目錄掛載到同一個虛擬檔案系統中。


Windows 容器環境
  • Job Objects: 類似 Linux 容器環境中的控制群組機制。
  • Object Namespace、Process Table、Networking: 類似 Linux 容器環境中的命名空間機制。
  • Compute Service: 作業系統層級的運算服務層。
  • NTFS: 檔案系統,每個運作的容器各自擁有 1 份 NTFS 分區表,搭配虛擬區塊儲存裝置建立容器多層式檔案系統,接著再利用 Symlink 機制把不同層級的檔案對應到 Host 環境檔案系統內的實際檔案,以便減少虛擬區塊儲存裝置所占用的儲存空間。

圖 1、Linux 與 Windows 容器環境運作架構示意圖
在 DockerCon 2017 大會上,同時發佈「LinuxKit」這個全容器化的 Linux 技術環境,希望打破不同作業系統平台(Windows 與 Linux)、虛擬化環境(VMware、KVM……等)、雲端環境(Google Cloud、AWS、Azure、Bluemix……等)、硬體(Intel 處理器、ARM 處理器、桌上型主機、筆記型電腦、伺服器、IoT 裝置……等),皆能建立 Docker 容器管理環境。

此外在 Docker 版本的部分在 2017 年也有重大改變,從 2017 年 3 月開始 Docker 採用新的版本以及版本命名規則。首先,Docker EE(Enterprise Edition)取代舊有的 Docker CS(Commercially Supported)版本,而 Docker 開放原始碼版本重新命名為 Docker CE(Community Edition)。至於版本命名規則與 Ubuntu 的命名規則類似,將以西元的「年 . 月」的方式命名,例如,v17.03、v17.06、v17.09……等。

圖 2、Docker 版本命名規則示意圖





Windows 容器類型

在 Windows 容器環境中,包含 2 種不同的容器類型或稱「執行階段」(Runtimes),分別是「Windows Server 容器」(Windows Server Container)以及「Hyper-V 容器」(Hyper-V Container)

  • Windows Server 容器: 透過程序和命名空間隔離技術提供應用程式隔離功能,讓運作於 Windows Server 容器環境中的容器能夠共用系統核心資源,這樣的運作方式與 Linux 容器環境類似。
  • Hyper-V 容器: 享有獨立系統核心資源,採用經過最佳化程序的 VM 虛擬主機執行容器環境,有效擴充原有 Windows Server 容器所提供的隔離環境。值得注意的是,執行 Hyper-V 容器的 VM 虛擬主機並非傳統的 Hyper-V VM 虛擬主機,而是運作 Windows Server 容器的特殊 VM 虛擬主機,並且具備獨立的系統核心、Guest 運算服務、基礎系統執行程序……等。
圖 3、Windows Server 容器與 Hyper-V 容器運作架構示意圖





Windows 容器運作環境需求 

在 Windows 容器環境需求方面,採用 Windows Server 2016 雲端作業系統建立 Windows 容器環境時,不管採用的是 GUI 圖形介面版本、Server Core 文字介面版本,甚至是最精簡的 Nano Server 版本都同時支援「Windows Server 容器及 Hyper-V 容器」

但是,倘若採用 Windows 10 桌面端作業系統欲建立 Windows 容器環境時,並不支援建立 Windows Server 容器運作環境,而是僅支援建立「Hyper-V 容器」運作環境,並且只有採用 Windows 10 專業版及企業版,並且安裝及啟用 Hyper-V 角色才提供建立 Hyper-V 容器運作環境。

此外,在 Windows 容器運作環境中具備 2 種容器映像檔,分別是 Windows Server Core 及 Nano Server 容器映像檔,然而並非所有作業系統版本都同時支援運作這 2 種容器映像檔。在下列表格當中,分別條列作業系統版本支援的 Windows 容器類型以及容器映像檔:

作業系統版本
Windows Server 容器
Hyper-V 容器
Windows Server 2016 GUI 圖形介面
Server Core / Nano Server
Server Core / Nano Server
Windows Server 2016 Server Core
Server Core / Nano Server
Server Core / Nano Server
Windows Server 2016 Nano Server
僅支援 Nano Server
Server Core / Nano Server
Windows 10 專業版/企業版
不支援
Server Core / Nano Server

值得注意的是,倘若管理人員希望在 Hyper-V 虛擬化平台中的 VM 虛擬主機,能夠同時運作 Windows Server 容器環境及 Hyper-V 容器環境的話,因為先前已經說明 Hyper-V 容器環境是運作特殊的 VM 虛擬主機,所以上層的這台 VM 虛擬主機必須啟用「巢狀式虛擬化」(Nested Virtualization)功能才行。

簡單來說,管理人員必須確保 Hyper-V 虛擬化平台符合運作巢狀式虛擬化機制,以便將「虛擬化擴充功能」(Virtualization Extensions)也就是底層硬體輔助虛擬化技術,傳遞給 Hyper-V 虛擬化平台上運作的 VM 虛擬主機當中的客體作業系統,達成 VM 虛擬主機中再生出 VM 虛擬主機的巢狀式虛擬化運作架構。
有關 Hyper-V 虛擬化平台建構巢狀式虛擬化環境的詳細資訊,請參考本刊雜誌第 133 期專題報導「實作 Hyper-V 巢狀虛擬化,測試研發效率大提升」

圖 4、Hyper-V 虛擬化平台巢狀式虛擬化運作架構示意圖





實戰架設 Windows Server 容器環境

下載及安裝 Docker 運作環境

首先,我們透過 OneGet Provider 機制,安裝 PowerShell 的 Docker 模組以便稍後 Windows Server 能夠運作 Docker 運作環境。請開啟 PowerShell 命令視窗,並鍵入「Install-Module -Name DockerMsftProvider -Repository PSGallery -Force」指令,系統便會自動由 PowerShell Gallery 中,下載及安裝 Docker-Microsoft PackageManagement,執行下載及安裝指令後,當 PowerShell 視窗出現「需要 NuGet 提供者才能繼續」的詢問訊息時,請按下「Y 鍵」以便繼續安裝程序。
Docker 運作環境,是由「Docker 引擎」(Docker Engine)「Docker 用戶端」(Docker Client)所組成。

接著,請鍵入「Install-Package -Name docker -ProviderName DockerMsftProvider -Force」指令,使用 PackageManagement 中的 PowreShell 模組安裝最新版本的 Docker 運作環境,當安裝程序完成後系統會提示你應該要重新啟動主機,以便 Windows Server 當中的 Docker 運作環境能夠套用生效,請鍵入「Restart-Computer -Force」指令重新啟動 Windows Server 主機。

圖 5、為 Windows Server 安裝 Docker 運作環境

當 Windows Server 主機重新啟動後,查詢 Windows Server 主機網路連線的部分,會發現多出「vEthernet(HNS Internal NIC)」的虛擬網路卡,並且 IP 位址為「172.x.x.x / 255.255.240.0」(本文實作環境 IP 為 172.27.144.1)。這個虛擬網路卡便是屆時 Docker 運作環境中容器虛擬網路的部分,後續我們再進行詳細說明。

圖 6、負責 Docker 運作環境中容器的虛擬網路

當 Windows Server 下載及安裝 Docker 運作環境後,便可以透過基礎操作指令來了解 Docker 運作環境的相關資訊,舉例來說,管理人員可以鍵入「docker info」指令,系統便會詳細顯示目前 Windows Server 主機的 Docker 運作環境資訊,包含運作中的容器數量、暫停狀態的容器數量、停止狀態的容器數量、容器虛擬網路類型、容器主機記憶體容量……等。倘若,希望查詢目前 Windows Server 主機的 Docker 版本資訊時,只要鍵入「docker version」指令即可,如操作結果所示本文實作環境中 Docker 引擎及 Docker 用戶端版本為「17.03.1-ee-3」

圖 7、查詢 Windows Server 主機的 Docker 運作環境版本資訊



下載 Windows Server 基礎容器映像檔

在 Windows Server 的容器運作環境中,有 2 種不同類型的基礎容器映像檔分別是 Windows Server Core 及 Nano Server。倘若,管理人員希望下載 Windows Server Core 容器映像檔,只要開啟 PowerShell 指令視窗後鍵入「docker pull microsoft/windowsservercore」指令即可,若是希望下載 Nano Server 容器映像檔,只要開啟 PowerShell 指令視窗後鍵入「docker pull microsoft/nanoserver」指令即可。

圖 8、下載 Windows Server Core 及 Naon Server 容器映像檔

事實上,當鍵入上述 2 行指令後,本地端的 Windows Server 主機便會至 Docker Hub 網站,下載由 Windows 官方建立的 Windows Server Core 及 Nano Server 容器映像檔,因此管理人員並不用擔心下載到被加入惡意程式的容器映像檔。

那麼,這 2 個下載的 Windows Server Core 及 Nano Server 容器映像檔將會佔用多少空間呢 ?此時,管理人員只要鍵入「docker images」指令即可查看,在本文實作環境中可以看到 Windows Server Core 容器映像檔為「10.2GB」,而 Nano Server 容器映像檔則是「1.02GB」

圖 9、查詢 Windows Server Core 及 Naon Server 容器映像檔佔用空間大小



部署第 1 個 Windows Server 容器 - Hello World

至此,Windows Server 容器運作環境已經準備完畢,管理人員可以直接從 Docker Hub 下載預先建立好的 Hello World 範例容器,以便部署及執行簡單的 Hello World 應用程式。請在開啟的 PowerShell 指令視窗中,鍵入「docker run hello-world:nanoserver」指令即可。由於,我們剛才已經先行下載好 Windows Nano Server 容器映像檔,所以不用再次下載 Nano Server 容器映像檔,因此你會發現執行這個 Hello World 容器的速度非常快速。

圖 10、部署及執行第 1 個 Windows Server 容器



部署第 2 個 Windows Server 容器 - IIS

在剛才的練習中,我們已經順利運作第 1 個 Windows Server 容器。接著,我們實作練習第 2 個最常使用的 Windows Server 容器「IIS 網頁伺服器」,請鍵入「docker run -d --name MyIIS -p 80:80 microsoft/iis」指令即可,此行指令中「-d」參數表示此執行的 IIS 容器在背景運作,而「--name MyIIS」則是給予此 IIS 容器的名稱,至於「-p 80:80」則表示將 Windows Server 主機的 Port 80,與執行運作的 IIS 容器 Port 80 進行對應的動作。

由於此 IIS 容器會使用 Windows Server Core 容器映像檔為作業系統基底,所以 Windows Server 主機若沒有 Windows Server Core 容器映像檔的話,便會需要花費額外的下載及安裝時間。在本文實作環境中,我們已經於剛才下載好 Windows Server Core 容器映像檔所以無須等待重下載及安裝時間,部署及執行 IIS 容器的動作完成後可以看到,此 IIS 容器佔用的空間大小為 10.5GB,也就是相較於 Windows Server Core 容器映像檔,加上 300MB 相關組態設定檔案。
事實上,倘若管理人員希望運作 Hyper-V 容器的話,只要加上「--isolation=hyperv」參數即可,當然前提是 Windows Server 主機已安裝及啟用 Hyper-V 角色。

圖 11、下載及執行基於 Windows Server Core 運作環境的 IIS 容器

在開始與剛才執行的 IIS 容器進行互動之前,管理人員可以先執行「docker ps」指令,查詢目前運作中的容器資訊,從執行結果可以看到目前 Windows Server 主機上運作的容器只有 1 個(透過 docker info 指令也能查詢容器運作狀態數量),並且可以看到容器 ID、容器映像檔、執行指令、容器建立時間、運作狀態、連接埠對應、容器名稱……等。

確認 IIS 容器仍持續運作中,接著執行「docker exec -i MyIIS cmd」指令進入 IIS 容器內執行互動作業,成功進行 IIS 容器互動模式後可以看到指令視窗中的提示字元,由原本的 PowerShell 變成命令提示字元。首先,請執行「del C:\inetpub\wwwroot\iisstart.htm」指令,刪除 IIS 容器內預設的歡迎頁面,然後執行「echo "This IIS Welcome page from Windows Server Container" > C: \inetpub\wwwroot\index.html」指令,將自訂字串訊息寫入 IIS 容器內的 IIS 歡迎頁面中。最後,便可以執行 exit 指令離開 IIS 容器互動模式回到 Windows Server 容器主機。

圖 12、進入 IIS 容器互動模式並自訂 IIS 歡迎頁面內容

完成 IIS 容器互動模式並自訂 IIS 歡迎頁面內容的動作後,請先確認 Windows Server 容器主機的防火牆規則中,是否已經允許 TCP Port 80 的網路流量能夠通過防火牆,接著請使用「別台主機」透過瀏覽器連接至 Windows Server 容器主機的 IP 位址,本文實作環境中 Windows Server 容器主機的 IP 位址為「http: //10.10.75.69」。此時,應該可以順利看到剛才我們所自訂的 IIS 歡迎頁面內容。
請注意,由於 Windows Server 容器虛擬網路 NAT 網路環境的關係,必須以「別台」主機透過瀏覽器才能確認能否瀏覽由 IIS 容器所提供的 IIS 歡迎頁面。倘若,從 Windows Server 容器主機採用「本機」的方式直接開啟瀏覽器,嘗試瀏覽由 IIS 容器所提供的 IIS 歡迎頁面時,將會發現是無法順利瀏覽的。

圖 13、順利看到剛才我們所自訂的 IIS 歡迎頁面內容

倘若,管理人員希望「停止」IIS 容器時,只要執行「docker stop < 容器名稱或容器 ID>」即可,後續希望再將 IIS 容器「啟動」時也只要執行「docker start < 容器名稱或容器 ID>」即可,若是希望「重新啟動」IIS 容器時請執行「docker restart < 容器名稱或容器 ID>」即可。
請注意,當容器的運作狀態為停止時透過「docker ps」指令是無法查詢到容器資訊的。此時,請執行「docker ps -a」便可以查詢到所有運作狀態的容器。

圖 14、針對容器進行停止、啟動、重新啟動等基本操作





客製化 Windows Server 容器

在剛才的實作練習中,我們都是執行官方預先提供的範例容器或下載及執行容器後再進行修改,接著我們將實作練習客製化 Windows Server 容器,依據企業及組織的運作需求自行打造符合內部運作環境的容器。



重新建立新的容器映像檔

以剛才我們所練習的 IIS 容器為例,請先執行「docker stop MyIIS」指令將 IIS 容器停止運作,使用「docker ps -a」指令確認 IIS 容器的運作狀態為「Exited」表示已經停止運作後,執行「docker commit MyIIS weithenn/myiis」指令,將剛才我們已經修改過內容的 IIS 容器,重新建立成新的容器映像檔並且客製化名稱為「weithenn/myiis」,重新建立容器映像檔的動作執行完成後,可以使用「docker images」指令進行確認。

圖 15、重新建立新的 IIS 容器映像檔並且客製化名稱為 weithenn/myiis



推送容器映像檔至 Docker Hub

重新建立 IIS 容器映像檔的動作執行完成後,我們可以將這個客製化的 IIS 容器映像檔推送至 Docker Hub,以便後續我們不管在哪一台 Windows Server 容器主機上需要使用此客製化 IIS 容器時,便能夠透過網際網路連線從 Docker Hub 網站下載後使用。

當然,管理人員必須先至 Docker Hub 網站註冊帳戶以便產生 Repositories 容器存放庫。確認 Docker Hub 帳戶註冊且運作無誤後,請回到 Windows Server 容器主機上執行「docker login」指令進行登入 Docker Hub 網站的動作,成功登入 Docker Hub 網站後執行「docker push weithenn/myiis」指令,將剛才重新建立 IIS 容器映像檔上傳至 Docker Hub 網站上。
請注意,預設情況下上傳至 Docker Hub 網站的容器映像檔為「公開」(Public),也就是公開給網際網路上的任何人下載使用,倘若管理人員希望這個容器為「私人」(Private)使用的話,請記得至 Docker Hub 網站針對此容器進行權限調整。
圖 16、上傳客製化的 IIS 容器映像檔至 Docker Hub 網站



測試客製化的 IIS 容器

順利將客製化後的 IIS 容器映像檔上傳至 Docker Hub 網站後,接著我們便可以測試是否能夠隨時由 Docker Hub 網站上,下載我們所客製化後的 IIS 容器映像檔並且執行部署的動作。首先,請執行「docker rmi weithenn/myiis」指令,將 Windows Server 容器主機中原有的 weithenn/myiis 容器映像檔刪除,並執行「docker images」指令再次確認 weithenn/myiis 容器映像檔是否已經刪除成功。

圖 17、將客製化的 IIS 容器映像檔刪除

確認已經 Windows Server 容器主機中原有的 weithenn/myiis 容器映像檔已經刪除後,便可以執行「docker pull weithenn/myiis」指令,讓 Windows Server 容器主機至 Docker Hub 下載剛才所上傳的 weithenn/myiis 容器映像檔,下載完成後便可以執行「docker run -d -p 80: 80 weithenn/myiis」指令,部署客製化過的 weithenn/myiis 容器映像檔,並執行「docker ps」指令確認 weithenn/myiis 容器是否運作中。

圖 18、至 Docker Hub 下載剛才所上傳的 weithenn/myiis 容器映像檔並進行部署作業





結語

透過本文的說明及實作練習,管理人員應該能夠體會到透過 Windows 容器技術,能夠以 Windows Server 容器提供類似 Linux 的容器環境,倘若需要更佳的容器隔離安全性的話則部署 Hyper-V 容器即可。同時,結合 Docker 容器管理技術,相信可以幫助企業及組織降低維運成本,同時也能降低資料中心維運人員的管理負擔。