Docker (WSL2) と Vagrant (VirtualBox) を Windows で併用する環境作成方法

Windows 10 上で Vagrant と Docker を併用したかったのですが、どうも相性が悪く毎回断念してました。  が、ようやく。。。ようやくできた。。。 

コマンドだけで構築できるようにしていますので、ミスなく簡単に構築できると思います。

> （追記）
> VirtualBox 6.1.16 以降で WSL 2 と安定した併用が可能となったようです。
> http://kzlog.picoaccel.com/virtualbox-coexist-with-wsl2-hyper-v/

> 2021-09-25 追記
> VirtualBox Extension Pack の個別アップデート方法の補足を追記しています。

## 前提

* **Windows 10 バージョン 2004** 以降
* Home / Pro どちらでも可能なはず（検証は Pro でしました）
* **BIOS で Intel VT-x / AMD-V の仮想化ハードウェア拡張を有効**にしてある
* 新規で WSL 2 を導入するケース
* **VirtualBox 6.1.16** 以上
* パッケージマネージャの Chocolatey や Scoop を使えるようにしておくと、より導入が楽（必須でない）
* 再起動が必要になる処理がありますので、作業中はお勧めしません。


## 1. WSL2 + Ubuntu 2004 インストール

### 初回の再起動まで

Windows の機能を有効にします。
**管理者権限で PowerShell を起動**して、以下のコマンドを入力してください。  

```powershell:PowerShell（管理者権限）
# Linux 用 Windows サブシステム
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# Windows ハイパーバイザープラットフォーム
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# 仮想マシン プラットフォーム
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

**ここでコンピュータの再起動。**

### 2回目の再起動まで

WSL2 を使用できるようにし、Ubuntu をインストールします。
（通常の権限で）PowerShell を起動して、以下のコマンドを入力してください。  

ディストリビュートは Ubuntu 2004 にしていますが、ほかのディストリビュートが良い場合は補足を参照してください。

```powershell:PowerShell
# WSL 2 Kernel Update
Invoke-WebRequest -Uri https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi -OutFile wsl_update_x64.msi -UseBasicParsing
msiexec /i wsl_update_x64.msi /passive /norestart 
rm wsl_update_x64.msi

# WSL 2 を標準にする
wsl --set-default-version 2

# Ubuntu 2004 をインストール
Invoke-WebRequest -Uri https://aka.ms/wslubuntu2004 -OutFile linux.appx -UseBasicParsing
Add-AppxPackage -Path linux.appx
rm linux.appx
```

**ここでコンピュータの再起動。**

### Ubuntu の設定

スタート メニューの中に **Ubuntu 20.04 LTS** が追加されているので実行します。  
初回は初期設定が実行されますので、

- UNIX ユーザー名
- UNIX パスワード

を設定して完了です。

WSL2 + Ubuntu が使えるようになりました。
Ubuntu を閉じます。

## 2. VirtualBox + Vagrant インストール

### Scoop 

Scoop を導入すると、コマンドでアプリケーションをインストールできます。  

公式ページはこちら
https://scoop.sh

Power（通常の権限で）PowerShell を起動して、以下のコマンドを入力してください。  

```powershell:PowerShell
# PowerShell 実行ポリシー権限がない場合はこちらも実行
Set-ExecutionPolicy RemoteSigned -scope CurrentUser

# Scoop インストール
iwr -useb get.scoop.sh | iex

# Git インストール（Scoop の管理で使用されるため必須。別で Git をインストールしている場合は不要）
scoop install git

# インストールできるアプリを増やすため Bucket の追加
scoop bucket add extras
scoop bucket add nonportable

# sudo インストール（今後 PowerShell を管理者権限で起動しなくてもすますため）
scoop install sudo
```

これで有名なアプリをコマンドでインストールできるようになりました。  

PowerShell を閉じます。

### VirtualBox + VirtualBox Extension Pack + Vagrant

Scoop を使えばたった2行でセットアップ完了！
（通常の権限で）PowerShell を起動して、以下のコマンドを入力してください。  

```powershell:PowerShell
# VirtualBox & VirtualBox Extension Pack インストール
scoop install virtualbox-with-extension-pack-np

# Vagrant インストール
scoop install vagrant
```

> 【補足】
Scoop のインストールで VirtualBox Extension Pack のバージョンが古いことが多々あります。
別の方法で VirtualBox Extension Pack をコマンドのみでアップデートする方法を確立していますので、そちらも合わせてご参照ください。
> 
> VirtualBox Extension Pack をコマンドライン (CLI) からインストール＆アップデートする
> https://qiita.com/mainy/items/b70bd7cc5b20ccdc12a1
  
Vagrant 一式が使えるようになりました。PowerShell を閉じます。

普通にインストールすると VirtualBox Extension Pack のインストール漏れで引っかかっている人が多いので、そんな悲しいミスも防げます。

## 3. Docker Desktop インストール

Docker は Scoop でインストールすると、前バージョンの Docker Toolbox がインストールされてしまいます。
WSL2 に対応しているのは Docker Desktop なので、こちらは Chocolatey を使用してインストールを行います。

### Chocolatey

Chocolatey もコマンドでアプリケーションをインストールできます。
ただし、Scoop に比べると使い勝手がいまいちなので、こちらは Scoop でインストールが難しいアプリをインストールするために使います。

Chocolatey
https://chocolatey.org/

**管理者権限で PowerShell を起動**して、以下のコマンドを入力してください。  

```powershell:PowerShell（管理者権限）
# Chocolatey インストール
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

PowerShell を閉じます。

### Docker Desktop

（通常の権限で）PowerShell を起動して、以下のコマンドを入力してください。  

```powershell:PowerShell
# Docker Desktop インストール
sudo choco install -y docker-desktop
```

Chocolatey でのインストールは管理者権限が必要なので、インストール時に PowerShell の起動方法に気を付けないといけません。
が、さきほど Scoop で sudo をインストールしていたので、コマンド単位で管理者権限にかんたんに昇格できたと思います。

Docker が使えるようになりました。PowerShell を閉じます。

ここまでで、Docker (WSL2) と Vagrant (VirtualBox) を Windows で併用する環境が出来上がったと思います。

## 補足

### ほかのディストリビュート

上記は Ubuntu 2004 を導入していますが、ほかのディストリビュートもコマンドでインストールできます。
引数 `-Uri` に渡す URI を変更してください。
URI は https://docs.microsoft.com/en-us/windows/wsl/install-manual#downloading-distros のリンクを確認してください。
例えば、Debian GNU/Linux を利用したい場合は以下のような感じです。

```powershell:PowerShell
# Debian GNU/Linux
Invoke-WebRequest -Uri https://aka.ms/wsl-debian-gnulinux -OutFile linux.appx -UseBasicParsing
Add-AppxPackage -Path linux.appx
rm linux.appx
```

### VirtualBox 側の弊害

ゲスト OS と相性が一部悪いようです。
ゲスト OS に Windows 10 を使ってみましたが、やはり使い物になりませんでした。
Ubuntu 2004 ⁺ GUI は問題なく動作しているんですがねぇ。。。

## 参考

以前にチャレンジしていた時の記録

WSL2 をすべてコマンドでインストールしたときのメモ
https://qiita.com/mainy/items/19862ebb1fa4df2ad497