Windows10 HomeとWSL2でdocker-composeができるようにする


# はじめに
タイトルにあるとおりですが```Docker Toolbox```や```VirtualBox```を使わないで、docker-composeを使えるようにします。
Windows10 Homeでは```Hyper-V```が動かないため```Docker for Windows```を利用する事はできません。
そのため```VirtualBox``` ＋ ```vagrant```を使って構築していましたが、```WSL```を試したところDockerを動かすことができました。
ですが、docker-composeは動かなかったため、今回```WSL2```に切り替えてみました。

# ゴール
- Windows10 Homeで```Docker Toolbox```や```VirtualBox```を使わずに```WSL2```を利用してdocker-composeできるようにする。
 - Windows10 Proでは仮想環境```Hyper-V``` + ```Docker For Desktop```の組み合わせでdocker-composeが使えます。

# 今回インストールした環境
- Windows10 Home 64bit
- Build Version: 18999.1 (アップデート後)
 - WindowsOSビルドのバージョンは作業前は上記ではなかったのですが```Windows Insider Program```で設定を行い、Windows Updateしています
- WSL (Windows Subsystem for Linux) ：2
 - LinuxOS：Ubuntu18.04

# WSLを有効にしておきます
WSLはデフォルトで無効になっています。


1.コマンドラインからPowerShellを管理者権限で実行して、下記のコマンドを入力します。

```:PowerShell
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
```

下記のように表示されます。

```:PowerShell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6
PS C:\WINDOWS\system32> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

Path          :
Online        : True
RestartNeeded : False
```

2.アプリと機能　＞　プログラムと機能　＞　Windowsの機能の有効化または無効化

```Windows Sybsystems for Linux```にチェックを入れます。
（下の図で、赤い枠が囲われている部分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501225/6d8ac07e-a551-56ed-8a76-75aadc278da5.png)


3.Windowsを再起動します。


# LinuxOSを確認
PowerShellを管理者権限で実行して、下記のコマンドを入力

```wsl -l -v```
下記のように```Legacy```という文字や、
スタートメニュー　＞　最近追加されたもの　に```Bash on Ubuntu on Windows```が表示されているかもしれません。

```:PowerShell
PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
* Legacy          Stopped         1
```

WindowsでWSLを利用する準備ができました。

# WSL2を利用するためにWindows Updateを行います
※この作業に時間がかかりました。

- コマンドプロンプトに```winver```と入力するとWindowsのバージョン情報が確認できます。
 - OSビルドのバージョンを確認してもしなくても良いです。
（バージョンが18917以降であれば良いらしい）

- OSビルドのバージョンをあげるにはWindows Insider Programで設定を行いましょう。
 - 設定　＞　更新とセキュリティ　＞　```Windows Insider Program```


# Microsoft StoreでUbuntu18.04をインストール
- WSLを有効化と、OSビルドのバージョンアップ後

Microsoft Storeで```Ubuntu18```と検索すると、複数のUbuntuが表示されるので、Ubuntu18.04を選択します。
好みのバージョンをインストールして良いかと思われます、筆者はこれにしました。

- 起動します

インストールが完了すると、起動を求められのでターミナルが表示されます。
Ubuntu側でインストールを行う、ユーザー名の作成とパスワードを設定します。

スタートメニュー　＞　最近追加されたものに```Ubuntu18.04 TLS```が表示されています。

※もし上記のタイミングでターミナルを起動しなかった（ユーザーを作成していない）場合でも、別途Ubuntu18.04起動後はroot権限で立ち上がりますので、adduserコマンドによりユーザーを作成してください。
また、デフォルトで起動した際のユーザーを変更するにはPowerShellより変えられます。

```:PowerShell
ubuntu config --default-user ユーザー名
```

# LinuxOSを確認する
下記のコマンドを入力
```wsl -l -v```

```:PowerShell
PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
  Ubuntu-18.04    Running         1
* Legacy          Stopped         1
```

# WSL2へ切り替える
```wsl --set-version <使いたいLinux名> 2```
下記のコマンドを入力
```wsl --set-version Ubuntu-18.04 2```

```:PowerShell
PS C:\WINDOWS\system32> wsl --set-version Ubuntu-18.04 2
```

数分待った後に変換が完了します。
Windows10 HomeとWSL2のセットアップが完了しました。
Windowsマシンの再起動を行った後にDockerのインストールをはじめます。

# ディストリビューションの切り替え
```:PowerShell
PS C:\WINDOWS\system32> wsl -s Ubuntu18.04
```

下記のコマンドを入力
```wsl -l -v```

```:PowerShell
PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         2
  Legacy          Stopped         1
```
デフォルトのディストリビューションが切り替わりました。

# Ubuntu18.04のターミナルを開きます
スタートメニュー　＞　```Ubuntu18.04 TLS```

# WSL用にWindowsのディレクトリが自動的にマウントされる
Cドライブの場合、自動でこのようにマウントされています```/mnt/c```
例： ```/mnt/c/Users/ユーザー名/```

# aptパッケージ更新

```:Ubuntu18.04
$ sudo apt update
$ sudo apt upgrade -y
```

# 依存パッケージのインストール

```:Ubuntu18.04
$ sudo apt install -y apt-transport-https ca-certificates gnupg-agent software-properties-common curl
```

# GPG keyを追加

```:Ubuntu18.04
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

# 安定版repositoryを追加

```:Ubuntu18.04
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
```

# もう一度aptパッケージ更新

```:Ubuntu18.04
$ sudo apt update
```

# Docker CEをインストール

```:Ubuntu18.04
$ sudo sudo apt install docker-ce docker-ce-cli containerd.io docker-compose -y
```

# docker-compose インストール

docker-compose.ymlのversion3.4以上を使用する場合に最新を個別にインストールする

```:Ubuntu18.04
$ sudo curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/bin/docker-compose
$ sudo chmod +x /usr/bin/docker-compose
```

# Docker起動

```:Ubuntu18.04
$ sudo service docker start
```


# Dockerfileとdocker-compose.ymlを準備
ユーザー名の配下に下記のフォルダとファイルを用意しました。

```:フォルダ構成とファイル
docker
 └─ helloworld
    ├─ docker-compose.yml
    └─ helloworld.dockerfile
```

```:Ubuntu18.04
$ cd /mnt/c/Users/ユーザー名/docker/helloworld
```

Dockerfile

```helloworld.dockerfile
FROM alpine:3.4
```

docker-compose.yml

```docker-compose.yml
version: '3.7'

services:

  helloworld:
    build:
      context: .
      dockerfile: helloworld.dockerfile
    container_name: helloworld
    working_dir: /app/helloworld
    ports:
      - 80:80
    volumes:
      - .:/app/helloworld
    tty: true
```

# docker-composeコマンドで起動
```:Ubuntu18.04
$ sudo docker-compose up -d
Creating network "helloworld_default" with the default driver
Building hello-world
Step 1/1 : FROM alpine:3.4
3.4: Pulling from library/alpine
c1e54eec4b57: Pull complete
Status: Downloaded newer image for alpine:3.4
 ---> b7c5ffe56db7

Successfully built b7c5ffe56db7
Successfully tagged helloworld_helloworld:latest
WARNING: Image for service helloworld was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating helloworld ... done 
```

起動してくれました！

今回はWindows10 Homeの環境でWSL2を利用しました。

# おわりに
この記事ではsudoを付加してdockerコマンドを行っていますが、
一般ユーザをDockerグループに登録する事によりsudoは省略可能です。

しかし後述の「一般ユーザをDockerグループに登録せずに、非rootユーザで実行できるようにする」にもあるとおり、セキュリティ重視から、~~sudoをする方法にしておきます~~（sudoは結局rootで動かしている）
Rootlessモードを利用できるように継続して調べてみます。

# 参考
いろいろなQiitaや記事を拝見させていだだき有難うございます。その中でも特に参考にさせていただきました。

- WSL2でdocker-composeを使えるようにするまで
 - [https://qiita.com/suaaa7/items/744f58319c04d9b6bfbe]( https://qiita.com/suaaa7/items/744f58319c04d9b6bfbe )

- WSL2のインストール方法【WindowsにLinuxを使う！】
 - [https://yukituna.com/2079/]( https://yukituna.com/2079/ )



# その他：一般ユーザをDockerグループに登録せずに、非rootユーザで実行できるようにする

参考： RootlessモードでDockerをより安全にする [DockerCon発表レポート]

- [https://medium.com/nttlabs/rootless-docker-12decb900fb9]( https://medium.com/nttlabs/rootless-docker-12decb900fb9 )

> Rootlessモードとは
Rootlessモードは、Dockerデーモン及びコンテナを、非rootユーザで実行する技術です。Rootlessモードを用いることにより、万一Dockerに脆弱性や設定ミスがあっても、攻撃者にホストのroot権限を奪取されることを防ぐことが出来ます。

> RootlessモードのDockerをインストールする
RootlessモードのDockerは， ```curl -fsSL https://get.docker.com/rootless | sh``` コマンド1行で、ユーザのホームディレクトリ内に簡単にインストールすることが出来ます。sudo は不要です。ただし、 /etc/subuid および /etc/subgid が事前に設定されている必要がありますが、最近のLinuxディストリビューションではユーザ作成時に自動的に設定されることが多いので、たいていは考慮不要です。

今回、Rootlessモードのコマンドを実行してみたのですが、エラーとなり断念しました。

```
$ curl -fsSL https://get.docker.com/rootless | sh
cat: /lib/modules/4.19.72-microsoft-standard/modules.builtin: No such file or directory
# Missing system requirements. Please run following commands to
# install the requirements and run this installer again.
# Alternatively iptables checks can be disabled with SKIP_IPTABLES=1

cat <<EOF | sudo sh -x

modprobe ip_tables
EOF
```

```
$ cat <<EOF | sudo sh -x
> modprobe ip_tables
> EOF
+ modprobe ip_tables
modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.19.72-microsoft-standard/modules.dep.bin'
modprobe: FATAL: Module ip_tables not found in directory /lib/modules/4.19.72-microsoft-standard
```

これ以上は調べても、解決策の情報にめぐり合わなかったため、覚えておくことにします。