Container 容器 StateLess StateFul Live Migration SQL Server 虛擬主機

Windows Server 2019實戰 混合運作Windows/Linux容器

依需求客製化映像 SQL Server容器輕鬆部署

2019-12-02
本文說明採用SQL Server容器將如何縮短建構研發與測試環境,並且示範在Windows Server 2019作業系統中同時執行混合Windows和Linux容器的運作環境。最後,也會講解當官方容器映像檔不符合需求時,企業要怎樣自行打包客製化的容器映像檔。

 

隨著容器風潮及微服務架構的興起,企業和組織對於容器調度平台的需求也不斷上升。事實上,容器管理技術之所以受到大家熱烈歡迎的重要原因之一,在於能夠有效解決過去困擾開發人員與維運人員的難題,也就是如何快速建立完整的開發和測試環境,甚至是正式營運環境。

舉例來說,未採用容器技術時,當開發人員需要特定的研發和測試環境,維運人員便要依照需求建立VM虛擬主機、安裝客體作業系統、組態設定網路環境、開通防火牆規則等等,將作業系統層級處理完畢,再交給開發人員安裝應用程式和載入函式庫等等應用程式層級的部分,此時才算準備好開發環境,並可能花費幾天的作業時間,而容器技術的出現,正好能夠快速解決這個困擾已久的問題。

然而,企業組織的管理人員應該已經發現.雖然容器技術能夠有效縮短運作環境建立的難題,但是在後續維運管理上卻帶來更多的挑戰和難題。舉例而言,在企業既有虛擬化基礎架構中的VM虛擬主機,當底層實體伺服器需要進行硬體維運作業時,可以透過Live Migration即時遷移機制,線上不中斷地將VM虛擬主機遷移至別台實體伺服器上繼續運作。

但是,在容器運作環境中,針對容器的部分並沒有所謂即時遷移工作負載的概念,因為容器的基本運作概念就是螞蟻雄兵式分散整個大型工作負載,與一般維運人員習慣的高可用性機制並不相同。

此外,容器原生最適合的運作環境為「無狀態」(Stateless),但是企業組織過去在VM虛擬主機上運作的工作負載通常多為「有狀態」(Stateful),這在維運管理的習慣上也必須要進行調整。

因此,目前大家所公認的解決方案,便是在既有的虛擬化基礎架構中,將容器分批運作在不同的VM虛擬主機,如此一來,便能將VM虛擬主機和容器這兩者的長處互相結合,如圖1所示。

圖1  VM虛擬主機和容器協同運作架構示意圖。(圖片來源:Top Questions: Containers and VMs Together - Docker Blog)

本文將採用最新Windows Server 2019作業系統為實戰環境,並搭配啟用「容器」(Containers)的伺服器功能,然後實作演練部署和運作SQL Server容器,以及當官方釋出的SQL Server容器映像檔不符合需求時,應該如何自行打包出客製化的SQL Server容器映像檔。

打造WS 2019容器環境

在本文實作環境中,將為採用Windows Server 2019作業系統的主機,安裝「Windows套件管理工具」(Windows PackageManagement),如圖2所示,以便管理人員後續可以透過PowerShell Cmdlet指令輕鬆地為Windows Server 2019主機進行安裝、移除、查詢等等軟體套件的管理作業。

圖2  Windows PackageManagement運作架構示意圖。(圖片來源:GitHub - OneGet/oneget: PackageManagement (aka OneGet) is a package manager for Windows)

在透過管理者執行權限開啟的PowerShell視窗中,執行安裝Docker Microsoft套件管理提供者指令後,系統會自動至PowerShell Gallery下載所需的軟體套件,並啟用Windows Server 2019主機的「容器」伺服器功能,為主機安裝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」,這將是屆時容器主機在部署和運作容器時,用於介接容器虛擬網路時使用。

圖4  確認Docker容器運作環境資訊和版本。

確認主機Docker Engine系統服務順利啟動,並且網路功能運作正常後,管理人員便可以使用「docker info」和「docker version」指令,確認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容器映像檔」(https://hub.docker.com/r/microsoft/mssql-server-windows-express),屆時這個Windows類型的SQL Server Express容器,可以部署和運作在Windows Server 2016或後續版本,以及Windows 10 Professional/Enterprise等容器主機環境中。

圖5  下載Microsoft官方打包建立的Windows SQL Server Express容器映像檔。

在下載SQL Server Express容器映像檔期間,在Windows Server 2019容器主機上,下載並安裝最新版本的SSMS(SQL Server Management Studio)管理工具(https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms),以便稍後能夠透過SSMS管理工具連線並管理SQL Server Express容器。

如圖6所示,在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」指令,以便部署並運作SQL Server 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:部署此容器所採用的容器映像檔名稱。

由於本文實作環境中,容器主機採用最新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所示。

此時,先為Windows Server 2019容器主機安裝Hyper-V伺服器角色,便可以在部署SQL Server Express容器時,加上「--isolation=hyperv」參數,採用「Hyper-V Container」機制來部署和運作SQL Server Express容器,如圖7所示。

圖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管理工具進行連線管理的動作。

圖8  查看SQL Server Express容器日誌內容和IP位址。

如圖9所示,在開啟的SSMS管理工具「Server Name」欄位中,鍵入SQL Server Express容器的IP位址(本文實作環境為「172.24.135.172」),以及剛才部署和運作SQL Server Express容器時所指定的「sa」管理者密碼,再按下〔Connect〕按鈕,即可連線至由SQL Server Express容器運作的資料庫服務。

圖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版本時期,推出了容器的預覽功能,並在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範本(https://github.com/microsoft/mssql-docker/blob/master/windows/mssql-server-windows-express/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容器。

圖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)運作架構示意圖。 (圖片來源:Microsoft Docs - Linux Containers on Windows)

首先,在環境變數的部分,組態設定「LCOW_SUPPORTED」參數值為「1」,如圖18所示,接著設定Docker系統服務的「daemon.json」組態設定檔,最後下載和解壓縮最新版本的LCOW(https://github.com/linuxkit/lcow/releases)(本文實作環境為v4.14.35-v0.3.9版本),以便部署的Linux容器能夠有完整的Linux核心檔案來順利運作。

圖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容器。

圖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所示。接下來,在部署和運作Linux Based的SQL Server容器指令中,加上「--memory=2G」參數進行使用記憶體的限制,如圖21所示,即可順利運作Linux Based的SQL Server容器。

圖20  無法順利運作Linux Based的SQL Server容器。
圖21  部署和運作Linux Based的SQL Server容器,並確認作業系統和SQL Server版本資訊。

當SQL Server容器順利啟動後,將會發現底層採用的作業系統為Ubuntu 16.04.6 LTS版本,搭配最新Microsoft SQL Server 2019 CTP Developer Edition。

結語

透過本文的實戰演練,相信大家已經了解採用SQL Server容器,確實能夠有效縮短建構研發和測試環境,並且在Windows Server 2019作業系統中還能夠同時執行混合Windows和Linux容器的運作環境。當官方容器映像檔不符合企業本身的需求時,也能夠依照需求自行打包客製化的容器映像檔。

<本文作者:王偉任,Microsoft MVP及VMware vExpert。早期主要研究Linux/FreeBSD各項整合應用,目前則專注於Microsoft及VMware虛擬化技術及混合雲運作架構,部落格weithenn.org。>

 


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!