網管人雜誌
本文刊載於 網管人雜誌第 167 期 - 2019 年 12 月 1 日出刊,NetAdmin 網管人雜誌 為一本介紹 Trend Learning 趨勢觀念、Solution Learning 解決方案、Technology Learning 技術應用的雜誌,下列筆記為本站投稿網管人雜誌獲得刊登的文章,網管人雜誌於每月份 1 日出刊您可於各大書店中看到它,或透過城邦出版人讀者服務網進行訂閱。前言
實戰 – Windows Server 2019 容器環境
下載和部署 SQL Server Express 容器
透過 Windows Admin Center 管理容器
客製化 SQL Server Express 容器
部署 Linux Based 的 SQL Server 容器
結語
前言
隨著容器風潮及微服務架構的興起,企業和組織對於容器調度平台的需求也不斷上升。事實上,容器管理技術之所以受到大家熱烈歡迎的重要原因之一,在於能夠有效解決過去困擾開發人員與維運人員的難題,也就是如何快速建立完整的開發和測試環境甚至是正式營運環境,舉例來說,未採用容器技術時,當開發人員需要特定的研發和測試環境,維運人員便要依照需求建立 VM 虛擬主機、安裝客體作業系統、組態設定網路環境、開通防火牆規則……等,將作業系統層級處理完畢後,再交給開發人員安裝應用程式和載入函式庫……等應用程式層級的部份,此時才算準備好開發環境並可能花費幾天的作業時間,然而容器技術的出現正好能夠快速解決這個困擾已久的問題。然而,企業和組織的管理人員應該已經發現,雖然容器技術能夠有效縮短運作環境建立的難題,但是在後續維運管理上卻為企業和組織帶來更多的挑戰和難題,舉例來說,在企業和組織既有虛擬化基礎架構中的 VM 虛擬主機,當底層實體伺服器需要進行硬體維運作業時,可以透過 Live Migration 即時遷移機制,線上不中斷的將 VM 虛擬主機遷移至別台實體伺服器上繼續運作,但是在容器運作環境中,針對容器的部份並沒有所謂即時遷移工作負載的概念,因為容器的基本運作概念就是螞蟻雄兵式分散整個大型工作負載,和一般維運人員習慣的高可用性機制並不相同。
此外,容器原生最適合的運作環境為「無狀態」(Stateless),但是企業和組織過去在 VM 虛擬主機上運作的工作負載則通常多為「有狀態」(Stateful),這在維運管理的習慣上也必須要進行調整。
因此,目前大家所公認的解決方案,便是在既有的虛擬化基礎架構中,將容器分批運作在不同的 VM 虛擬主機當中,如此一來便能將 VM 虛擬主機和容器這兩者的長處互相結合(如圖 1 所示)。
圖 1、VM 虛擬主機和容器協同運作架構示意圖
本文,將採用最新 Windows Server 2019 作業系統為實戰環境,並搭配啟用「容器」(Containers)的伺服器功能後,實作演練部署和運作 SQL Server 容器,以及當官方釋出的 SQL Server 容器映像檔不符合需求時,應該如何自行打包出客製化的 SQL Server 容器映像檔。
實戰 – Windows Server 2019 容器環境
在本文實作環境中,我們為採用 Windows Server 2019 作業系統的主機,安裝 「Windows 套件管理工具」(Windows PackageManagement)(如圖 2 所示),以便管理人員後續可以透過 PowerShell Cmdlet 指令,輕鬆為 Windows Server 2019 主機進行安裝、移除、查詢 …… 等軟體套件的管理作業。Windows 套件管理工具舊有名稱為 「OneGet Provider PowerShell Module」。現在,微軟已經正式重新命名為「Windows PackageManagement」。
圖 2、Windows PackageManagement 運作架構示意圖
請在透過管理者執行權限開啟的 PowerShell 視窗中,執行安裝 Docker Microsoft 套件管理提供者指令後,系統將會自動至 PowerShell Gallery 下載所需的軟體套件,並啟用 Windows Server 2019 主機的「容器」(Containers)伺服器功能後,為主機安裝 Docker 引擎和 Docker 用戶端。
接著,當 Docker Microsoft 套件管理機制安裝完成後,便會自動下載和安裝最新 Docker EE 企業版本的動作,在安裝程序中系統將會詢問是否信任此 PowerShell 封裝來源,請鍵入 Y 或 A 之後繼續安裝程序,當安裝作業完成後,系統將會提醒管理人員應該重新啟動主機以便套用生效,此時請鍵入「Restart-Computer -Force」指令重新啟動主機即可(如圖 3 所示)。
圖 3、透過 Windows PackageManagement 套件管理機制安裝最新 Docker EE 企業版本
當 Windows Server 2019 主機安裝的工作任務完成並重新啟動後,首先請確認主機是否多出一項名稱為「Docker Engine」(如圖 4 所示),並組態設定為自動啟動的系統服務。同時,主機也將多出名稱為「vEthernet(nat)」的網路卡,網路組態設定資訊 IP 位址為「172.x.x.x」子網路遮罩則是「255.255.240.0」,這將是屆時容器主機在部署和運作容器時,用於介接容器虛擬網路時使用。
確認主機 Docker Engine 系統服務順利啟動,並且網路功能運作正常後,管理人員便可以使用「docker info」和「docker version」指令,確認 Docker 容器的版本和運作資訊。
圖 4、確認 Docker 容器運作環境資訊和版本
下載和部署 SQL Server Express 容器
過去,在企業和組織的研發測試環境中,當需要小型 SQL Server 資料庫環境時,經常會採用 SQL Server Express 免費版本的資料庫,然而無論採用實體主機或 VM 虛擬主機,原則上都只能運作「單個」SQL Server Express 執行個體。現在,我們已經為 Windows Server 2019 主機準備好容器運作環境,接著便能透過運作 SQL Server Express 容器,輕易在單台主機中運作「多個」SQL Server Express 執行個體,因此後續無論要新增 SQL Server Express 執行個體,或是打掉測試環境重新建立 SQL Server Express 運作環境,相較於傳統實體主機或 VM 虛擬主機環境,除了更容易建構環境之外更節省許多建置時間。
首先,請在 PowerShell 視窗中執行「docker pull microsoft/mssql-server-windows-express」指令(如圖 5 所示),容器主機便會連線至 Docker Hub 網站中,下載由 Microsoft 官方打包建立的 SQL Server Express 容器映像檔 ,屆時這個 Windows 類型的 SQL Server Express 容器,可以部署和運作在 Windows Server 2016 或後續版本,以及 Windows 10 Professional/Enterprise 等容器主機環境中。
順利下載 SQL Server Express 容器映像檔之後,可以鍵入「docker images」指令查看容器映像檔資訊。
圖 5、下載 Microsoft 官方打包建立的 Windows SQL Server Express 容器映像檔
在下載 SQL Server Express 容器映像檔期間,我們在 Windows Server 2019 容器主機上,下載並安裝最新版本的 SSMS(SQL Server Management Studio)管理工具,以便稍後能夠透過 SSMS 管理工具連線並管理 SQL Server Express 容器。
在本文實作環境中,下載並安裝最新版本的 SSMS 18.3.1管理工具,不僅支援 Azure SQL DB和 Azure SQL DW之外,也同時支援管理最新的 SQL Server 2019運作環境。
請在 PowerShell 指令視窗中鍵入「docker run -d -p 1433:1433 --name sqlserver -e sa_password=Weithenn@168 -e ACCEPT_EULA=Y -v c:\sqlcontainerdb:c:\sqldb microsoft/mssql-server-windows-express」指令(如圖 6 所示),以便部署並運作 SQL Server Express 容器,下列為部署和運作容器的指令參數詳細說明:
- docker run :部署和運作新的容器。
- -d :將部署的容器運作在「背景」(Background)模式,並且顯示其容器 ID 。
- -p 1433:1433 :將部署容器的服務連接埠和容器主機的本機連接埠進行對應。
- --name sqlserver :組態設定所部署容器的名稱。
- -e sa_password=Weithenn@168 :組態設定部署的 SQL Server Express 容器時,預設 sa 帳號的管理者密碼。
- -e ACCEPT_EULA=Y :組態設定部署 SQL Server Express 容器時,直接同意終端使用者授權協議,以便 SQL Server Express 容器能夠順利啟動。
- -v c:\sqlcontainerdb:c:\sqldb :組態設定 SQL Server Express 容器中「C:\sqldb」儲存路徑,對應至容器主機的「C:\sqlcontainerdb」本機路徑。
- microsoft/mssql-server-windows-express :部署此容器所採用的容器映像檔名稱。
請注意,倘若「未」加上 -v參數組態設定 SQL Server Express 容器,與容器主機進行儲存路徑對應的話,那麼屆時儲存於 SQL Server Express 容器中的資料庫內容,將會因為刪除 SQL Server Express 容器而一起被刪除。
圖 6、部署和運作 SQL Server Express 容器
由於,本文實作環境中,容器主機採用最新 Windows Server 2019 作業系統版本,然而微軟官方最後釋出的 SQL Server Express 容器中,底層採用 Windows Server 2016 作業系統版本。因此,若採用預設的「Windows Server Container」機制部署 SQL Server Express 容器時,便會因為作業系統版本不一致,而導致出現上述「The container operating system does not match the host operating system.」的錯誤訊息(如圖 6 所示)。
有關部署 SQL Server Express 容器時,遭遇不相符版本錯誤的詳細資訊,請參考 Microsoft Docs – Windows Container version compatibility 文章內容。
此時,請先為 Windows Server 2019 容器主機安裝 Hyper-V 伺服器角色後,便可以在部署 SQL Server Express 容器時,加上「--isolation=hyperv」參數,採用「Hyper-V Container」機制來部署和運作 SQL Server Express 容器(如圖 7 所示)。
在 Windows 容器運作環境中支援兩種不同的類型,分別是與 Linux 容器環境類似的「Windows Server Container」,以及具備更高安全性和隔離性的「Hyper-V Container」,有關這兩者容器類型的詳細說明,請參考 【 網管人雜誌第 139 期 - 共用系統核心資源,玩轉 Windows Server 容器 】文章內容。
圖 7、採用 Hyper-V Container 機制部署 SQL Server Express 容器
順利部署和運作 SQL Server Express 容器後,首先我們在 PowerShell 指令視窗中鍵入「docker logs sqlserver」指令,查看 SQL Server Express 容器的日誌內容,確認 SQL Server Express 資料庫服務是否已經啟動完成,接著鍵入「docker exec sqlserver ipconfig」指令,查詢 SQL Server Express 容器採用的 IP 位址(如圖 8 所示),以便稍後採用 SSMS 管理工具進行連線管理的動作。
管理人員只要鍵入「docker exec sqlserver systeminfo」,即可確認 SQL Server Express 容器所採用的作業系統版本。
圖 8、查看 SQL Server Express 容器日誌內容和 IP 位址
請在開啟的 SSMS 管理工具「Server Name」欄位中,鍵入 SQL Server Express 容器的 IP 位址(本文實作環境為「172.24.135.172」),以及剛才部署和運作 SQL Server Express 容器時,指定的 sa 管理者密碼後,按下 Connect 鈕即可連線至由 SQL Server Express 容器運作的資料庫服務(如圖 9 所示)。
圖 9、透過 SSMS 管理工具連線管理 SQL Server Express 容器運作的資料庫服務
在 SSMS 管理工具介面中,我們可以在 New Query 視窗中執行「SELECT @@VERSION」指令,查看目前採用的 SQL Server Express 容器的版本資訊,可以看到採用的是 Microsoft SQL Server 2017 版本(如圖 10 所示)。
圖 10、查詢 SQL Server Express 容器的 SQL Server 版本資訊
接著,我們透過 SSMS 管理工具嘗試建立新的資料庫,請依序點選「Databases > New Database」,在 New Database 視窗中,於 Database name 欄位鍵入新增的資料庫名稱(本文實作環境為「db01」),並指定將新增的資料庫存放於跟容器主機所對應的「C:\sqldb」儲存路徑,待新增資料庫建立完畢後切換回容器主機的「C:\sqlcontainerdb」本機路徑,確認是否在 SQL Server Express 容器中,所新增建立的資料庫和記錄都直接對應存放至容器主機上(如圖 11 所示),以避免屆時刪除 SQL Server Express 容器時,一併將建立的資料庫和記錄一起刪除。
圖 11、新增資料庫並存放於容器主機所對應的儲存路徑
透過 Windows Admin Center 管理容器
在 Windows Admin Center 1903 版本時,推出「容器」(Containers)的預覽功能,並在 Windows Admin Center 1904 版本時,正式脫離預覽狀態並納入至擴充功能中。因此,管理人員只要在容器主機的 Windows Admin Center 管理介面中,依序點選「Settings > Extensions > Available extensions > Containers > Install」,即可為容器主機安裝 Windows Admin Center 的容器擴充功能。待容器擴充功能安裝完成後,管理人員便可以透過 Windows Admin Center ,查看和管理容器主機上所部署的容器,例如,查看容器主機上部署的容器概要資訊、運作的容器和日誌資訊、容器映像檔、容器網路、容器磁碟區……等(如圖 12 所示)。
圖 12、透過 Windows Admin Center 查看和管理容器
客製化 SQL Server Express 容器
在前面的實作中可以看到,目前在 Docker Hub 網站中, Microsoft 官方所打包的 Windows Based SQL Server Express 容器,採用的底層作業系統版本為 Windows Server 2016 ,並且後續沒有釋出採用最新 Windows Server 2019 作業系統版本的容器映像檔。因此,企業或組織倘若需要這樣的運作環境容器映像檔時,目前只能手動自行打包 SQL Server Express 容器映像檔,所幸在 GitHub 中 Microsoft 官方已經準備好 dockerfile 範本,管理人員只要下載 Dcokerfile 範本後,將內容中「FROM」來源由原本的「microsoft/windowsservercore」,修改為採用「mcr.microsoft.com/windows/servercore:ltsc2019」,也就是指定採用 Windows Server 2019 LTSC 作業系統版本,當成 SQL Server Express 容器底層作業系統版本。
準備好 Dockerfile 檔案以及官方提供的 start.ps1 檔案後,即可執行「docker build -t weithenn/sql-ws2019 .」指令(如圖 13 所示),建立採用 Windows Server 2019 Server Core 為底層作業系統的 SQL Server Express 容器。
有關自行打包客製化 SQL Server Express 容器的詳細資訊,以及 Dockerfile 範例檔案和 start.ps1 檔案內容,請參考 GitHub 網站 Microsoft 官方 mssql-docker 專案網頁。
圖 13、自行打包採用 Windows Server 2019 Server Core 為底層作業系統的 SQL Server Express 容器
順利打包客製化的 SQL Server Express 容器後,首先請執行「docker images」指令,查看容器主機上容器映像檔資訊,即可看到剛才所建立的「weithenn/sql-ws2019」容器映像檔,然後再次執行「docker run」指令並搭配剛才所建立的「weithenn/sql-ws2019」容器映像檔(如圖 14 所示),以便部署和運作客製化的 SQL Server Express 容器,接著執行「docker ps」指令確認部署的容器已正常運作。
圖 14、部署和運作客製化 SQL Server Express 容器
順利部署和運作客製化 SQL Server Express 容器後,同樣先在 PowerShell 指令視窗中鍵入「docker logs sqlserver2019」指令,查看 SQL Server Express 容器的日誌內容,確認 SQL Server Express 服務是否已經啟動完成,接著鍵入「docker exec sqlserver2019 systeminfo」指令,查詢 SQL Server Express 容器所採用作業系統版本(如圖 15 所示),是否為我們所客製化採用的 Windows Server 2019 Datacenter 作業系統版本。
圖 15、確認客製化 SQL Server Express 容器的底層作業系統版本資訊
部署 Linux Based 的 SQL Server 容器
過去談到 SQL Server 資料庫服務時,企業和組織的既定印象便是只能運作在 Windows Server 主機上,然而從 SQL Server 2017 版本開始,微軟便開始支援將 SQL Server 運作在 Linux 作業系統當中。因此,在部署和運作 SQL Server 容器時,除了選擇採用 Windows Based 的 SQL Server 容器之外,管理人員也可以選擇採用新一代的 Linux Based SQL Server 容器。值得注意的是,在預設情況下 Windows Server 2019 的容器功能,僅支援運作 Windows Based 容器,這是由於在容器技術中, Windows 和 Linux 作業系統在底層核心方面就有根本上的不同。因此,倘若管理人員嘗試直接下載 Linux Based 的 SQL Server 容器映像檔時,系統便會回應嘗試下載的容器映像檔為「Linux」,無法支援目前這個作業系統的訊息(如圖 16 所示)。
圖 16、預設情況下, Windows Server 2019 容器主機並不支援下載和部署 Linux 容器
當然, Windows 和 Linux 容器混合運作的環境, Microsoft 已經有考慮到,所以推出「LCOW(Linux Container on Windows)」機制(如圖 17 所示),只要啟用 LCOW 功能並搭配 Hyper-V Container 機制,即可為 Windows Server 2019 容器主機,開啟支援運作 Linux 容器的功能,達成在單台容器主機上,同時運作 Windows 和 Linux 容器的目的。
圖 17、LCOW(Linux Container on Windows) 運作架構示意圖
首先,在環境變數的部份,請組態設定「LCOW_SUPPORTED」參數值為「1」(如圖 18 所示),接著組態設定 Docker 系統服務的「daemon.json」組態設定檔,最後下載和解壓縮 最新版本的 LCOW(本文實作環境為 v4.14.35-v0.3.9 版本),以便部署的 Linux 容器能夠有完整的 Linux 核心檔案以便順利運作。
請注意,組態設定 Windows Server 2019 容器主機支援 LCOW 功能後,必須重新啟動主機才能夠套用生效。
圖 18、組態設定 Windows Server 2019 容器主機支援 LCOW 功能
在正式部署和運作 Linux Based 的 SQL Server 容器之前,我們先測試 Windows Server 2019 容器主機,是否能夠順利部署和運作 Linux 容器,請鍵入「docker run -it --platform=linux centos」指令,快速部署和運作底層為 CentOS 作業系統的 Linux 容器。如圖 19 所示,可以看到 Windows Server 2019 容器主機,順利部署和運作採用 CentOS 8.0 作業系統的 Linux 容器。
當 Windows Server 2019 容器主機啟用 LCOW 功能後,在部署和運作 Linux 容器時,請加上「--platform=linux」參數。
圖 19、部署和運作採用 CentOS 8.0 作業系統的 Linux 容器
現在,我們可以正式部署和運作 Linux Based 的 SQL Server 容器,在本文實作環境中,我們部署最新版本的 SQL Server 2019 on Ubuntu 容器,然而管理人員可能會發現, Linux Based 的 SQL Server 容器部署完成後,狀態卻直接顯示為「Exited」無法順利運作,查看 SQL Server 容器日誌內容,可以發現「sqlserver : This program requires a machine with at least 2000 megabytes of memory.」錯誤訊息(如圖 20 所示)。
圖 20、無法順利運作 Linux Based 的 SQL Server 容器
請在部署和運作 Linux Based 的 SQL Server 容器指令中,加上「--memory=2G」參數進行使用記憶體的限制(如圖 21 所示),即可順利運作 Linux Based 的 SQL Server 容器。當 SQL Server 容器順利啟動後,可以看到底層採用的作業系統為 Ubuntu 16.04.6 LTS 版本,搭配最新 Microsoft SQL Server 2019 CTP Developer Edition 。
預設情況下, SQL Server on Linux 容器將會採用 Developer 版本,管理人員可以搭配「-e MSSQL_PID」參數指定版本,例如, Express、Standard、Enterprise、EnterpriseCore……等。
圖 21、部署和運作 Linux Based 的 SQL Server 容器,並確認作業系統和 SQL Server 版本資訊