Docker Desktop から WSL2へ鞍替え

# Docker Desktop から WSL2へ鞍替え

## 背景

有志で活動している自分専用の検証環境の構築。
Linux環境がなく、手軽にDockerの環境を手に入れられるということで、DockerDesktopの環境を構築しました。

ある日、少し欲が出てしまい、Ansible TowerのComunity版のAWXも構築してみたくなりました。
AWXの構築はAnsible化されており、Ansibleの実行環境が必要になります。
このWindows＋Docker Decktopの組み合わせの環境にAnsibleが動作する環境を構築するのが困難でした。
最初は、DockerDesktop上にAnsibleが動作するコンテナを用意しそこで実行をとも考えましたが、AWXのインストール先(AnsibleでいうところのInventory)をDockerDesktopが稼働しているホスト側にしたいときの設定が不明であったりと、かなりの手間と複雑さを感じました。
さらに、このDockerDesktopが使えるようになったとしても、やはり現場(お仕事)で使うことがあるか？と考えたとき、このままDockerDesktopで突き進むよりはWSL2(Windows Subsystem Linux 2)でLinuxを用意し、そこでDockerやAnsibleを動作させたほうが、後々役に立つと考えなおすことになりました。

でも、DockerDesktopの構築とコンテナの起動を試せたことはよい経験になりました。

## 目的

DockerDesktopの環境を廃止し、新たにWSL2の環境を構築する。

## 参考

[Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)
[WSL2によるホストのメモリ枯渇を防ぐための暫定対処](https://qiita.com/yoichiwo7/items/e3e13b6fe2f32c4c6120)

## 手順

1.管理者モードでPowerShellを起動する

2.以下のコマンドを実行し、WSL2を有効にする

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

展開イメージのサービスと管理ツール
バージョン: 10.0.17763.1

イメージのバージョン: 10.0.17763.615

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
```

3.続けて続けて以下のコマンドを実行する

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

展開イメージのサービスと管理ツール
バージョン: 10.0.17763.1

イメージのバージョン: 10.0.17763.615

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
```

4.以下のコマンドを実行し、PCを再起動(強制)

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

5.Linux カーネル更新プログラム パッケージを適用

[x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)

6.WSL2 を既定のバージョンとして設定する

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

ここでいったん手順を中断、少し余談を挟みます．．．

## 苦戦したポイント

上記の「WSL2を既定のバージョンとして設定する」コマンドを実行した際、「wsl」というコマンドは存在しないとエラーになりました。
インストール手順は間違っていないのになぜ？とかなり苦しみましたが、原因はWSL2の前提条件にありました。
WSL2はWindows10のバージョンが「1903」以上である必要があるようです。
使用している環境を確認すると、「1809」となっており、どうやらWSL2として稼働していなかったようです。

別の記事に書きましたが、苦戦しつつWindowsUpdateを実行し、何とか「20H2」にバージョンアップすることができ、無事に上記のコマンドを正常に実行することができるようになりました。

[[暫定]WindowsUpdateのエラー解消](https://qiita.com/class2glass/items/3425780c82f894d0ca99)


## 手順のつづき

無事に「WSL2を既定のバージョンとして設定する」コマンドを実行できましたので構築を続けます。

7.Linuxディストリビューションをインストール

本来はMicrosoft StoreでUbuntuを選択し、入手をクリックすればよいのですが、クリックしても動きがなかったため、以下のサイトから直接媒体をダウンロードしました。

[Ubuntu 20.04 LTS](https://aka.ms/wslubuntu2004)

ダウンロードした以下のファイルをダブルクリックしてUbuntuをインストールします。

Ubuntu_2004.2020.424.0_x64.appx

```
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:   #ここにubuntuで使用するアカウント名を入力、次回起動時はこのアカウントで起動することになる
New password:              #パスワードを入力
Retype new password:       #パスワードを再入力
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 20.04 LTS (GNU/Linux 4.4.0-17763-Microsoft x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Wed Jun 23 16:57:54 DST 2021

  System load:            0.52
  Usage of /home:         unknown
  Memory usage:           43%
  Swap usage:             0%
  Processes:              7
  Users logged in:        0
  IPv4 address for eth2:  192.168.216.225
  IPv4 address for wifi0: 192.168.3.7
  IPv6 address for wifi0: 2400:2411:a540:2100:45e9:b746:1764:882b
  IPv6 address for wifi0: 2400:2411:a540:2100:e573:fab8:b1c8:6ccd

0 updates can be installed immediately.
0 of these updates are security updates.


The list of available updates is more than a week old.
To check for new updates run: sudo apt update


This message is shown once once a day. To disable it please create the
/home/xxxxx/.hushlogin file.
xxxxx@xxxxx:~$
```

以上で、Windows10にWSL2としてUbuntuを起動することができました。


## 終了方法と起動方法

普通のUbuntuのように「exit」で終了します。
起動するときはPower Shell上から「wsl」と実行しても起動しますし、スタートメニューに登録されたUbuntuをクリックしても起動します。

## バージョンの確認

PowerShellで以下のコマンドを実行すると、バージョンを確認することができます。

```
> wsl --list --verbose
  NAME            STATE           VERSION
  Ubuntu-20.04    Installing      2
```

## WSL2の強制終了と起動状態の確認

PowerShellで以下のコマンドを実行することで、常駐しているWSL2を強制終了させることができます。

### 起動状態の確認

```
> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2
```

### 強制終了

```
> wsl --shutdown
```

### 終了したかの確認

```
> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2
```


## ホストとのフォルダ共有の設定

WSL2で起動しているUbuntuからWindows10のディスクは/mntにマウントされていました。

```
$ ls -l /mnt/c
```

Cドライブにファイル共有用のフォルダを作ればUbuntuからもちゃんと参照でき、書き込みも可能です。
今回は「C:\WSL-Share」というフォルダを作成し、共有フォルダとして使用することにしました。
あらかじめWindows上で上記フォルダを作成し、Ubuntuにはシンボリックリンクを用意しておくとアクセスしやすくなります。

```
$ ln -s /mnt/c/WSL-Share/ ~/wsl-share
```

## 割り当てメモリの変更

環境ができてうれしくなって使っていたのですが、どうも動きがもっさりしています。
特にホストのWindows環境の動作が非常に遅いです。
タスクマネージャでパフォーマンスを確認すると、メモリ使用量が80%を超えていました。
どうやら、WSL2は意図的に指定しない場合、ホストの搭載メモリの80%をわりあてるようで、htopコマンドで確認したところ、Ubuntuには6GBが割り当てられていました。
(ホストのWindowsは8GBのメモリが搭載されている状態でした)

調べたところ、「.wslconfig」というファイルにメモリ割り当て量を指定することで、ホストのメモリ枯渇を抑制することができるようです。

「C:\Users\ユーザ名」に「.wslconfig」というファイルを作成し、以下のような設定を施し、WSL2を再起動することで、メモリ割り当てが変更され、ホストのメモリ枯渇も解消されました。

```
[wsl2]
memory=2GB
swap=0
```

## おわりに

途中の苦戦した個所はありましたが、そこさえなければ割と簡単にWSL2＋Ubuntuの環境を構築することができました。
もともとUbuntuの環境がある場合はこのような環境は不要かと思いますが、未だ普及率の高いWindows環境においても検証用のUtunbu環境を構築することができました。

今後はこの環境を使用し、様々な検証を進めていきたいと思います。