Windows Server で Docker EE を動かすまでの流れ

# 概要

Windows Server ではクライアントOSである Windows 10 などのように [Docker CE](https://docs.docker.com/docker-for-windows/install/) のインストーラーからインストールして利用することができません。インストール自体は問題なくできますが docker の起動時にエラーが発生して正しく動作しません。

Windows Server で docker を動かすためには `Docker EE` を利用する必要がありますが、いくつか手順が必要なため本記事にまとめておきます。

# 前提条件

**Windows Server, version 1709** 以降または **Windows Server 2019** が必要です。

# 手順

## (1) Hyper-V のインストール

PowerShell コマンドから Hyper-V をインストールします。
インストールに成功すると `Success` が `True` となります。

```
> PowerShell Install-WindowsFeature hyper-v

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    Yes            SuccessRest... {Hyper-V}
警告: インストール処理を完了するには、このサーバーを再起動する必要があります。
```

## (2) コンテナーのインストール

Windows のコンテナー機能をインストールします。
Hyper-V と同じようにインストールに成功すると `Success` が `True` となります。

```
> PowerShell Install-WindowsFeature containers

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    Yes            SuccessRest... {コンテナー}
警告: インストール処理を完了するには、このサーバーを再起動する必要があります。
```

## (3) マシンの再起動

インストール処理を完了させるため PowerShell コマンドからマシンを再起動します。

```
> PowerShell Restart-Computer -Force
```

## (4) プロバイダーのインストール

Docker EE をインストールするためのプロバイダーをインストールします。
インストールの確認が表示されたら `y` キーを入力します。

```
> PowerShell Install-Module -Name DockerMsftProvider -Repository PSGallery -Force

続行するには NuGet プロバイダーが必要です
PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet
プロバイダーが必要です。NuGet プロバイダーは 'C:\Program Files\PackageManagement\ProviderAssemblies' または
'C:\Users\Administrator\AppData\Local\PackageManagement\ProviderAssemblies'
に配置する必要があります。'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet
プロバイダーをインストールすることもできます。今すぐ PowerShellGet で NuGet
プロバイダーをインストールしてインポートしますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
```

## (5) Docker EE のインストール

Docker EE をインストールします。
インストールの確認が表示されたら `y` キーを入力します。

```
> PowerShell Install-Package -Name Docker -ProviderName DockerMsftProvider -Force

パッケージは、信頼済みとマークされていないパッケージ ソースから取得されています。
'DockerDefault' からソフトウェアをアンインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y

Name                           Version          Source           Summary
----                           -------          ------           -------
Docker                         18.09.0          DockerDefault    Contains Docker EE for use with Windows Server.
```

## (6) LinuxKit のインストール

Docker EE のインストールは完了していますが docker で Linux コンテナを動かしたい場合は LinuxKit のインストールも行う必要があります。

[LinuxKit](https://github.com/linuxkit/lcow/releases) から `release.zip` をダウンロードし、以下のフォルダを作成して中身を展開します。

```
C:\Program Files\Linux Containers
```

## (7) Docker Compose のインストール

Docker CE には Docker Compose が付属していましたが、Docker EE には付属していないので手動でインストールします。

[Docker Compose](https://github.com/docker/compose/releases) から `docker-compose-Windows-x86_64.exe` をダウンロードし、ファイル名を `docker-compose.exe` へ変更してから以下のように配置します。

```
C:\Program Files\Docker\docker-compose.exe
```

## (8) マシンの再起動

PowerShell コマンドからマシンを再起動します。

```
> PowerShell Restart-Computer -Force
```

## (9) Experimental 機能の有効化

Linux コンテナのサポートは現時点では Experimental 扱いなので、デーモン設定ファイルから Experimental 機能の有効化を行います。

以下のファイルを新規作成します。

```
C:\ProgramData\docker\config\daemon.json
```

ファイルの内容は以下のように記載して上書き保存します。

```
{
  "experimental": true
}
```

## (10) マシンの再起動

デーモン設定ファイルを読み込ませるため PowerShell コマンドからマシンを再起動します。

```
> PowerShell Restart-Computer -Force
```

以上で Docker EE が利用可能となります。

# 動作確認

## (1) Docker EE のバージョンの表示

`docker version` コマンドを実行してバージョンが表示されることを確認します。
Server 側の `Experimental` が `true` となっていることも確認します。

```
> docker version
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.3
 Git commit:        33a45cd0a2
 Built:             unknown-buildtime
 OS/Arch:           windows/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.24)
  Go version:       go1.10.3
  Git commit:       33a45cd0a2
  Built:            11/07/2018 00:24:12
  OS/Arch:          windows/amd64
  Experimental:     true
```

## (2) Docker Compose のバージョンの表示

`docker-compose version` コマンドを実行してバージョンが表示されることを確認します。

```
> docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.0.2o  27 Mar 2018
```

## (3) Linux コンテナの動作確認

Docker EE で Linux コンテナが動作することを確認します。

まずは Alpine Linux のイメージを pull します。

```
> docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
cd784148e348: Pull complete
Digest: sha256:46e71df1e5191ab8b8034c5189e325258ec44ea739bba1e5645cff83c9048ff1
Status: Downloaded newer image for alpine:latest
```

イメージの一覧を確認します。

```
> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine              latest              3f53bb00af94        2 weeks ago         6.82MB
```

コンテナを生成して Alpine Linux に入れることを確認します。

```
> docker run --rm -it alpine /bin/ash
/ #
```

# Docker EE のバージョンアップ

はじめにプロバイダーを更新します。

```
> PowerShell Update-Module DockerMsftProvider
```

Docker EE を任意のバージョンへバージョンアップします。
以下のコマンドでは `19.03` へバージョンアップします。

```
> PowerShell Install-Package -Name docker -ProviderName DockerMsftProvider -RequiredVersion 19.03 -Update -Force
```

https://docs.docker.com/ee/docker-ee/windows/docker-ee/