WSL2でDockerを爆速化


ウチのWin10もようやくこの前のWindowsUpdateでWSL2が有効になりました。

早速、公式の手順に従ってDockerをWSL2に対応させて行きましょう
https://docs.docker.com/docker-for-windows/wsl/

その前に、What's WSL2

WSLはWindowsSubsystemForLinuxの略称
WindowsのコマンドラインでLinuxのコマンドが使えるよー的なものだとおもって貰えば良いでしょう。

WSL2はWSLのバージョン2になります。ただし、WSL1の完全上位互換ではなくメリットとデメリットがあります。
https://docs.microsoft.com/ja-jp/windows/wsl/compare-versions

まずは前提確認

  1. Docker、バージョンは2.3.0.2以上
  2. Windows10、バージョン 2004、ビルド 19041 以上

WSL2をインストールする

まずは、MicrosoftストアからUbuntuを入手

WSLにつかうLinuxOSは汎用性を考えてUbuntuにしました。
ファイルサイズが大きいですが、WSL用には一番オススメできるかと思います。
https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6?activetab=pivot:overviewtab

WSL2にアップデート

そのままだと、WSL1でインストールされるので、WSL2にアップデートしましょう。

# インストールされているWSLとバージョンを確認
wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Running         1

*がついているのがデフォルトのWSLです。WSLに複数のLinuxを入れているとたくさん出ます。
通常は、デフォルトのWSLがDockerと統合されます。

# WSLをバージョンアップ
wsl --set-version Ubuntu 2

# インストールされているWSLとバージョンを再確認
wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Running         2

UbuntuのVersionが2になっていれば成功です。

早速 Docker For WindowsでWSL2を有効に

  1. Settings > Generalと進んで、Use WSL 2 based engineにチェックしてApply & Restart

  2. Settings > Resources > WSL Integration デフォルトのWSLで統合機能が有効になっています。

これで、いままでHyper-V上の仮想マシンで動いていたDockerが、WSL2で動くようになりました。

が、落とし穴

WSL2は完全なLinuxになったもののWindowsのファイル共有でパフォーマンスが落ちてしまうデメリットがあります。
そのため、volumesでWindowsのローカルフォルダをコンテナに共有していた場合、体感的にかなり遅くなってしまいました。

Linuxのファイルシステムにソースコードを配置することで解決

wslのWindowsとの共有領域である/mnt/c/配下をvolumesで共有すると遅くなってしまうので、
プログラムのコードはそれ以外の場所に置きましょう。
公式のベストプラクティスにもそう書いてあります。
https://docs.docker.com/docker-for-windows/wsl/#best-practices

WSL2のDockerでVSCodeのDevContainer開発

WSL内でcodeコマンドを実行すれば、WindowsのVSCodeがRemote-WSLモードで開く!!!

code ~/hoge_workspace/

あとは、WSL内のフォルダにdevcontainer.jsonを用意していつもの手順でReopen in Container

DevContainer関連

WSLのディレクトリにWindows10のエクスプローラーからアクセス

WSL内のLinuxが起動した状態で以下のネットワークパスにアクセスすることで、WSL内のフォルダにエクスプローラーでアクセス可能です。
そのままWindowsからファイルを編集することも可能です。

\\wsl$\