WSL2でdocker-composeを使えるようにするまで

## はじめに

WSLでdocker-composeを使いたかったのだが、以下のエラーが。

```bash
$ docker-compose up -d
Creating network "service_default" with the default driver
ERROR: Failed to Setup IP tables: Unable to enable NAT rule:  (iptables failed: iptables --wait -t nat -I POSTROUTING -s 172.18.0.0/16 ! -o br-b2b7dd2f10a1 -j MASQUERADE: iptables: Invalid argument. Run `dmesg' for more information.
 (exit status 1))
```

WSLのネットワーク周りの対応が完全でないことが原因の様子。
WSL 2であれば解決しそうということで以下の作業を実施。

## 環境

- Windows10 Home
- メモリ: 16GB
- Build Version: 18917以前

## 作業手順

1. Windows 10 Insider Preview の登録

2. Windows 10 Preview Build のインストール

3. WSL 2のインストール

4. WSL 1でUbuntuのインストール

5. WSL 1 -> WSL 2への切り替え

6. dockerのインストール

7. docker-composeのインストール

### 1. Windows 10 Insider Preview の登録

- 以下から登録、Microsoftアカウントが必要
    - https://insider.windows.com/ja-jp/getting-started/#register

### 2. Windows10 Preview Build のインストール

#### Windows Insider Program の設定

- `設定` > `更新とセキュリティ` > `Windows Insider Program`  

- `Windows Insider Program` の画面上で、以下の設定を行う
    - どのようなコンテンツの受け取りを希望されるか => Windows のアクティブな開発
    - 新しいビルドを取得する頻度 => ファースト

#### Windows Update

- `設定` > `更新とセキュリティ` > `Windows Update` 
    - 再起動が必要

- Build Versionが18917以降になっていればOK
    - 「Windows Insider Program の設定」を行っていないと、Versionが上げられないことに注意

- 確認方法
    - コマンドプロンプトのコンソール上部から確認
    - コマンドプロンプトから`winver`で確認

### 3. WSL 2のインストール

- Power Shellを管理者権限で起動、以下のコマンドを実行
    - 実行後、再起動が必要

```
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
```

- 再起動後に再度同じコマンドを実行すると以下のような表示になる

```powershell
PS C:\WINDOWS\system32> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform


Path          :
Online        : True
RestartNeeded : False
```

- Build 18917以降でないと実行できない

```powershell
PS C:\WINDOWS\system32> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
Enable-WindowsOptionalFeature : 機能名 VirtualMachinePlatform は不明です。
発生場所 行:1 文字:1
+ Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlat ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Enable-WindowsOptionalFeature], COMException
    + FullyQualifiedErrorId : Microsoft.Dism.Commands.EnableWindowsOptionalFeatureCommand
```

### 4. WSL 1でUbuntuのインストール

- Microsoft Store からアプリをインストール
    - インストール済みであればここはスキップ

### 5. WSL 1 -> WSL 2への切り替え

- 現在のVersionを確認

```powershell
PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-16.04    Stopped         1
```

- `wsl --set-version` で切り替え

```powershell
PS C:\WINDOWS\system32> wsl --set-version Ubuntu-16.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。
```

### 6. dockerのインストール

- 以下を参考にインストール
    - https://docs.docker.com/install/linux/docker-ce/ubuntu/

```bash
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get install docker-ce
```

- 起動

```bash
$ service docker status
 * Docker is not running
$ sudo service docker start
 * Starting Docker: docker                                                                                       [ OK ]
$ service docker status
 * Docker is running
```

- pullできるか確認

```bash
$ docker pull alpine:latest
latest: Pulling from library/alpine
9d48c3bd43c5: Pull complete                                                                                             Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
$ docker images
REPOSITORY                                                       TAG                 IMAGE ID            CREATED             SIZE
alpine                                                           latest              961769676411        4 days ago          5.58MB
```

### 7. docker-composeのインストール

- 以下を参考にインストール
    - https://docs.docker.com/compose/install/

```bash
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
$ docker-compose --version
docker-compose version 1.24.1, build 4667896b
```

## 注意点

### dockerについて

WSL 1の状態でdockerをインストールしていたのだが、WSL 2に切り替えたところpullできなくなった。

```bash
$ docker pull alpine:latest
Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 172.24.240.1:53: read udp 172.24.249.251:42777->172.24.240.1:53: i/o timeout
```

アンインストールして「6. dockerのインストール」の手順でインストールし直したところ、エラーは出なくなった。


## 参考

- WSLで「普通」にDockerが動くようになっていた話(しかしdocker-composeは動かない)
    - https://gdgd-shinoyu.hatenablog.com/entry/2018/07/10/032023

- WSL 2 のインストール手順
    - https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-install