Windows 10 HomeのWSL2でdocker-composeを使う

この記事は[ニフティグループ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/nifty)の10日目の記事です。

---

入社1年目研修の一環としてLaravelフレームワークを使ってのチーム開発を行いました。
せっかくならば家でもLaravelで開発を行おうと思い、研修時にも使ったLaradockを用いて環境構築を行おうと考えました。

ところがちょっと待てよ、自分のPCはWindowsじゃないか。
Dockerを動かすのがかなり面倒だと聞いたぞ。
VM立てたりしなきゃいけないのか…？

やる気を削がれつつ調べてみると、WSL2を用いてDocker（docker-compose）が使えるようだったので、そちらを採用して環境構築を進めていきました。

#環境

- Windows 10 Home
    - バージョン 1903
    - OSビルド 18362.418

#WSL2の導入

WSL2は2019/12/08現在は正式リリースされておらず、2020年の春に正式リリース~~されるのではと噂されていたりします~~されました！（バージョン2004）
現段階でWSL2を使うためには、OSビルドの先行リリースをプレビューできる**Windows Insider Program**に登録し、β版として使う必要があります。

###Windows Insider Programの利用を開始する

[WSL2を使うための要件](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-install)を一読し、[公式サイト](https://insider.windows.com/ja-jp/how-to-pc/)にしたがってWindows Insider Programの利用を開始します。
要約すると以下のような感じです。

1. [Microsoftの公式ページ](https://insider.windows.com/ja-jp/)から自身のMicrosoftアカウントをInsiderとして登録。
2. 管理者権限のあるユーザーで、`スタート`>`設定`>`更新とセキュリティ`>`Windows Insider Program`から`開始する`をクリック。
3. `アカウントを選んで開始`からWindows Insider Programに登録したMicrosoftアカウントを入力。
4. 受信したいコンテンツの種類と受信頻度を適切に選択し、PCを再起動。

[WSL2を使うための要件](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-install)では受信頻度を"ファスト"にせよという指示がありますが、11/17時点では"スロー"でも必要なビルドを受信することができました。
**"ファスト"はややリスクが大きいですので、"スロー"を選択することを推奨します。**

また、私の環境の場合、ビルドの受信とインストールには数時間かかりました。
マシンスペックとネットワークの状況によりけりかとは思いますが、時間の余裕のある時に行いましょう。

`スタート`>`設定`>`システム`>`バージョン情報`にある`Windowsの仕様`の項目から、インストール済みのビルドを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533571/85af0693-d025-8fae-a3c6-6710c12e41d7.png)

ビルドが**18917以降**になっていれば準備完了です。

###WLS1を有効化する

WSL2はWSL1をアップグレードすることで使えるようになります。
なので、あらかじめWSL1を使える状態にしておきます。

1. `スタート`>`設定`>`アプリ`>`アプリと機能`の`関連項目`から`プログラムと機能`をクリック。
2. 左の一覧から`Windowsの機能の有効化または無効化`をクリック。
3. 以下の3つを有効化して再起動します。
    - Linux用Windowsサブシステム
    - Windowsハイパーバイザー プラットフォーム
    - 仮想マシンプラットフォーム
4. `Microsoft Store`を開き、検索窓で`Ubuntu 18.04 LTS`と検索し、`入手`をクリック。インストールを完了します。
5. スタートメニューからUbuntuを起動し、ユーザー名とパスワードを設定します。

```console
Installing, this may take a few minutes...
Installation successful!
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: ←ユーザー名を入力
Enter new UNIX password: ←パスワードを入力
```

###WSL2へアップグレード

[公式サイト](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-install)の手順に従いWSL2を導入します。
コンポーネントの有効化はGUIからすでに行ったのでスキップします。

PowerShellを管理者権限で実行し、以下のコマンドを叩きます。

```powershell
wsl --set-version Ubuntu-18.04 2
```

バージョン確認を行い、`VERSION`が2となっていればWSL2の導入は完了です。

```powershell
wsl -l -v
```

#Dockerの導入

WLS2で動くようになったLinux環境にDockerを導入していきます。
基本的にはDockerの公式の案内に従います。

###Dockerをインストールする

[公式サイト](https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-using-the-convenience-script)で案内されているインストール方法のうち、今回は簡単そうな"Install using the convenience script"を試してみます。
**正式なプロダクトへの使用は推奨されていない**らしいので自己責任でお願いいたします。

WindowsのスタートメニューからUbuntuを開き、以下のコマンドを叩きます。

```console
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ sudo usermod -aG docker your-user
```

これだけで完了です。
念のためバージョンをチェックします。

```console
$ docker -v
```

###docker-composeをインストールする

[公式サイト]のLinux用の案内に従い、以下のコマンドを叩きます。

```console
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```

以上です。
バージョンチェックもしてみます。

```console
$ docker-compose --version
```

WSL1ではここまで完了したとしても、いざdocker-composeでコンテナを起動しようとするとコケてしまうようでした。
それはWSL1はネットワークまわりが不完全だったかららしいですが、WSL2ではそれが改善されているようです。

#おまけ：Laravel環境の導入

せっかくなのでdocker-composeでLaraDockを立ち上げてみます。
こちらはメイントピックから外れるので詳細は記しません。
以下の記事を参考にインストールを行いました。

- [LaradockでLaravel環境構築【手順書】](https://qiita.com/harukei/items/b103861b75b69d706805)
- [Laradockによるlaravel開発環境構築](https://qiita.com/ky0he11218/items/fd93395bfc2fc75a5e07)

デーモンとコンテナを起動すると、無事に[localhost](http://localhost)からウェルカムページを見ることができました。
docker-composeもlocalhostもきちんと生きていますね！

```
$ sudo /etc/init.d/docker start
$ docker-compose up -d workspace nginx mysql
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533571/c63c7376-e7df-4b59-74b4-b6e7637f3a04.png)

#まとめ

VMを立てることなくWindows 10 HomeのWSL2でLinuxを動かしdocker-composeを使うことができました。

WSL2を使うにはWindows Insider Programへの参加が必要でしたが、今回用いた`WSL2`以外にも`Windows 10 Pro + Hyper-V`や`Docker for Windows`でDockerを動かすことができるようなので、要件に合わせて使い分けたいですね。

##参考

- [Windows10 HomeでLinuxに寄せた開発環境を整える](https://qiita.com/v2okimochi/items/c9da7df8d4f03283121b)
- [Windows 10でLinuxを使う！正式機能になったWSLの導入方法](https://www.ask-mswin.com/win10-wsl/)
- [Windows10にWSLで作った環境にdockerをインストールするまで](https://www.suzu6.net/posts/129-docker-compose-at-ubuntu/)
- [WSLで「普通」にDockerが動くようになっていた話(しかしdocker-composeは動かない)](https://gdgd-shinoyu.hatenablog.com/entry/2018/07/10/032023)
- [Linuxがほぼそのまま動くようになった「WSL2」のネットワーク機能](https://www.atmarkit.co.jp/ait/articles/1909/09/news020.html)

---
明日は@iNakamuraくんが自然言語処理について書いてくれるようです。お楽しみに！