WSL2とDockerの導入

作成: 2020年11月19日

更新: 2021年02月07日

概要

Windows 10におけるWSL2とDockerのセットアップ方法.自分用の備忘録として.

Dockerとは

参考: Docker入門 #1 【Dockerとは】 - Qiita

VMのように仮想環境を作成し既存の環境を汚さずに環境を構築するツール.
VMなどの既存のツールと比べ軽量.
Pythonなど環境構築の段階で問題が起きやすい言語・フレームワークにおいて有用

WindowsにおけるDocker

Windows 10においてDockerを導入する手段はいくつかあるがここではWSL2を用いた方法を記述する.
WSLとはWindows Subsystem for Linuxの略称でありWindows上でLinuxを動かせるツールである.
5月のWindows 10 May 2020 Updateによりバージョン2であるWSL2が正式にリリースされた.
導入手順としては

  1. Windows 10 May 2020 Update の実行
  2. WSL2 の導入
  3. Docker for Windows インストール
    という流れになる

Windows 10 May 2020 Update の実行

参考: Windows 10 May 2020 UpdateでのWSL2導入手順 - Qiita

そのうちアップデートされますが以下のリンクからアップデートすることも可能
Download Windows 10

WSL2の導入の準備

まずPowerShellを管理者権限で立ち上げます.
そして以下のコマンドでHyper-Vを無効化

Hyper-Vを有効化しておくことでgRPCのport 50051などHyper-Vが予約しているポートとバッティングしているポートを使用しようとする場合などで困ることになるので必要なければ無効化しておいた方がよさそうです。

"機能名 Microsoft-Hyper-V は不明です"などのエラーが出た場合は行わなくて大丈夫です.

Disable-WindowsOptionalFeature -Online -FeatureName $("Microsoft-Hyper-V")

次に以下のコマンドでVirtualMachinePlatformとWSLを有効化

Enable-WindowsOptionalFeature -Online -FeatureName $("VirtualMachinePlatform", "Microsoft-Windows-Subsystem-Linux")

次に以下から「WSL2 Linux カーネル更新プログラム パッケージ」をダウンロードしてきてインストール
WSL 2 Linux カーネルの更新 | Microsoft Docs

WSL2の導入(WSLが入っている場合)

WSLを既に使用してる場合はディストリビューションの更新が必要です。
Powershell を管理者権限で立ち上げて以下を実行します。

  • WSLのディストリビューションを検索
wsl -l -v
#  NAME            STATE           VERSION
#* Ubuntu    Running         1
  • バージョンを2に上げたいディストリビューションを更新
wsl --set-version Ubuntu 2

更新までしばらく時間がかかります。

  • ディストリビューションのバージョンが「2」に上がったことを確認
wsl -l -v
#  NAME            STATE           VERSION
# Ubuntu    Running         2

WSL2の導入(WSLが入っていない場合)

参考:
Windows Subsystem for Linux (WSL) を Windows 10 にインストールする | Microsoft Docs
Windows Subsystem for Linuxをインストールしてみよう! - Qiita
WSL でユーザーを作らずに root で作業する - Qiita

PowerShellを管理者権限で立ち上げ以下のコマンドを入力しデフォルトのWSLのバージョンを2にする.

wsl --set-default-version 2

Microsoft Storeで希望のディストリビューションをインストールする(今回はUbuntu).
Ubuntu を入手 - Microsoft Store ja-JP
WSL初回起動時にUser作成を求められる.
ここでユーザーを作成したくない場合rootと入力すると以下のようになる.

Enter new UNIX username: root
adduser: The user `root' already exists.
Enter new UNIX username:

ここでCtrl+Cを入力するとウインドウが閉じるのでもう一度、スタートメニューから起動すると root ユーザーとしてログインされた状態で起動する.
(個人的にWindowsの中にあるWSLにユーザーを作成する意味は薄いと思います)
念のためPowerShellをで立ち上げ ディストリビューションのバージョンを確認

wsl -l -v
#  NAME            STATE           VERSION
# Ubuntu    Running         2

Docker for Windows インストール

参考:
Docker Desktop を WSL2 で使う (Windows 10) | エンジニアの何でもメモ帳
DockerデスクトップWSL 2バックエンド| Dockerドキュメント
Linux for Windowsサブシステム(WSL)2ののDockerの使用

以下のリンクからDocker Desktopをインストール
Docker Desktop for Windows - Docker Hub
インストール時にEnable WSL2 featureにチェックを入れる
Dokcde DesktopからDockerを起動した後
Ubuntuをスタートメニューから起動しDockerのバージョンを確認

> docker -v
# Docker version 19.03.8, build afacb8b7f0

WSLの初期設定

参考: Windows Subsystem for Linuxをインストールしてみよう! - Qiita

リポジトリの変更

デフォルトでは海外サーバーにリポジトリのデータを取りに行ってしまいます。
これだと通信速度が遅くなってしまうので、日本のサーバーに切り替えます。
次のコマンドを入力して、切り替えてください。

sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list

パッケージのアップデート

あくまでLinuxが乗っかっているので、パッケージのアップデートが必要

sudo apt update
sudo apt upgrade

Windows Terminal

参考: Windows Terminalをカスタマイズしよう!(Preview v0.11.1121.0版) - Qiita

Ubuntuを起動するだけでもWSLは使えるがWindows 10 May 2020 Updateと同時にリリースされたWindows Terminalをお勧めする.
Microsoft Storeからインストール
Windows Terminal を入手 - Microsoft Store ja-JP
初期設定ではPowerShellがデフォルトなので変更する.また起動時にWSL上のホームディレクトリを初期位置にするように設定する.
Ctrl+, でsettings.jsonが開くのでdefaultProfileを変更する.

settings.json// To view the default settings, hold "alt" while clicking on the "Settings" button.
// For documentation on these settings, see: https://aka.ms/terminal-documentation

{
    "$schema": "https://aka.ms/terminal-profiles-schema",

    "defaultProfile": "{2c4de342-38b7-51cf-b940-2309a097f518}", // ★ここにWSLのGUIDを指定★

    "profiles":
  .
  .

Windows Terminalでは、シェル設定をprofilesという単位で管理しています。このprofiles毎に一意となるIDがGUIDで、例えばWSL(ディストリビューションはUbuntu)の場合は"guid": "{2c4de342-38b7-51cf-b940-2309a097f518}"となります。
このGUIDを"defaultProfile"プロパティに指定することで、Windows Terminalを起動した時に対応するシェル:WSLが開くようになります。

ただ、この設定だけだとWSLが開いた際のディレクトリ位置は%USERPROFILE%となっています。
WSL上のホームディレクトリを初期位置とするには、次の設定をWSL profileにする必要があります。

settings.json  .
  .
        {
            "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
            "hidden": false,
            "name": "Ubuntu",
            "source": "Windows.Terminal.Wsl",
            "commandline": "wsl.exe ~ -d Ubuntu" // ★ ~ を付けるのがポイント★
        },
  .
  .

VSCodeでのターミナルをWSLにする

参考: VSCodeのターミナルをWSLのものにする - Qiita
VSCodeでCtrl+Shift+@で開くターミナルをWSLに変更する.
VSCodeの設定を開き
"terminal.integrated.shell.windows": "C:/Windows/Sysnative/bash.exe"
とする

ホストのメモリ枯渇防止

参考: WSL2によるホストのメモリ枯渇を防ぐための暫定対処 - Qiita
WSL2を使用しているとホスト側でvmmemというタスクの使用メモリが増え続け,最終的に100%メモリを使用してしまうという問題があり,2020/11/19 現在解決されていません.
公式のイシューによるとWSLの設定ファイルを作成し,WSLのメモリサイズを固定するという暫定対処が推奨されています.
WSL 2 consumes massive amounts of RAM and doesn't return it · Issue #4166 · microsoft/WSL

C:\Users${username}.wslconfigというテキストファイルを作成し,以下のように記述します.

[wsl2]
memory=6GB
swap=0
localhostForwarding=true

そしてWindowsを再起動するか,コマンドプロンプトから以下のコマンドを実行しWSLを再起動するとWindows全体でのメモリ枯渇は起きなくなります(WSLでのメモリ枯渇は起きる).

wsl -l
# Windows Subsystem for Linux ディストリビューション:
# Ubuntu(既定)
wsl -t Ubuntu # ディストリビューション名を指定