یادداشت حقوقی: کاربر حق ترجمه و بازنشر این اثر را برای پروژه تأیید کرده است.PAGE-131
نصب SQL Server در Docker Container
Containerها واحدهای سبک و ایزولهای هستند که میتوان از آنها برای اجرای Applicationها استفاده کرد. برخلاف Virtual Machineها که Hardware را شبیهسازی میکنند، Containerها روی یک Operating System قرار میگیرند و Kernel را شبیهسازی میکنند. شبیهسازی Kernel با Containerها Containerization نام دارد. Containerها در سازمانهای کوچک و بزرگ محبوب شدهاند، زیرا Efficient و Portable هستند. همین Portability نیز فرایند Deployment را ساده میکند و Containerها را در محیطهای DevOps بسیار پرکاربرد میسازد.
Docker پلتفرم Application است که برای اجرای Containerها استفاده میشود. در ابتدا برای Linux توسعه داده شد، اما اکنون روی Windows نیز پشتیبانی میشود. در نتیجه SQL Server میتواند بدون توجه به Base Operating System موردنیاز از Containerها استفاده کند.
Docker Image یک File واحد است که Application کاملاً Packageشده را در خود دارد. در مورد SQL Server، یک Docker Image میتواند بر پایه Operating System مانند Windows Server 2019 Core همراه با Binaryهای SQL Server ساخته شود. Instance میتواند مطابق Best Practiceهای شما کاملاً پیکربندی شود تا هر بار Container جدیدی از Image ساخته میشود، آماده استفاده باشد.
هشدار: نکته مهم در Containerize کردن SQL Server این است که Containerها Stateless هستند. یکی از مزیتها این است که میتوانید Container را حذف کنید و خیلی سریع دوباره آن را ایجاد کنید و وضعیت اولیه Image را به دست آورید. اثر جانبی این رفتار آن است که اگر Data Fileها داخل Container باشند، با حذف Container آن Fileها نیز از بین میروند. بنابراین Data Fileهای User Database و MSDB باید خارج از Container ذخیره شوند. نویسنده معمولاً Data Fileهای Master را داخل Container نگه میدارد، زیرا این Database بسیاری از جزئیات Configuration مربوط به Instance را ذخیره میکند؛ هرچند در برخی سناریوها ممکن است Master نیز خارج از Container نگهداری شود.
اجرای Docker Image ارائهشده توسط Microsoft
Microsoft چند Docker Image برای SQL Server ارائه میکند. برای مثال در زمان نگارش، Image مربوط به SQL Server 2017 روی Ubuntu 16.4 و Image مربوط به Windows Server Core 2016 با SQL Server 2017 Developer Edition وجود داشت. در مثال بعدی Containerها را برای Windows Server 2016 Core آماده میکنیم و Container استاندارد SQL Server 2017 Developer Edition را Deploy میکنیم.
PAGE-132
اولین گام نصب Feature مربوط به Containers و Restart کردن Computer است. Script پاورشل Listing 4-14 این کار را انجام میدهد.
Listing 4-14 — نصب Containers Feature
Install-WindowsFeature -name Containers
Restart-Computer -Force
اکنون باید Docker Engine و Microsoft Docker Provider را نصب کنیم. Script در Listing 4-15 این کار را انجام میدهد.
Listing 4-15 — نصب Docker Engine
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider -Force
نکته: Script در Listing 4-15 اگر NuGet Provider از قبل نصب نباشد، نصب آن را پیشنهاد میکند. باید آن را بپذیرید، زیرا NuGet یک Package Manager است که برای نصب Packageهای دیگری مانند Docker لازم است.
آخرین گام در نصب Docker، Start کردن Docker Service است. با PowerShell فرمان Listing 4-16 این کار را انجام میدهد.
Listing 4-16 — Start کردن Docker Service
حالا میتوان Image را از Microsoft Container Registry یا MCR دریافت کرد. MCR مخزن Base Windows Containerهاست. Docker Hub مخزن پیشفرض Container Imageهاست، اما حتی وقتی Windows Imageها در Docker Hub فهرست میشوند، Binary واقعی آنها در MCR ذخیره میشود. فرمان Listing 4-17 Image را Pull میکند.
Listing 4-17 — Pull کردن Docker Image
Docker image pull microsoft/mssql-server-windows-developer
PAGE-133
در نهایت Container باید Start شود. فرمان Listing 4-18 این کار را انجام میدهد. Switch برابر -d مشخص میکند Container Detached اجرا شود؛ یعنی بهجای Interactive Mode بهصورت Background Process اجرا شود. -p Port مربوط به Container را روی Host Publish میکند و -e Environment Variableها را تعیین میکند. در این مثال Password حساب sa تعیین و SQL Server License Terms پذیرفته میشود.
Listing 4-18 — اجرای Container
docker run -d -p 1433:1433 -e sa_password=Pa££w0rd -e ACCEPT_EULA=Y
microsoft/mssql-server-windows-developer
ساخت Docker Image ساده برای SQL Server
اگرچه Image ارائهشده توسط Microsoft برای برخی اهداف مناسب است، در بیشتر سناریوها باید Docker Image اختصاصی خود را با Configuration موردنیازتان بسازید. در این بخش از Dockerfile برای ساخت Imageی استفاده میکنیم که SQL Server 2019 و SQL Server Command-line Toolها را روی Windows Server Core نصب کند.
نکته: در این بخش Host از Windows Server 2019 استفاده میکند و Feature مربوط به Containers، Docker Module و Microsoft Docker Provider قبلاً روی آن نصب شدهاند. مراحل آمادهسازی در بخش قبلی توضیح داده شد.
Dockerfile یک Deployment Script است که مشخص میکند Container Image چگونه ساخته شود. File از مجموعهای Instruction تشکیل شده است. Instructionهایی که برای ساخت SQL Server Containerهای مبتنی بر Windows مهمتر هستند در جدول 4-3 آمدهاند.
PAGE-134
اولین گام برای ساخت Container Image اختصاصی، Pull کردن Windows Server 2019 Core Image از MCR است؛ این Base Image ساخت ما خواهد بود. فرمان PowerShell در Listing 4-19 این کار را انجام میدهد.
Listing 4-19 — Pull کردن Base Image
docker pull mcr.microsoft.com/windows/servercore:ltsc2019
در مرحله بعد روی Host یک Folder Structure ساده ایجاد میکنیم. ابتدا Folder برابر C:\DockerBuild برای Build Scriptها ساخته میشود. سپس Folder دیگری با نام C:\DockerBuild\SQL2019 در زیر آن ایجاد میشود که باید SQL Server 2019 Installation Media را در خود داشته باشد.
اکنون دو Script میسازیم و هر دو را در C:\DockerBuild قرار میدهیم. نخستین File همان Dockerfile است. نام File باید دقیقاً Dockerfile و بدون Extension باشد.
نکته: هنگام Save کردن Dockerfile مطمئن شوید Text/Code Editor بهصورت خودکار Extension پیشفرضی به File اضافه نکرده باشد؛ در غیر این صورت Build مربوط به Image Fail میشود.
جدول 4-3 — Instructionهای Dockerfile| Instruction | شرح |
|---|
| FROM | Container Image پایه که Image جدید روی آن ساخته میشود. |
| RUN | فرمانی را مشخص میکند که باید اجرا شود. |
| COPY | Fileها را از Host به Container Image کپی میکند. |
| ADD | مشابه COPY است، با این تفاوت که امکان Copy از Remote Source را نیز میدهد. |
| WORKDIR | Working Directory مورد استفاده سایر Docker Instructionها را تعیین میکند. |
| CMD | Default Commandی را تعیین میکند که هنگام Deploy شدن Instance از Container Image اجرا میشود. |
| VOLUME | یک Mount Point ایجاد میکند. |
Listing 4-20 محتوای Dockerfile مورد استفاده را نشان میدهد.
PAGE-135
Listing 4-20 — Dockerfile
#Use the Server Core base image
FROM mcr.microsoft.com/windows/servercore:ltsc2019
#Make temp folders for the SQL Server and SQL Command Line Utilities media
RUN powershell -Command (mkdir C:\SQL2019)
#Copy the SQL Server media into the container
COPY \SQL2019 C:/SQL2019
#Install SQL Server
RUN C:/SQL2019/SETUP.exe /Q /ACTION=INSTALL /FEATURES=SQLENGINE
/INSTANCENAME=MSSQLSERVER /SECURITYMODE=SQL /SAPWD="Passw0rd" /SQLSVCACCOUNT="NT AUTHORITY\System" /AGTSVCACCOUNT="NT AUTHORITY\System" /SQLSYSADMINACCOUNTS="BUILTINAdministrators" /IACCEPTSQLSERVERLICENSETERMS=1 /TCPENABLED=1 /UPDATEENABLED=False
#Install Chocolatey and SQL Server Command Line Utilities
RUN @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe"
-NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex
((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/
install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
RUN choco install sqlserver-cmdlineutils -y
#Set SQL Server to start automaticaly
RUN powershell -Command (Set-Service MSSQLSERVER -StartupType Automatic)
#Remove the installation media
RUN powershell -Command (Remove-Item -Path C:/SQL2019 -Recurse -Force)
#Create a mountpoint for data files
VOLUME C:/DataFiles
PAGE-136
#Copy start.ps1 to container
COPY \start.ps1 /
WORKDIR /
CMD powershell -Command (.\start.ps1)
با مرور File، حتی بدون تجربه Docker، روند کار قابل تشخیص است. Statement اول نشان میدهد Build بر پایه Windows Server 2019 Core Build ارائهشده توسط Microsoft است. سپس Instructionهای RUN و COPY برای Copy کردن SQL Server Media به Container استفاده میشوند.
بعد مستقیماً SQL Server نصب میشود. نصب SQL Server با PowerShell در فصل 3 توضیح داده شد و Code در اینجا تفاوتی با نصب روی Server سنتی دارای Windows Server Core ندارد. تنها نکته این است که چون Command روی چند Line نوشته شده، در انتهای هر Line از \ استفاده شده تا Docker بداند همه آنها یک Instruction واحد هستند.
بخش بعدی Script، Chocolatey را نصب میکند. Chocolatey یک Package Manager برای Windows است که Gallery بزرگی از Applicationهای ازپیش Packageشده دارد. اینجا مفید است چون SQL Server Command Line Utilities از طریق Gallery آن بهسادگی نصب میشود.
نکته: Chocolatey را میتوان برای Package کردن SQL Server Buildهای اختصاصی نیز به کار برد. نویسنده اشاره میکند که این روش با سبک عملیاتی DevOps/Configuration Management بهخوبی سازگار است.
سپس با Instruction برابر RUN فرمانهای PowerShell اجرا میشوند تا Installation Fileها پاک شوند و Database Engine Service Start شود. Instruction برابر VOLUME یک Mount Point برای DataFiles میسازد. هنگام اجرای Instance از Container میتوان این Mount Point را به Folderی روی Host Map کرد تا Data Persist شود.
در پایان File به نام Start.ps1 به Container Copy و اجرا میشود. محتوای آن در Listing 4-21 آمده است. Script یک Infinite Loop اجرا میکند؛ اگر این کار انجام نشود، Container بلافاصله بعد از ارسال آخرین Instruction متوقف میشود.
PAGE-137
Listing 4-21 — Start.ps1
$lastCheck = (Get-Date).AddSeconds(-2)
while ($true)
{
$lastCheck = Get-Date
Start-Sleep -Seconds 2
}
پس از Save کردن هر دو File در Folder برابر C:\DockerBuild روی Host، با فرمان Listing 4-22 Image ساخته میشود. Switch برابر -t برای Tag کردن Build استفاده میشود و نویسنده از Notation برابر major.minor برای Version Build استفاده کرده است.
نکته: قبل از اجرای Command در Folder برابر C:\DockerBuild باشید.
Listing 4-22 — Build کردن Image
docker build -t sql2019:1.0 .
پس از پایان Build، با فرمان Listing 4-23 یک Instance از Container ساخته میشود.
Listing 4-23 — اجرای Docker Container
docker run -p 1433:1433 --name sql-2019 -d --volume c:\Datafiles:c:datafiles sql2019:1.0
در این Command، -p Port را روی Host Machine Expose میکند، -d Container را بهصورت Background Process اجرا میکند و --name برای شناسایی Container است. مهمتر از همه --volume Mount Point داخل Container را به Folderی روی Host Map میکند. Format این مقدار source:target است.
چون IP Address مشخصی برای Container تعیین نشده، با Listing 4-24 میتوان IP تخصیصیافته را بررسی کرد. این فرمان از docker inspect برای استخراج Node مشخصی از Configuration مبتنی بر JSON و نام Container موردنظر استفاده میکند.
PAGE-138
Listing 4-24 — دریافت IP Address مربوط به Container
docker inspect --format "{{ .NetworkSettings.Networks.nat.IPAddress }}" sql-2019
اکنون میتوان با SSMS یا SQL Client دیگر و با استفاده از IP Address، از بیرون Container به Instance متصل شد.
Listing 4-25 یک Database را روی Mounted Volume ایجاد میکند.
Listing 4-25 — ساخت Database
CREATE DATABASE PersistedData
ON PRIMARY
( NAME = N'PersistedData', FILENAME = N'C:\Datafiles\PersistedData.mdf' ,
SIZE = 8192KB , FILEGROWTH = 65536KB )
LOG ON
( NAME = N'PersistedData_log', FILENAME = N'C:\Datafiles\PersistedData.ldf' ,
SIZE = 8192KB , FILEGROWTH = 65536KB )
GO
اگر Container را Destroy کنیم، Data همچنان Persist میشود. Listing 4-26 ابتدا Container را Stop و سپس Remove میکند.
Listing 4-26 — حذف Container
docker stop sql-2019
docker rm sql-2019
اگر Container را دوباره با Listing 4-23 بسازید و IP جدید را با Listing 4-24 بگیرید، پس از Connection خواهید دید Database برابر PersistedData روی Instance وجود ندارد، زیرا Database هنگام Build Attach نشده است. اما چون Fileها روی Host باقی ماندهاند، کافی است با Listing 4-27 Database را دوباره Attach کنید.
Listing 4-27 — Attach مجدد Database
CREATE DATABASE PersistedData ON
( FILENAME = N'C:\datafiles\PersistedData.mdf' ),
( FILENAME = N'C:\datafiles\PersistedData.ldf' )
FOR ATTACH
GO
PAGE-139
ساخت Docker Image قابل پیکربندی برای SQL Server
Build ساده قبلی قابل دنبالکردن بود اما انعطاف کمی داشت: همهچیز Hard-coded بود و راهی برای Attach کردن Databaseها در Build Process وجود نداشت. در مثال بعدی Build را تغییر میدهیم تا Parameterized شود و در سناریوهای واقعی کاربرد بیشتری داشته باشد.
با همان Process و Folder Structure قبلی، ابتدا Dockerfile جدیدی ساخته میشود. Listing 4-28 محتوای File را نشان میدهد. File مشابه قبل است اما چند تغییر دارد. نخست Code نصب SQL Server Command Line Utilities حذف شده، زیرا بهجای آن از sqlserver PowerShell Provider استفاده خواهد شد.
Password Hard-coded مربوط به sa در مرحله Installation نیز به TempPassw0rd تغییر کرده است، زیرا هنگام اجرای Container Password واقعی بهعنوان Parameter ارسال خواهد شد.
مهمتر از همه، Call مربوط به Start.ps1 گسترش یافته و Parameter میگیرد. در این Build تمام منطق اصلی در Start.ps1 قرار دارد و Environment Variableها به Parameterهای Script ارسال میشوند.
Listing 4-28 — Dockerfile
#Use the Server Core base image
FROM mcr.microsoft.com/windows/servercore:ltsc2019
#Make temp folders for the SQL Server and SQL Command Line Utilities media
RUN powershell -Command (mkdir C:\SQL2019)
#Copy the SQL Server media into the container
COPY \SQL2019 C:/SQL2019
#Install SQL Server
RUN C:/SQL2019/SETUP.exe /Q /ACTION=INSTALL /FEATURES=SQLENGINE
/INSTANCENAME=MSSQLSERVER /SECURITYMODE=SQL /SAPWD="TempPassw0rd" /SQLSVCACCOUNT="NT AUTHORITY\System" /AGTSVCACCOUNT="NT AUTHORITY\System" /SQLSYSADMINACCOUNTS="BUILTINAdministrators" /IACCEPTSQLSERVERLICENSETERMS=1 /TCPENABLED=1 /UPDATEENABLED=False
PAGE-140
#Set SQL Server to start automaticaly
RUN powershell -Command (Set-Service MSSQLSERVER -StartupType Automatic)
#Remove the installation media
RUN powershell -Command (Remove-Item -Path C:/SQL2019 -Recurse -Force)
#Create a mountpoint for data files
VOLUME C:/DataFiles
#Switch shell to PowerShell
#SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';
$ProgressPreference = 'SilentlyContinue';"]
#Copy start.ps1 to container
COPY \start.ps1 /
WORKDIR /
CMD powershell -Command (.\start.ps1 -saPassword $env:saPassword -databases
$env:databases -agentStartupType $env:agentStartupType)
گام بعد ساخت File جدید Start.ps1 است. این نسخه که در Listing 4-29 آمده پیچیدهتر است. Script سه Parameter میگیرد: Password حساب sa، Arrayی از Databaseهایی که باید روی Instance وجود داشته باشند و Startup Type موردنیاز SQL Server Agent Service.
اولین Command، Module پاورشل sqlserver را از PowerShell Gallery نصب میکند تا Cmdlet برابر Invoke-SqlCmd قابل استفاده باشد. سپس Script با Temporary Password حساب sa به SQL Instance متصل میشود و Password را به مقدار ارسالشده تغییر میدهد.
بخش بعدی Script پیچیدهترین قسمت است. برای هر Database Name در Array بررسی میشود که Database روی Instance وجود دارد یا خیر. اگر وجود نداشته باشد، ابتدا تلاش میشود Database از Mounted Volume Attach شود. اگر Database File وجود نداشته باشد، Script بررسی میکند آیا Backup File در Mounted Volume هست تا Database Restore شود. اگر هیچکدام ممکن نباشد، Database جدید ساخته میشود.
PAGE-141
نکته: این نسخه Script شدیداً به Naming Convention مربوط به Database و Backup Fileها وابسته است و فرض میکند فقط Fileهای .mdf و .ldf وجود دارند. میتوان Script را برای پشتیبانی از .ndf یا Naming Convention و Application Requirementهای دیگر تغییر داد.
فرمان بعدی Script، SQL Server Agent Service را به Startup Type ارسالشده تغییر میدهد. در پایان Script وارد همان Infinite Loop مثال قبلی میشود تا Container بعد از آخرین Instruction متوقف نشود.
Listing 4-29 — Start.ps1
param(
[Parameter(Mandatory=$true)]
[string]$saPassword,
[Parameter(Mandatory=$false)]
[string]$databases,
[Parameter(Mandatory=$false)]
[String]$agentStartupType
)
#Install SQL Server PowerShell Provider
If(-not(Get-InstalledModule SQLServer -ErrorAction silentlycontinue)){
Install-Module SQLServer -Confirm:$False -Force
}
#Update sa Password
$params = @{
ServerInstance = "localhost"
Username = "sa"
Password = "TempPassw0rd"
Query = "ALTER LOGIN [sa] WITH PASSWORD='{0}'; ALTER LOGIN sa ENABLE ;"
-f $saPassword
}
PAGE-142
Invoke-Sqlcmd @params
#Shred the database array
$databasesClean = $databases -split ","
#Create each database
ForEach ($database in $databasesClean) {
$params = @{
ServerInstance = "localhost"
Username = "sa"
Password = $saPassword
Variable = "dbName='{0}'" -f $database
Query = "SELECT COUNT(*) AS dbExists FROM sys.databases WHERE name = `$(dbName)"
}
$dbExists = Invoke-Sqlcmd @params
if ($dbexists.dbExists -eq 0) {
$mdf = "C:\DataFiles\{0}.mdf" -f $database
if (Test-Path $mdf) {
$params = @{
ServerInstance = "localhost"
Username = "sa"
Password = $saPassword
Variable = "dbName='{0}'" -f $database
Query = "DECLARE @SQL NVARCHAR(MAX) = 'CREATE DATABASE [' + `$(dbName) + '] ON ( FILENAME = N\"C:\datafiles\' + `$(dbName) + '.mdf\" ),( FILENAME = N\"C:\datafiles\' + `$(dbName) + '.ldf\" ) FOR ATTACH'; EXEC(@SQL)"
}
Invoke-Sqlcmd @params
} else {
$bak = "C:\DataFiles\{0}.bak" -f $database
if (Test-Path $bak) {
$params = @{
PAGE-143
ServerInstance = "localhost"
Username = "sa"
Password = $saPassword
Variable = "dbName='{0}'" -f $database
Query = "DECLARE @SQL NVARCHAR(MAX) = 'RESTORE DATABASE [' + `$(dbName) + '] FROM DISK = N\"C:\Datafiles\' + `$(dbName) + '.bak\";'; EXEC(@SQL)"
}
Invoke-Sqlcmd @params
} else {
$params = @{
ServerInstance = "localhost"
Username = "sa"
Password = $saPassword
Variable = "dbName='{0}'" -f $database
Query = "DECLARE @SQL NVARCHAR(MAX) = 'CREATE DATABASE [' + `$(dbName) + ']' EXEC(@SQL)"
}
Invoke-Sqlcmd @params
}
}
}
}
#Set Agent service startup type
Set-Service SQLSERVERAGENT -StartupType $agentStartupType
#Start infinite loop
$lastCheck = (Get-Date).AddSeconds(-2)
while ($true)
{
$lastCheck = Get-Date
Start-Sleep -Seconds 2
}
PAGE-144
نکته: Environment Variableها از Array پشتیبانی نمیکنند. بنابراین فهرست Databaseها باید بهصورت Comma-separated String ارسال شود و سپس در PowerShell با Split به Array تبدیل شود.
اکنون با Command در Listing 4-30 میتوان Image را Build کرد. توجه کنید Major Version Number افزایش یافته است.
Listing 4-30 — Build کردن Docker Image
docker build -t sql-2019:2.0 .
در نهایت Container مطابق Listing 4-31 اجرا میشود. Switchهای -e Environment Variableها را در Container ایجاد میکنند.
Listing 4-31 — اجرای Container
docker run -p 1433:1433 --name sql-2019 -e "saPassword=PermPassw0rd" -e
"databases=test,persisteddata" -e "agentStartupType=Automatic" -d --volume
c:\Datafiles:c:\datafiles sql-2019:2.0
نکته: امکانهای Automation با Containerها آنقدر گستردهاند که خود موضوع یک کتاب کامل هستند. میتوان Command اجرای Container را داخل PowerShell Script قرار داد و نام Container را بهعنوان Parameter گرفت؛ Script میتواند Folder یکتایی بر اساس نام Container روی Host بسازد و Mounted Volume را به آن Map کند. همچنین بهتر است بهجای Environment Variable، Password حساب sa از مسیر File رمزنگاریشده خوانده شود، زیرا Environment Variable برای Production امن نیست. افزودن gMSA به Container نیز امکان تعامل SQL Server با AD را فراهم میکند، هرچند Domain Join برای Containerها پشتیبانی نمیشود.
PAGE-145
پشتیبانی Kubernetes
Kubernetes یک Container Orchestrator است. Containerها را روی Clusterی از Serverها اجرا میکند و برای Containerها High Availability فراهم میسازد. در Versionهای جدید Kubernetes میتوان Windows Server 2019 Serverها را در کنار Linux Serverها به Cluster افزود.
SQL Server 2019 نیز Technology جدیدی با نام Big Data Clusters معرفی کرده است. این Technology از Kubernetes برای Deploy کردن Cluster مقیاسپذیری از SQL Server، Spark و HDFS Containerها استفاده میکند. Big Data Clusters خارج از دامنه این کتاب است.
علاوه بر این، از SQL Server 2019 به بعد AlwaysOn Availability Groups میتواند در Containerهایی که با Kubernetes Orchestrate شدهاند برای HA و DR Databaseهای Containerized استفاده شود. این کار بر مفهوم SQL Server Kubernetes Operator متکی است؛ Application-specific Softwareی که Kubernetes API را توسعه میدهد و Package، Deploy و Manage کردن AlwaysOn Containerها را در Cluster آسان میکند. ساخت Availability Group داخل Kubernetes Cluster خارج از دامنه کتاب است؛ منبع اصلی نمونهای را برای Azure Managed Kubernetes معرفی میکند.
جمعبندی
SQL Server اکنون فقط روی Windows نصب نمیشود؛ Linux و Containerها نیز پشتیبانی میشوند. این موضوع انعطاف بیشتری به Database Architect میدهد تا SQL Server را روی پلتفرمی قرار دهد که برای نیاز Application مناسبتر است.
SQL Server روی Ubuntu، Red Hat و SUSE Linux قابل نصب است. هنگام برنامهریزی Deployment باید هم Distribution و هم Version پشتیبانیشده انتخاب شوند.
SQL Server روی Windows Container و Linux Container قابل نصب است. Microsoft چند Docker Image پایه ارائه میکند، اما در بیشتر سناریوها Docker Image سفارشی موردنیاز است. علاوه بر Stand-alone Docker Container، SQL Server 2019 با Big Data Clusters و SQL Server Kubernetes Operator از Kubernetes نیز پشتیبانی میکند و AlwaysOn Availability Groups میتوانند در Kubernetes Cluster مستقر شوند.