WindowsコンテナにWSUSをインストールしてみる（失敗）

# やりたいこと
WSUS(Windows Server Update Service)は長期間運用しているとDBやコンテンツファイルがすぐ肥大化するため、割りと頻繁（年1～2回くらい）に再構築をしている。

Windows Server 2016からDockerコンテナが使えるようになったため、WSUSをこのコンテナ上に構築することができれば、再構築も楽チンになるのではないかと思い、コンテナ作成の練習も兼ねてやってみることにした。

結論から言うとうまくいかず途中で断念してしまったのだが、再挑戦するときのためにも手順を書き留めておく。

# コンテナ実行環境の準備
OSはWindows Server 2016 Datacenterの[評価版](https://www.microsoft.com/ja-jp/evalcenter/evaluate-windows-server-2016/)を使う。
適当に転がっていたPCにインストールしてWindows Updateをかけておく。

OSがインストールできたら、[MSのドキュメント](https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/quick-start/quick-start-windows-server)に従ってDocker実行環境をセットアップする。
Powershellを管理者権限で起動し、コマンドを3つ実行するだけなので簡単だ。

```Powershell
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider
Restart-Computer -Force
```

`docker version`を実行してバージョンが表示されればOK
![dcoker_version.PNG](https://qiita-image-store.s3.amazonaws.com/0/177762/2ef8a05a-e5fe-fc85-bcc4-cdfbd42766f6.png)

# コンテナの作成
WSUSを構築するためのコンテナを用意する。
Windows Serverで使えるコンテナベースイメージは「Windows Server Core」ベースと「Nano Server」ベースの2種類がある。
詳細は省くが、WSUSの場合は内部でIISを使うため前者でないとダメだと思う。

Windows Server Coreのベースイメージをダウンロードする。
10GBくらいあるので時間がかかる。

```Powershell
docker pull microsoft/windowsservercore
```

ダウンロードが済んだらこのベースイメージからWSUSを構築するコンテナを立ち上げる。

```Powershell
docker run --name wsus_test -v D:\WSUS:C:\WSUS -it microsoft/windowsservercore powershell
```

実行するとコンテナが立ち上がり、コンテナ内のPowershellに入れる。
なお、ここでは`-v D:\WSUS:C:\WSUS`を指定することでホストOSの`D:\WSUS`フォルダをコンテナ内の`C:\WSUS`にマッピングしている。こうすることでWSUSの配信ファイルをコンテナ内に直接保存せずに済むはずだ。
（`D:\WSUS`フォルダは事前に作成しておくこと）

`hostname`を実行するとホストOSとは異なるホスト名が表示され、コンテナ内に入っていることが確認できる。
コンソールの背景色がおかしくなるのはご愛嬌。
![hostname.PNG](https://qiita-image-store.s3.amazonaws.com/0/177762/f9e8dcf6-1b5e-302a-8afc-a18b30a9e4d5.png)

# WSUSの役割インストール
いよいよコンテナにWSUSをインストールしていく。
手順は[TechNetの記事](https://blogs.technet.microsoft.com/heyscriptingguy/2013/04/15/installing-wsus-on-windows-server-2012/)を参考に。
記事内ではSQLサーバを使う方法も説明されているが、今回は内蔵のWindows Internal Database(WID)を使う方法でやる。

コンテナにWSUSの役割をインストール

```Powershell
Install-WindowsFeature -Name UpdateServices -IncludeManagementTools
```
![install_wsus.PNG](https://qiita-image-store.s3.amazonaws.com/0/177762/90ddb274-7a61-6c79-496a-13afa0cd8d84.png)

Exit CodeがSuccessになっているので成功したようだ。
Restart NeededはNoとなっているのでこのまま先に進む。

WSUSは役割をインストールしただけでは動作せず、追加設定をしないといけない。以下のコマンドを実行する。
配信ファイルの保存先を`C:\WSUS`にしたいので、`CONTENT_DIR`引数を付けている。

```Powershell
cd 'C:\Program Files\Update Services\Tools\'
.\WsusUtil.exe postinstall CONTENT_DIR=C:\WSUS
```
![postinstall.PNG](https://qiita-image-store.s3.amazonaws.com/0/177762/1fd9e796-e9f4-f0bc-394e-942bd5bbf833.png)

と、ここで**エラーが出てしまった。**
```Fatal Error: The Server service is not started.```

サービスの起動に失敗したようだ。ログファイルを見てみる。

```
PS C:\> cat C:\Users\ContainerAdministrator\AppData\Local\Temp\tmpB6DC.tmp
2017-04-23 20:21:20  Postinstall started
2017-04-23 20:21:21  Detected role services: Api, WidDatabase, Services
2017-04-23 20:21:21  Start: LoadSettingsFromParameters
2017-04-23 20:21:21  Content local is: True
2017-04-23 20:21:21  Content directory is: C:\WSUS
2017-04-23 20:21:21  SQL instname is:
2017-04-23 20:21:21  End: LoadSettingsFromParameters
2017-04-23 20:21:21  Start: Run
2017-04-23 20:21:21  Fetching WsusAdministratorsSid from registry store
2017-04-23 20:21:21  Value is (null)
2017-04-23 20:21:21  Configuring content directory...
2017-04-23 20:21:21  Configuring groups...
2017-04-23 20:21:21  Starting group configuration for WSUS Administrators...
2017-04-23 20:21:21  Group does not already exist in the registry
2017-04-23 20:21:21  System.Runtime.InteropServices.COMException (0x80070842): The Server service is not started.

   at System.DirectoryServices.DirectoryEntry.RefreshCache()
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoMachineInit()
   at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
   at System.DirectoryServices.AccountManagement.PrincipalContext.ContextForType(Type t)
   at System.DirectoryServices.AccountManagement.Principal.set_Name(String value)
   at Microsoft.UpdateServices.Administration.ConfigureGroups.FetchOrCreateGroup(PrincipalContext context, String name,
String description)
   at Microsoft.UpdateServices.Administration.ConfigureGroups.SetupGroup(PrincipalContext context, String groupName, Str
ing description, String registryValue)
   at Microsoft.UpdateServices.Administration.ConfigureGroups.Run(Action`1 logWriter)
   at Microsoft.UpdateServices.Administration.PostInstall.Run()
   at Microsoft.UpdateServices.Administration.PostInstall.Execute(String[] arguments)
```

`System.DirectoryServices.DirectoryEntry.RefreshCache()`で例外が発生しているようだが、
エラーコードでググってみても解決方法がよくわからない。
比較のため（コンテナではない）通常のWindows Server Core 2016にも全く同じ手順でインストールしてみたが、そちらはうまくいったため、コンテナ環境に何か問題があることは間違いなさそうだが・・・

Windowsコンテナでは実行ユーザが`user manager\containeradministrator`となっており、通常のAdministratorではないようだ。
ここで権限周りの問題が発生しているのだろうか？
![whoami.PNG](https://qiita-image-store.s3.amazonaws.com/0/177762/9ed9fdbb-2789-6ad8-ff35-8fda88893302.png)

通常のAdministratorで実行する方法がないかいろいろと試したがうまくいかず、
**今回はここで諦めてしまった。**

# 感想
Windows Server 2016がリリースされて半年ほど経つが、Windowsコンテナに関してはまだまだ情報が少ない印象だ。
特に導入部を越えて、実際にコンテナをどう利活用していくかという部分ではまだまだ試行錯誤が必要だろう。
今回試したWSUSに限らず、ITインフラオペレーションの分野でコンテナ技術をどのように取り入れていくことができるのか、継続的にウォッチしていきたい。