先日、マイクロソフトのSQL Server Database Engine Blog(英語)に「SQL Server in Windows Containers」という記事がポストされました。この記事では、Dockerコマンドを使う方法で、「SQL Server 2014 Express」のインスタンスを実行するWindowsコンテナを簡単に構築する手順が説明されていました。
この記事では、コミュニティーで作成された「Dockerfile」を使用して作業しています。Dockerfileなら、入力するコマンドも少なく、誰でも簡単に実行できるので、操作ミスを排除できます。しかし、Dockerについて詳しくない人にとっては、何をしているのか理解するのが難しいかもしれません。
WindowsコンテナはWindows PowerShellによるネイティブな管理方法と、Dockerコマンドによる管理方法に対応しています。どちらで管理する場合でも、Dockerfileで行っていることと同じ操作をコンテナに対して手動で操作すれば、SQL Serverの導入は可能なはずです。
なお、筆者がこのDockerfileで実際に環境を構築したレポートを個人ブログに掲載しています。日本語環境が影響して、誰でも簡単にできるというわけにはいきませんでした。
そこで今回は、Windows PowerShellによる操作で、Windows ServerコンテナにSQL Server 2014 Expressをインストールしてみました。作業の流れの概略は、以下の図1のようになります。
最初に、Windows Serverコンテナのベースイメージとして利用可能な、Windows Server 2016のServer Coreインストールベースのコンテナイメージ「WindowsServerCore」からWindows Serverコンテナを作成し、そこにSQL Server 2014の前提コンポーネントである「.NET Framework 3.5の機能」をインストールして、その時点までをカスタムイメージとして保存します。
Dockerfileの方法では、Docker Hubから「microsoft/dotnet35」(「.NET Framework 3.5の機能」がインストールされたWindows Serverコンテナのイメージ)を入手して使用していますが、そのイメージを自分で作成すると考えてください。
続いて、「.NET Framework 3.5の機能」がインストール済みのカスタムイメージからWindows Serverコンテナを作成し、そこにSQL Server 2014 Service Pack 1(SP1)Expressをインストールし、構成します。
「.NET Framework 3.5の機能」を含むイメージの作成は、「WindowsServerCore」イメージをベースにWindows Serverコンテナを新規作成し、そのコンテナにWindows Server 2016 TP4のメディアの「\Sources\SxS」のパッケージを指定して、「.NET Framework 3.5の機能」をインストールします。
今回は、コンテナホスト上のフォルダをコンテナと共有して、コンテナホスト上のフォルダ「C:\Share」内にWindows Server 2016 TP4のメディアの「\Sources\SxS」およびSQL Server 2014 SP1 Expressのインストールソースを準備して使用しました(画面1)。
コンテナ内で「wget(Invoke-WebRequest)」コマンドレットを実行し、インストールソースをダウンロードしてインストールすることもできますが、Containersが標準で提供する共有フォルダを使用すると、ダウンロードファイルによってコンテナのディスク使用量が増えてしまう(コンテナのファイルサイズが大きくなる)ことを避けることができます。
作業用コンテナの作成、共有フォルダの準備、作業用コンテナの開始、「.NET Framework 3.5の機能」のインストール、コンテナの停止、コンテナのイメージ化、作業用コンテナの削除までの一連の操作は、コンテナホストのWindows PowerShellで次のコマンドラインを実行することで完了します(画面2、画面3)。
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-ContainerImage -Name "MyWinSvCont01" PS C:\> Get-ContainerImage
今回は、「.NET Framework 3.5の機能」をインストールした時点で、新しいコンテナイメージ「WindowsServerCoreNET35」として保存していますが、作業用コンテナのままSQL Server 2014 SP1 Expressのインストールに進むことも可能です。新しいコンテナイメージとして保存しておけば、以後、SQL Server 2014 SP1 Express以外の用途でも「.NET Framework 3.5の機能」のインストールを省略できるというメリットがあります。
次に、新しいコンテナイメージ「WindowsServerCoreNET35」をベースに新しいコンテナを作成し、SQL Server 2014 SP1 Expressをインストールします。大本のベースイメージが英語版であるため、英語版のSQL Server 2014 SP1 Expressをインストールします。
コンテナホストのWebブラウザを使用して、以下のWebサイトから「SQL Server 2016 SP1 Express英語版」(SQLEXPR_x64_ENU.exe)をダウンロードします。
「SQLEXPR_x64_ENU.exe」のダウンロードが完了したら、コマンドプロンプトを開いて、ダウンロード先のパスから次のコマンドラインを実行し、「C:\Shares」フォルダの下の場所にファイルを展開します(画面4)。
SQLEXPR_x64_ENU.exe /q /X:C:\Share\sql2014exen\Setup
コンテナイメージ「WindowsServerCoreNET35」をベースに新しいコンテナ「MySQLExp01」を作成し、共有フォルダを設定して、コンテナを開始します。コンテナに接続したら、SQL Server 2014 SP1 Expressのサイレントインストールを実行します(画面5)。
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:\sql2014exen\Setup [MySQLExp01]: PS C:\Windows\System32> .\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
SQL Server 2014 SP1 Expressのサイレントインストールが完了したら、TCPポート「1433」を設定して「MSSQL$SQLEXPRESS」サービスを開始します(画面6)。なお、Windows PowerShell内で「$」は特別な意味を持つため、「`$」のようにエスケープする必要があることに注意してください。
[MySQLExp01]: PS C:\Windows\System32> Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp\ipall" -Name TcpDynamicPorts -Value "" [MySQLExp01]: PS C:\Windows\System32> Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp\ipall" -Name TcpPort -Value 1433 [MySQLExp01]: PS C:\Windows\System32> Start-Service MSSQL`$SQLEXPRESS
Copyright © ITmedia, Inc. All Rights Reserved.