Docker for Windowsを入れるまでにやったこと

とりあえず、雑にやったこと残します

- Windowsの更新
- MicrosoftStoreからUbuntuのインストール
- WLS2へのアップグレード
- Docker for Windowsのインストール

## Windowsのバージョンチェック

[Win + R]で**ファイル名を指定して実行**、**winver**と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/53f1f297-5cbe-659e-4850-809a65287666.png)
この段階で、バージョンが**19018以下**だと**Docker for Windowsはインストールできません。**

## Windowsの更新

というわけでWindowsそのものをアップデートします。
[Windows 10 May 2020 Update](https://www.microsoft.com/en-us/software-download/windows10)

**[Update now]**ボタンから更新プログラムをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/3be3ccee-7db8-a156-de78-8a84b68baf2c.png)

**Windows10Upgrade9252.exe**ファイルがダウンロードされるので、クリックして起動します。

途中の経過をキャプチャ取り忘れましたが、スタートして30分くらいで完了し、再起動を求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/784dd03c-9a08-72d3-558a-40c5e934b15d.png)

再起動後にバージョンを確認すると、**19041**になりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/48e37cc1-bcdc-a530-56b2-421d089cfe74.png)

## WSLの有効化
- コントロールパネル > プログラムと機能 > Windowsの機能ダイアログを開く。
- Windowsの機能の有効化または無効化をクリックしてダイアログを開く
- Linux用Windowsサブシステムにチェックを入れる。

## MicrosoftStoreからUbuntuのインストール
もともとWindows使うの久しぶりでWSLもまともに使ってなかったので、wslを起動しようとしても以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/4a824b6e-5632-8755-6eb0-2131c8e825d6.png)

なので、MicrosoftStoreからLinux（Ubuntu）をインストールします。

MicrosoftStoreを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/f7b6394f-3568-9c04-8e75-cb7b8141c75f.png)

Ubuntu20.04.LTSを選びます。
ここは別に好きなLinuxにしてもらっても大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/517b14a1-90dc-37cd-2213-9a611cf1eb48.png)

インストールをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/1a5079d0-4865-1ac6-c6c3-5d13046157b2.png)

インストールが完了したら起動ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/9b6546ff-a8cb-6aa7-b8c7-856d4af0bc55.png)

起動するとターミナルが開くので、username、passwordを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/a67af567-8b21-b429-a9a9-9ed4d050b6db.png)

ここまででUbuntuの設定は終わりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/6d288361-79c8-bc34-36c2-85aef204c39d.png)


## WLS2へのアップグレード
### Windowsの機能確認と更新

PowerShellを**管理者**で起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/b29febbf-cf95-53e9-931a-7c7b96dc61ec.png)

以下のコマンドでWindowsの機能確認ができます

```
dism.exe /online /get-features
```

コマンド実行時に以下の2つが**有効**になっているかを確認します

```
機能名 : Microsoft-Windows-Subsystem-Linux
状態 : 有効

機能名 : VirtualMachinePlatform
状態 : 有効
```

なっていない場合は以下のコマンドで有効にしてください

- Microsoft-Windows-Subsystem-Linux

```
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```

- VirtualMachinePlatform

```
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

### Linuxカーネルの更新

インストール済みのLinuxディストリビューションを確認します。


```
wsl --list --verbose
```

```
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         1
```

今はVersion1になっているのでコマンドでVersion2に上げるのですが、このままやると
**WSL 2 を実行するには、カーネル コンポーネントの更新が必要です**
と言われてしまうので、Linuxのカネールを更新します。

以下のページにアクセスして、パッケージのダウンロードをします。
[WSL 2 Linux カーネルの更新](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/2c5b97cd-d550-b449-e176-637aac463959.png)

**wsl_update_x64**ファイルがダウンロードされるので、クリックして起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/779f2f14-4214-2a2f-dbb3-25414c1d980b.png)

[Next]を押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/f1cbb8e2-d520-1d97-36d0-074cbd9b4c37.png)

[Finishi]を押して完了です。

### LinuxディストリビューションをWSL2に設定

以下のコマンドでUbuntuをWSL2にアップデートします

```
wsl --set-version Ubuntu-20.04 2
```

ディストリビューションを確認します。

```
wsl --list --verbose
```

```
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2
```

変更されました。

### WSL2をデフォルトに設定

WSLからデフォルトバージョンをWSL2に変更します

```
wsl --set-default-version 2
```

## Docker for Windowsのインストール
もともとはコレがやりたかった。
随分遠回りしたけど、インストールやってきます。

[Docker Desktop for Windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows/)

**Docker Desktop Installer**ファイルがダウンロードされるので、クリックして起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/0203d987-2f1a-6b9a-5dd2-bc940344d7ba.png)

**[OK]**で先に進みます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/cb1c4b08-5c4a-3920-2fac-3324ccc80555.png)

インストールが進みます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/9bb488fc-6ee8-bd7a-eb45-f63db557ca30.png)

完了です、**[Close and log out]**でログアウトします
このとき再起動がかかります

再起動後にDocker for windowsの設定画面でましたが、正直使うのはDockerのコマンドだけなので飛ばしました。

一応起動中は以下の場所に常駐していて、Dashboardから画面は開けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33165/45f707d6-6e3c-85c9-6c50-a3b16256d847.png)

## まとめ
ともかく長かった。
WindowsのDockerがめんどくさいとは聞いていたが、ここまでとは・・・
ただ、WSL2になってDockerの実行環境がUbuntuになったのはましになったと思う。

というわけで、本当にやりたかったことはこれからやります。


## 2020/07/28 追記
思ったより見てくださった方が多くて驚いてます。
雑な内容なのにありがとうございます
使ってる間にちょっと気になったことを追記しておきます。

### WSL2の再起動
再起動するタイミング結構あります。
例えば、立ち上げた**Ubuntuの時間が結構ズレたりします。**
こちらは既にIssueに上がっているのでそのうち治るでしょう。

この時間のズレについてはいろんな直し方が探すとありますが、手っ取り早いのは再起動なので再起動コマンドがこちら。

```
wsl.exe --shutdown
```

**管理者権限のPowrshellで実行してください。**

### メモリを食いつぶす問題
タスクマネージャーを見るとわかりますが、**Vmmem**というタスクがメモリをガンガン食いつぶします。
この問題も[Issue](https://github.com/microsoft/WSL/issues/4166)が立ってます。

そのうち修正は入ると思いますが、Issueでは今の回避方法の提案がされています。

1. 再起動
2. WSLメモリの上限設定
3. コマンドでのメモリ解放

とりあえず1は割愛、確実性は高め
他の2つは**おまじない程度に試して見る程度**で使ってください。

#### 2. WSLメモリの上限設定
***Windowsのユーザーディレクトリ(C:\Users\<yourUserName>\)に***`.wslconfig`というファイルを作ります。
その中で以下のような設定を書いたあとに再起動します。

```toml
[wsl2]
memory=2GB
swap=16GB
localhostForwarding=true
```

```sh
hisayuki@DESKTOP:~/develop/annowork_devlop$ free -h
              total        used        free      shared  buff/cache   available
Mem:          1.9Gi       1.7Gi        63Mi       0.0Ki       169Mi        92Mi
Swap:          16Gi       326Mi        15Gi
```

Issue見てると結構効果がまばらなのですが、こちらもしっかり効果でてます。
今回は2Gで抑えられてるのと、タスクマネージャー側も2G以上には今の所なっていません。

#### 3. コマンドでのメモリ解放
以下のコマンドで不必要なキャッシュを消してメモリの開放をします。

```sh
echo "sync && echo 3 > /proc/sys/vm/drop_caches" | sudo sh
```

こちらも感覚なので確定要素はありません。
加えてUbuntu上でDocker for windows動かしたり、実際にContainer動かしてるとやっぱり増えてます。