2016/04/04

SQL Server in Windows Server Container (using dockerfile)

先月ポストされた以下の記事を見ると、Windows Server Container で SQL Server を動かせるらしい。提供されている Dockerfile を見ると、WindowsServerCore イメージから作成した Windows Server Container に .NET Framework 3.5 Features (SQL Server の前提) をインストールしたものを Docker Hub の microsoft/dotnet35 イメージから取得して、それに SQL Server 2014 SP1 Express をインストールしているよう。


SQL Server Database Engine Blog|SQL Server in Windows Containers
[URL] https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/03/21/sql-server-in-windows-containers/


なお、SQL Server のセットアップは Windows Installer ベースなんで、.NET Framework 3.5 Features と msiexec に対応していない Nano Server ベースの Hyper-V Container では SQL Server の展開は NG のはず。

とりあえず、まずは経験。実際にやってみました。やってみて初めてわかることは多し。



まず、https://github.com/brogersyh/Dockerfiles-for-windows/tree/master/sqlexpress から dockerfile、Set-SQLExpressStaticTcpPort.ps1、start.ps1、mode-dirs-and-stop-service.ps1 をダウンロードして、コンテナー ホストの C:\sqlexpress に配置。

Windows PowerShell を開いて、C:\sqlexpress に移動し、docker build コマンドを実行。


PS C:\sqlexpress> docker build -t sqlexpress .


Step 8 で失敗。


日本語環境では、よくあるあるトラブルの予感。こんなときは、コンテナー ホストに英語(en-us) 言語パックをインストールして、システム ロケールを en-us に変更、再起動してから、再実行。


思ったとおり、進んだぞ...

... Step 16 で完了!



sqlexpress イメージの作成はこれで完了。このイメージから Windows Server コンテナーを作成し、実行してみる。SQL Server インスタンス名は SQL、SQL Server 認証が有効、sa アカウントのパスワードは thepassword2# 。これらの情報は Dockerfile の内容: RUN /install/setup/setup.exe ... のオプション指定で確認できます。

PS C:\> docker run -it --name "mysqlexp01" -p 1433:1433 sqlexpress cmd
C:\Install> powershell
PS C:\Install>.\start.ps1
PS C:\Install> Get-Service *SQL*







成功。コンテナー ホストや別の PC に SQL Server Management Studio を入れてリモート接続して確認。接続できない場合は、コンテナー ホストのファイアウォールを確認して。

例 (コンテナー ホストで実行):
PS C:\> New-NetFirewallRule -Name "TCP1433" -DisplayName "SQL TCP 1433" -Protocol TCP -LocalPort @(1433,1433) -Action Allow 

通常、SQL Server Express は既定でリモート管理接続が無効になっているのですが、許可される構成がされているみたい。もし接続できない場合は、コンテナー内で次のコマンドラインを実行してみて。
 PS C:\> sqlcmd -S .\SQLEXPRESS -U sa -P thepassword2# -Q "sp_configure 'remote admin connections', 1"
PS C:\> sqlcmd -S .\SQLEXPRESS -U sa -P thepassword2# -Q "RECONFIGURE WITH OVERRIDE"
PS C:\> Stop-Service MSSQL`$SQL
PS C:\> Start-Service MSSQL`$SQL


・・・

Dockerfile を使用した方法は、いろいろ自動的に行ってくれますけど、Docker を触ったことが無い人やかじっただけの人(私)にとっては??? な感じだと思います。

Dockerfile に書いてあることや以下のドキュメントを参考に、すべてマニュアルで一つ一つ実行していけば、SQL Server を動かすまでできるはず (Docker じゃなくて、New-Container とかの PowerShell でも OK) 。っていうか、人が作った Dockerfile を使うよりも確実だし、こんなに苦労 (日本語環境特有の対応) することもないっす。

参考:
.NET 3.5 Server Core コンテナー イメージの作成 
[URL] https://msdn.microsoft.com/ja-jp/virtualization/windowscontainers/examples/dotnet35
.NET Framework 3.5 Features は、DVD:\Sources\SxS (英語版メディアでも日本語版メディアでも同じ) を指定してインストール
 
コマンド プロンプトからの SQL Server 2014 のインストール
[URL] https://msdn.microsoft.com/ja-jp/library/ms144259(v=sql.120).aspx
(dockerfile https://github.com/brogersyh/Dockerfiles-for-windows/blob/master/sqlexpress/dockerfile の setup.exe のオプションも参考に)

TCP 1433 リモート接続の許可 (dockerfile https://github.com/brogersyh/Dockerfiles-for-windows/blob/master/sqlexpress/dockerfile より)
PS> Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp\ipall" -Name TcpDynamicPorts -Value ""PS> Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp\ipall" -Name TcpPort -Value 1433
 

PowerShell からの SQL Server 名前付きインスタンスのサービスの開始は、$ をエスケープしてね

Start-Service MSSQL`$SQL 
(サービス名が MSSQL$SQL の場合)

------------------------------------------------------------------------------
Docker ではなく PowerShell の管理環境でマニュアルでなんとかする汎用的な例
 (解説省略しますが、この方法なら en-us 言語パックのインストールやシステム ロケールの変更は不要です。実は、docker build -t sqlexpress . をやってみる前にこっちをやってみました。成功するはずでっす)

Provisionig Install Source for .NET Framework 3.5 Features and SQL Server 2014 SP1 Express.

Copy <DVD>:\Sources\SxS\Microsoft-windows-netfx3-ondemand-package.cab to C:\Share\ws2016tp4enSxS
Download SQL 2014 SP1 Express (English) Installer from https://www.microsoft.com/en-US/download/details.aspx?id=46697
Copy SQLEXPR_x64_ENU.exe (download from ) C:\Share\sql2014exen and Extract it by C:\Share\sql2014exen\SQLEXPR_x64_ENU.exe /q /X:C:\Share\sql2014exen\Setup



Create .NET Framework 3.5 Features insalled image (WindowsServerCoreNET35).


PS C:\> New-Container -Name "MyWinSvCont01" -ContainerImageName WindowsServerCore -SwitchName "Virtual Switch"
PS C:\> Add-ContainerSharedFolder -ContainerName "MyWinSvCont01" -SourcePath C:\Share -DestinationPath C:\Packages
PS C:\> Start-Container -Name "MyWinSvCont01"

PS C:\> Enter-PSSession -ContainerName "MyWinSvCont01" -RunAsAdministrator
[MyWinSvCont01]: PS C:\Windows\System32> Add-WindowsFeature -Name NET-Framework-Core -Source C:\Packages\ws2016tp4enSxS
[MyWinSvCont01]: PS C:\Windows\System32> Exit

PS C:\> Stop-Container -Name "MyWinSvCont01"
PS C:\> New-ContainerImage -ContainerName "MyWinSvCont01" -Name "WindowsServerCoreNET35" -Publisher demo -Version 1.0
PS C:\> Remove-Container -Name "MyWinSvCont01"


Install SQL 2014 SP1 Express to Windows Server Container

PS C:\> New-Container -Name "MySQLExp01" -ContainerImageName WindowsServerCoreNET35 -SwitchName "Virtual Switch"
PS C:\> Add-ContainerSharedFolder -ContainerName "MySQLExp01" -SourcePath C:\Share -DestinationPath C:\Packages
PS C:\> Start-Container -Name "MySQLExp01"
PS C:\> Enter-PSSession -ContainerName "MySQLExp01" -RunAsAdministrator
[MySQLExp01] PS C:\Windows\System32> cd C:\Packages\sql2014exen\Setup
[MySQLExp01] PS C:\Packages\sql2014exen\Setup2> .\setup.exe /q /ACTION=Install /INSTANCENAME=SQLEXPRESS /FEATURES=SQLEngine /UPDATEENABLED=1 /SECURITYMODE=SQL /SAPWD="P@ssw0rd" /SQLSVCACCOUNT="NT AUTHORITY\System" /AGTSVCACCOUNT="NT AUTHORITY\Network Service" /SQLSYSADMINACCOUNTS="BUILTIN\ADMINISTRATORS" /INSTALLSQLDATADIR=C:\SQLEXPRESS\DATA /SQLUSERDBLOGDIR=C:\SQLEXPRESS\DATA /SQLBACKUPDIR=C:\SQLEXPRESS\BACKUP /TCPENABLED=1 /NPENABLED=0 /IACCEPTSQLSERVERLICENSETERMS
[MySQLExp01] PS C:\Packages\sql2014exen\Setup2> Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp\ipall" -Name TcpDynamicPorts -Value ""
[MySQLExp01] PS C:\Packages\sql2014exen\Setup2> Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp\ipall" -Name TcpPort -Value 1433
[MySQLExp01] PS C:\Packages\sql2014exen\Setup2> Start-Service MSSQL$SQLEXPRESS
[MySQLExp01] PS C:\Packages\sql2014exen\Setup2> Exit
PS C:\> stop-container -Name "MySQLExp01"
PS C:\> start-container -Name "MySQLExp01"
PS C:\> Enter-PSSession -ContainerName "MySQLExp01" -RunAsAdministrator
[MySQLExp01] PS C:\Windows\System32> sqlcmd -S .\SQLEXPRESS -U sa -P P@ssword -q "sp_configure 'remote admin connections', 1"
[MySQLExp01] PS C:\Windows\System32> sqlcmd -S .\SQLEXPRESS -U sa -P P@ssword -q "RECONFIGURE WITH OVERRIDE"
[MySQLExp01] PS C:\Windows\System32> stop-service MSSQL`$SQLEXPRESS
[MySQLExp01] PS C:\Windows\System32> start-service MSSQL`$SQLEXPRESS
 

Add NetNATStaticMapping and Filewall Rule on Container Host

PS C:\> Add-NetNatStaticMapping -NatName "ContainerNAT" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 127.16.0.2 -ExternalPort 1433 -InternalPort 1433
PS C:\> New-NetFirewallRule -Name "TCP1433" -DisplayName "SQL TCP 1433" -Protocol TCP -LocalPort @(1433,1433) -Action Allow
------------------------------------------------------------------------------

Have fun !

追記)
こちらもどうぞ。dockerfile を使用せず、マニュアルでインストールしたレポート...

@IT 実録:Windows ServerコンテナでSQL Serverを動かしてみた
[URL] http://www.atmarkit.co.jp/ait/articles/1604/14/news022_2.html

0 件のコメント: