Windows Subsystem for Linux 2でDocker for WSL2を使う
Tags: docker
Published: 2020-04-04 11:10:35

Subsystem for Linux 2（[WSL2](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-index)）はWindowsからLinuxが使える機能です。

2020年4月にリリースされるWindows10 2004から提供される予定です。
もともと2017年にリリースされたWindows 10 Fall Creators UpdateでWSLが提供されてましたが、そちらは本物のLinuxカーネルを使っておらず、実行できるシステムコールが限られてました。

2は本物のLinuxカーネルが動作します。
Dockerも使えるようになります。
これにより今後はWindowsでもLinuxを使用して開発が行いやすくなると思います。

---

# WSL2のインストール
[WSL 2 のインストール手順](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-install)をもとに実施


WSL2に必要な環境条件は以下

- Windows 10 builds 18917 or higher

2020/03/20時点でWindows10 builds 18917はWindows Insider Program（slow or fast）に加入しないとアップデートできない。

1. Windows Insider Programに加入する

    Windowsメニューから`設定 > 更新とセキュリティ > Windows Insider Program`より加入する。
    ![Windows_Insider_Program_1](https://dev-to-uploads.s3.amazonaws.com/i/3w6b9m6s3v66cqsng8eb.png)
    ![Windows_Insider_Program_2](https://dev-to-uploads.s3.amazonaws.com/i/nslefsrofa0asm3wi8zg.png)
    ![Windows_Insider_Program_3](https://dev-to-uploads.s3.amazonaws.com/i/mvuw9x8o9rdsgkmbj88k.png)
    ![Windows_Insider_Program_4](https://dev-to-uploads.s3.amazonaws.com/i/gv5a9m8up9mr62e47cgl.png)
    ![Windows_Insider_Program_5](https://dev-to-uploads.s3.amazonaws.com/i/4gox3eppkl9dtd1dnd9h.png)
    ![Windows_Insider_Program_6](https://dev-to-uploads.s3.amazonaws.com/i/bt2nu017sywj35scwg0o.png)
    [スロー]か[ファスト]を選択
    ![Windows_Insider_Program_7](https://dev-to-uploads.s3.amazonaws.com/i/kb41arj3kyoyo6nzvrrj.png)
    ![Windows_Insider_Program_8](https://dev-to-uploads.s3.amazonaws.com/i/667gsxhjphp1dnfd95q2.png)
    ![Windows_Insider_Program_9](https://dev-to-uploads.s3.amazonaws.com/i/mxz13v1dcd6plmdf0ne5.png)

2. Windows Updateを実施する

3. WSL2を有効にする  
    `設定 > アプリ > アプリと機能 > オプション`から「Windowsのその他の機能」リンクをクリックする。
    ![Activate WSL2_1](https://dev-to-uploads.s3.amazonaws.com/i/hnxb5eytc9cxrq0gd2n2.png)
    ![Activate WSL2_2](https://dev-to-uploads.s3.amazonaws.com/i/ll8etm6hdspgw48st0gh.png)
    以下のチェックをONにする。
        - Linux 用 Windows  サブシステム
        - 仮想マシン プラットフォーム
    ![Activate WSL2_3](https://dev-to-uploads.s3.amazonaws.com/i/gkxbrs83no1b2fy6488s.png)![Activate WSL2_4](https://dev-to-uploads.s3.amazonaws.com/i/0i11hrh8yvh6zvxl87hx.png)

    PowerShellを管理者権限で起動し、以下を実行しても実施できる。

    ```
    > dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    > dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    ```
    その後、再起動する。

4. Microsoft StoreからLinuxをインストールする

    後述のDocker Desktop for WSL 2が使えるのは[Ubuntu 18.04 LTS](https://www.microsoft.com/ja-jp/p/ubuntu-1804-lts/9n9tngvndl3q?activetab=pivot:overviewtab)のみの模様。（2020/03/20時点 Storeには「Ubuntu」もあるが、そちらは対応していない）


5. Ubuntu 18.04 LTSをダウンロードしたら起動する

    起動後にインストールが始まり、ユーザ名とパスワードを入力し、ユーザを作成する。

6. PowerShellを起動する 
 
    ``` powershell:powershell
    # インストールしたディストリビューションの一覧を表示する
    > wsl -l
    Linux 用 Windows サブシステム ディストリビューション:
    Ubuntu-18.04 (既定)

    # WSLの状態とバージョンを確認する（VERSIONが1はWSLということです）
    > wsl -l -v
      NAME            STATE           VERSION
    * Ubuntu-18.04    Stopped         1
   
    # Ubuntu-18.04をWSL2用に変換する
    > wsl --set-version Ubuntu-18.04 2
   
    # WSL2を標準設定とする
    > wsl --set-default-version 2
    WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください。
    ```

    上記のメッセージの通り、[WSL 2 Linux カーネルの更新](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel)へアクセスし、更新プログラムをインストールする。インストール後、以下を実行する。

    ``` powershell:powershell
    # WSL2を標準設定とする
    > wsl --set-default-version 2
   
    # WSLの状態とバージョンを確認する
    > wsl -l -v
      NAME            STATE           VERSION
    * Ubuntu-18.04    Stopped         2
    ```

7. Ubuntuを起動／停止する

    ``` powershell:powershell
    # 起動する
    > wsl -d Ubuntu-18.04
    To run a command as administrator (user "root"), use "sudo <command>".
    See "man sudo_root" for details.
   
    # フォルダ階層は以下になる
    $ /home/user/ ← 登録したLinuxユーザのhome
      /mnt/c ← WindowsのCドライブ
      /mnt/d ← WindowsのDドライブ

    # Windowsに戻る
    $ exit
    ```

これでWindowsからLinuxが使えるようなりました。

WSLはWindowsからシームレスにシェルを使え、VirtualBoxやVMWareのようにOSが起動する時間を待つ必要もありません。

---

# [Docker Desktop for Windows](https://docs.docker.com/docker-for-windows/wsl/)をインストールする

1. [Docker Desktop for Windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows)をインストールする

2. メニューバーにDockerのアイコンが表示されるので、[Settings]を選択する
    ![Docker_Desktop_for_Windows_1](https://dev-to-uploads.s3.amazonaws.com/i/qawup6gsl7op3odewufm.png)
    <img src="https://dev-to-uploads.s3.amazonaws.com/i/mz9ncw35lnkn6oaqzvbc.png" width="300px" alt="Docker_Desktop_for_Windows_2">

3. Settings画面が表示されるので、以下を確認する
    - Dockerのステータスがrunningになっていること
    - `Use the WSL 2 based engine`のチェックボックスがONになっていること
    ![Docker_Desktop_for_Windows_3](https://dev-to-uploads.s3.amazonaws.com/i/7km5eiof0xzs1a6g3qmg.png)

    また、`Resources > WSL INTEGRATION`を選択し、`Enable integration with my default WSL distro`のチェックボックスがONになっていることを確認する
    ![Docker_Desktop_for_Windows_4](https://dev-to-uploads.s3.amazonaws.com/i/lt6xcof5g5e1ypgc76tq.png)
4. DockerがWSL2 based engineで起動されていれば、Dockerコマンドを実施すると、上記でインストールしたWSL2のUbuntuにDockerコンテナが作成されるようになる

    PorwerShellを起動し、Dockerコマンドを実行することができる。
    Ubuntuのほうでもdockerコマンドの実行ができる。

    ``` powershell:powershell
    # powershellでdockerコマンドを実行
    > docker run hello-world

    ...

    Hello from Docker!
    This message shows that your installation appears to be working correctly.

    > docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    0629bbd84b50        hello-world         "/hello"            22 seconds ago      Exited (0) 20 seconds ago                       mystifying_almeida


    # WSL2に切り替える
    > wsl -d Ubuntu-18.04

    # Ubuntuでdockerコマンドを実行
    $ docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    0629bbd84b50        hello-world         "/hello"            22 seconds ago      Exited (0) 20 seconds ago                       mystifying_almeida
    ```

    WindowsとUbuntuでコンテナが共有されていることが確認できる。

---

Docker Desktop for WSL 2を使うと、このようにWindowsからDockerコマンドを実行して、LinuxのDockerコンテナを操作することができます。

---

2020/04/11追記
~~DockerComposeは、PowerShellからは実行できないようです。（実行してもLinuxのコンテナとならない）。Linuxのほうで実行すればWindowsと共有できそうです。~~

2020/05/11追記
Docker Desktop For Windowsの（Edge版：バーション2.3.0.1）で、WindowsからDockerComposeできるようになりました。

こちらのバージョンではWindows10 Home Editionでも動作するようです。
Docker Desktop for Winodwsのバージョンアップに伴い本記事の内容を修正しました。

2021/03/07追記
Dockerのバージョンアップに伴いStable版に記述を修正しました。