Windows10 2004でWSL2を設定してVSCodeからDockerに接続する

# Windows10 2004でWSL2を設定してVSCodeからDockerに接続する

Windows10のバージョン2004から正式にWSL2が利用可能になりました。WSLとWSL2の大きな違いの一つとして、Dockerの利用可否があげられます。
WSLではLinuxシステムコールをWindowsカーネルのものに変換する、という仕組みだったのに対し、WSL2では軽量のLinux VMを動作させる仕組みに変わったので、WSLでは実現できなかったDockerの利用が可能になりました。
WSL2を利用する主目的が、開発環境構築のためのDockerの利用という人も多いんじゃないかなぁ、と思いますので、今回はWSL2の導入からWSL2上へのDockerの導入、更にWindows側のVSCodeからWSL2上で動かしているDockerコンテナへリモート接続するところまでを試してみます。

## Windows 10のバージョンを2004以降に上げる
現在のバージョンは Windowsの設定 > システム > バージョン情報 > Windowsの仕様 > バージョン に記載されております。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/bd14db32-0108-681d-fa9d-6f4619bb2687.png)
ここが2004以降でない場合、WSL2の利用にはバージョンアップが必要です。
[Windows10ダウンロードサイト](https://www.microsoft.com/ja-jp/software-download/windows10%E3%80%80)の「今すぐアップデート」を押下して、アップデートファイルを入手して実行することでアップデートします。

## CPUの仮想化支援機能の有効化
WSL2の動作には、CPUの仮想化支援機能(Intel VT-X/AMD-V)が有効になっていることが必要です。
そのため、
①CPUが仮想化支援機能に対応していること
②BIOSで仮想化支援機能が有効になっていること
が必要です。

①に関してはよほど古いCPUでない限り対応しています。
②も、デフォルトで有効になっているPCやマザーボードが多いですが、こちらは無効になっていることがあり得ますので、確認が必要です。 

自分の環境で仮想化支援機能が有効かどうかは、タスクマネージャーから確認できます。
タスクマネージャー > パフォーマンス > CPU > 仮想化 が「有効」ならば、仮想化支援機能が有効になっています。 
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/38ddb651-883b-ec91-b72c-c9a2bd1aa774.png)
「無効」だった場合は、BIOSから設定を有効にする必要があります。設定はPCやマザーボードによって異なるため、ググったりメーカーに問い合わせたりしてご確認ください。

※ちなみに筆者の私用PCのマザーボード、X470 AORUS ULTRA GAMINGでは、UEFI BIOSの以下の項目でした。
M.I.T > Advanced Frequency Settings > Advanced CPU Core Settings > SVM Mode の "Disabled"を"Enabled"に変更

## WSLの有効化
1. コントロールパネルの「Windows の機能の有効化または無効化」を開きます。Windowsの設定の検索バーに「Windowsの機能」まで入力すれば出てきます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/156c9f47-eb57-0cba-94b8-b46daa4f3fee.png)
1. 「Linux用Windowsサブシステム」と「仮想マシンプラットフォーム」にチェックを入れ、OKを押下します。  
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/d7eddd5c-1dfc-8634-ee88-e0b90ce00390.png)  
再起動を促されるので再起動します。  

※なお、WSL2の利用では「Hyper-V」や「Windowsハイパーバイザ―プラットフォーム」にはチェックを入れる必要はありません。
[Hyper-Vで予約されているポートをWSLから利用したい場合などに面倒なよう](https://qiita.com/tomtwinkle/items/92c8c399f9aad62c45b6#hyper-v%E3%82%92%E7%84%A1%E5%8A%B9%E5%8C%96%E3%81%99%E3%82%8B)なので、Hyper-Vと併用の必要がなければチェックを外しておいたほうがよさそうです。
「Windowsハイパーバイザ―プラットフォーム」については[こちら](https://qiita.com/matarillo/items/ca1eecf8f9a3cd76f9ce#windows-%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%90%E3%82%A4%E3%82%B6%E3%83%BC-%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0)が詳しいです。

## Linuxディストリビューションのインストール時に、WSL2が既定になるように設定する
PowerShellを管理者権限で実行し、以下のコマンドを実行します。

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

これにより、LinuxディストリビューションがWSL2としてインストールされるようになります。

## カーネルコンポーネントの更新
WSL2向けにLinuxカーネルを更新します。
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel
に従い、カーネル更新プログラムを適用します。

## Linuxのインストール
Microsoft StoreからLinuxディストリビューションをインストールします。
https://www.microsoft.com/ja-jp/search/shop/apps?q=linux
からお好みのディストリビューションを選択して「入手」を押下します。特に拘りがない場合はUbuntuを選んでおけばいいでしょう。
Microsoft Store上でインストールが完了したら「起動」を押下します。

起動したら、コンソール画面が開き、ユーザー名とパスワードを設定するよう要求されます。
設定が完了したらそのまま、コンソール画面内にLinuxのCLIが起動します。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/83b37ff8-cf65-220e-f208-e339846f809e.png)

一旦`exit`と入力し、Linuxを終了します。

## LinuxのWSLバージョンの確認/WSL1からWSL2への変換
powershellより以下のコマンドで、現在インストールされているディストリビューションの一覧を表示することができます。

```powershell
wsl --list -v
```

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/424fe1d1-4944-3d9d-245d-4df160f8d84f.png)
VERSION部分がWSLのバージョンになります。また、デフォルト設定(コンソール上でただ`wsl`や`bash`コマンドを実行した際に起動するディストリビューション)のディストリビューションには左にスターがついています。
`wsl --set-default-version 2`を行った後にLinuxをインストールした場合、最初からWSL2としてインストールされているはずです。
一方、既にWSL1で利用していた環境がある場合(VERSION部分が1のもの)、その環境をWSL2に変換することもできます。以下のコマンドを利用してください。

```powershell
wsl --set-version ${ディストリビューション名} 2
例: wsl --set-version Ubuntu-20.04 2
```

ここまででWSL2のLinux環境の設定は完了です。

## Docker Desktopのインストール
ここからはDockerの設定に入ります。今回の記事ではDockerの設定に[Docker Desktop](https://www.docker.com/products/docker-desktop)を利用します。
WSL2のLinux内でDockerの設定を行ってもいいのですが、Docker Desktopを利用することで、以下のメリットが得られます。

- Dockerのセットアップをインストーラで容易に完了できる
- Windows側(PowerShell)とLinux側(WSL2)の両方からコンテナを操作できる

Docker Desktopのインストールは以下の手順で行います。

1. https://www.docker.com/products/docker-desktop の、"Download for Windows(stable)"からインストーラをダウンロードし、インストーラを実行。
1. "Configuration"で、"Enable WSL 2 Windows Features"にチェックが入った状態でOkを押下。![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/2ab676cc-056b-d0a8-663e-aa8d179fcbf4.png)

1. "Installation succeeded"で"Close and log out"を押下すると、インストーラのウィンドウが閉じ、サインアウトされる。そのままWindowsを再起動する。
1. Windowsにログイン後、少し待つと、デスクトップ右下のインジケータ内にDocker Desktopのアイコンが立ち上がる。"Docker Desktop is running"になるまで待つ。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/9c44d6b8-c647-47aa-71f0-64620174ace6.png)
runningになったら、アイコンをクリックし、メニュー内の"Settings"をクリックする。
1. Settings画面で以下の項目を実施する。
  - General > Use the WSL 2 based engine にチェックが入っていることを確認
  - Resource > WSL INTEGRATION を設定し、"Apply & Restart"
      - WSLでデフォルト設定されたディストリビューションでDockerコンテナを起動したい場合は"Enable integration with my default WSL distro"にチェック
      - デフォルト設定でないディストリビューションでDockerコンテナを起動したい場合は、"Enable integration with additional distros:"の該当のディストリビューションのトグルをONにする
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/bd2b200d-9f7c-19fe-0a4b-9be3548d5d39.png)

## Dockerコンテナの作成/起動
Docker Desktopの設定が完了すれば、dockerコマンドでコンテナの操作が可能になっているはずです。試しに公式のgolangコンテナを起動してみます。
docker runコマンドでコンテナの作成と起動を一度に行えます。powershellからやってみます。(先述したように、WSL内から実行することも可能です。)

```powersherll
docker run -it golang
```

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/a42cc190-edff-8a44-bac3-5860689011c0.png)
コンテナが起動します。

## VSCodeにRemote Development Extensionをインストール
起動中のコンテナにVSCodeから接続してみましょう。そのためには[Remote Development Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)が必要です。
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack
のInstallからVSCodeにExtensionをインストールします。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/17804ae9-dc77-56ee-c2b5-90078f159f4e.png)

## VSCodeからWSL2内で実行中のDockerコンテナに接続
ここまでくればあともう一息です。VSCode上でコマンドパレットを開き(キーバインドを変更していなければ`Ctrl+Shift+P`)、"remote"と入力します。
候補が出てくるので、その中の"Remote-Containers: Attach to Running Container..."を選択します。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/da63fe36-ab6e-6452-fae8-f39d14c53057.png)
すると、実行中のWSL2内で実行中のDockerコンテナが一覧でリストされるため、VSCodeで開きたいコンテナを選択します。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/1c7f85ac-d237-842d-8ea2-0b6e7ed7bc22.png)
VSCodeが別ウィンドウで起動し、ワークスペースとしてDockerコンテナを開きます。左下に接続中のコンテナが表示されています。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/2dcc44f2-34d8-8219-30ba-1b7bd56dc310.png)
コンテナ内のファイルをVSCode上で閲覧/編集するためには、エクスプローラの「フォルダーを開く」からコンテナ内のディレクトリを指定して"ok"を押下します。
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/4fcac1f6-e76a-55a9-e4a7-a48bbd531ab7.png)

これで、VSCode上から、WSL2上のDockerコンテナ内のファイルを操作しての開発が可能になりました。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375883/ae6b3135-83f4-01f3-8924-609ce5866c21.png)

## 参考
https://qiita.com/kikiki/items/df9874bae23f3c271ea2
https://qiita.com/matarillo/items/ca1eecf8f9a3cd76f9ce
https://qiita.com/iridon0920/items/005a9224343413b74f78
https://qiita.com/yito/items/1edd82414dfc2ab2a7bc
https://support.bluestacks.com/hc/ja/articles/115003174386-PCでバーチャライゼーション-VT-を作動させるには-
https://dev.to/birdsea/windows-subsystem-for-linux-2-docker-for-wsl2-3dpm
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10