Windows 10 HomeでWSL越しにDocker for Ubuntu+Re:VIEWを使う（VM不要）

# 概要

Windows 10 April Update 2018（10.0.17134）以降の環境において、「Windows Subsystem for Linux」と「Docker for Ubuntu」、「Re:VIEW image for Docker」の組み合わせが動作するようになったようです（※**Docker for WindowsとDocker Toolboxは使いません**。VM不要です）。その導入方法を紹介します。

なお、当方のレベルは「Dockerは使ったことなかった」です。なのでDockerを初めて使う人向け、です。

## スタートとゴール

「Windows Subsystem for Linux未導入」の状態からスタートして、「WSL上でreviewコマンドを実行できるようになる」ことをゴールとします。

## 必要なもの
* 2018年4月以降のアップデートを適用した**Microsoft Windows 10**環境。
  * Windows 10 **Home**エディション（Hyper-V無し）の環境で動作確認しました。
  * Windows 10 April Update 2018（10.0.17134）以降の環境と対象とします。
* ストレージ内に最低でも**3.2GB以上の空き領域**。
  * Windows Subsystem for Linuxをインストールすると1.10GB使用します。
  * Re:VIEW image for Dockerをインストールすると2.03GBを使用します(Re:VIEW 2.5)。
  * このほかにドキュメント自体などを収納するための空き領域も必要です。

## 動作時の負荷について

* WSL利用時のメモリ利用量は0.1GB程度です。

## 完了まで全体像

以下の操作を行います。ネットワーク回線の速度に依存しますが、10～30Mbpsの下り速度の環境で「1.」を30分くらい、「2.」と「3.」を30分くらい、合計１ｈと少しで完了できます。

1. Windows Subsystem for Linux (Ubuntu)のセットアップ
2. Docker のセットアップ
3. Re:VIEW image for Dockerの取得

# Windows Subsystem for Linux のセットアップ

**Windows Subsystem for Linux**（以下、WSLと呼称）は、Windows 10 April Update 2018の適用環境では、以下の操作でセットアップできます。WSLではUbuntu16.04ディストリビューションを利用します。

## WSLの機能を有効化

以下の操作で、WSLを有効化します。

1. スタートメニューの「設定」から「アプリと機能」を開く。
![スクリーンショット 2018-07-22 01.07.44-a.png](https://qiita-image-store.s3.amazonaws.com/0/125588/79cd284c-3a36-4e97-9960-c7ac6fe3a64e.png)

2. 下の方へスクロールして「関連設定」の「プログラムと機能」を開く。
![スクリーンショット 2018-07-21 09.23.03-a.png](https://qiita-image-store.s3.amazonaws.com/0/125588/c00c7397-4d94-a5f9-2450-289a83f6a346.png)

3. 「Windowsの機能の有効化または無効化」を開く。
4. 「Windows Subsystem for Linux」にチェックを入れる。
![スクリーンショット 2018-07-21 09.23.25.png](https://qiita-image-store.s3.amazonaws.com/0/125588/33cdda23-d738-22c4-fe2a-1d0e4826889f.png)

5. WSLのインストールが始まるので、終了したら「今すぐ再起動」をクリックして再起動する。

※WSLの有効化自体はすぐ終わります。再起動時の追加処理もほぼありません。



## Ubuntu 16.04のインストール

つづいて、WSL環境の上で実際に動作するLinuxディストリビューションアプリをインストールします。「Ubuntu 16.04」を取得します。具体的には以下の操作を行います。

1. 再起動後、スタートメニューから「Microsoft Store」を選択し、検索ボックスに「Ubuntu」を入力して「Ubuntu 16.04」を選択する。
![スクリーンショット 2018-07-21 09.30.46-a.png](https://qiita-image-store.s3.amazonaws.com/0/125588/d8d68126-ea4d-58ba-41a3-1b8c4ae9bf17.png)

2. 「入手」ボタンをクリックして（ダウンロード＆）インストールする。
![スクリーンショット 2018-07-21 09.31.09.png](https://qiita-image-store.s3.amazonaws.com/0/125588/79be43c2-5519-5d8a-19c5-2f43f0547214.png)

3. インストールが完了すると、初期設定としてユーザー名とパスワードを聞いてくるので、Linux（Ubuntu）上で利用するユーザー名とパスワードを入力する。
![スクリーンショット 2018-07-21 09.37.05-a.png](https://qiita-image-store.s3.amazonaws.com/0/125588/32f800d3-2b88-4a89-cb3f-f4b087e6c558.png)

4. 初期設定が完了すると、Ubuntu on WSLのコマンドプロンプト（ターミナル）が表示される。
![スクリーンショット 2018-07-21 09.37.43-a.png](https://qiita-image-store.s3.amazonaws.com/0/125588/6c77e409-7d2b-9a70-d616-dc15abb9d955.png)


以上で、Docker for UbuntuをインストールするためのWSL側のセットアップが完了しました。

# Dockerのセットアップ

Ubuntu on WSL環境に対して、以下の手順でDocker for Ubuntu をインストールします。

Ubuntu on WSLを管理者権限で起動します。開いたUbunutのコマンドライン上から以下のコマンドを実行します。初回のsudo実行時は、パスワードを要求されるので、先ほどの「Ubuntuの初期設定」で設定したパスワード入れます。

```sh
sudo apt update
sudo apt upgrade
sudo apt install docker.io
sudo cgroupfs-mount
sudo usermod -aG docker $USER
sudo service docker start
```

![スクリーンショット 2018-07-21 09.53.30.png](https://qiita-image-store.s3.amazonaws.com/0/125588/98591188-264a-47fa-bbe0-9cb923ee0e43.png)

![スクリーンショット 2018-07-21 10.05.02.png](https://qiita-image-store.s3.amazonaws.com/0/125588/accbcd05-d600-c219-b2f0-3de4415bfef9.png)


dockerがインストールされ、デーモン (daemon)が起動します。本設定は初回のみ実施し、2回目以降は必要ありません。2回目以降の動作に準拠するため、一旦「exit」でUbuntu on WSLを終了します。

2回目以降は、以下の操作でDockerデーモンを起動します。
1. Ubuntu on WSLを管理者権限で起動する。
2. Ubuntuのコマンドライン（ターミナル）上で、以下のコマンド実行する。

```
sudo cgroupfs-mount && sudo service docker start
```

dockder が正しくセットアップされたの確認のため、Hello Worldのイメージを起動してみます。以降のdockerコマンドではsudoは不要です。

```sh
docker run hello-world
```

![スクリーンショット 2018-07-21 10.11.17-hello-docker.png](https://qiita-image-store.s3.amazonaws.com/0/125588/93c3149d-226d-db55-89ac-1d34994c309a.png)

「Hello from Docker!」が表示されれば成功です。


## Re:VIEW image for Dockerの取得と実行

続いて、Re:VIEW image for Dockerの取得します。
以下のリポジトリで公開されているので、こちらを利用します。
https://github.com/vvakame/docker-review

3.0は「preview」とのことなので、2.5を選択します。
具体的には、上述の「Ubuntu on WSL上でDockerデーモンを起動した」状態で、以下のコマンドを実行します。

```sh
sudo docker pull vvakame/review:2.5
```

イメージのダウンロードが終わるのを待ちます。

![スクリーンショット 2018-07-21 10.50.34-review-docker.png](https://qiita-image-store.s3.amazonaws.com/0/125588/8fa034c9-463f-4cf0-30ed-01f8ec910931.png)


ダウンロードが終わりましたら、以下の操作を行います。

1. 作成するReviewのドキュメントを格納するフォルダを作成（ここでは仮にDドライブのルートに「repo-doc」とします）。
2. dockerイメージを起動してreview環境に入る。
3. reviewのサンプルファイルを作成してビルドする。

具体的には以下のコマンドを実行します。
(※Windows側のドライブは、WSL上からは「/mnt/」配下に参照できます)

```
$ mkdir /mnt/d/repo-doc
$ docker run -v /mnt/d/repo-doc:/work -it vvakame/review:2.5 /bin/sh
# cd /work
# review-init review-sample
# cd review-sample
# review-pdfmaker config.yml
# exit
$ exit
```

ここで、「$」マークの行はWSL上のコマンドラインを意味します。「#」マークの行は、docker上のコマンドラインを意味します（※実行時には、「＄」も「＃」も入力しません）。

「`docker run -v /mnt/d/repo-doc:/work -it vvakame/review:2.5 /bin/sh`」コマンドは、
以下を行うコマンドです。

1. 「Re:VIEW image for Docker」を起動する。
2. Windows側のDドライブのルートの「repo-doc」フォルダを、docker側のルートの「work」フォルダとしてマウントする。
3. Dockerのコマンドラインに入る。

Docker側のコマンドラインも、WSLのコマンドラインも、「exit」コマンドで抜けることができます。

Windows上のDドライブのルートにある「repo-doc」フォルダの中に、「review-sample」というフォルダが作成され、フォルダ内に「book.pdf」ファイルが生成されていることを確認してください。このpefファイルが、「review-sample」のReviewドキュメントから作成されたpdfです。

以上で、Ubuntu on WSL上にUbuntus for Dockerをセットアップして、「Re:VIEW image for Docker」を用いてreviewのコンパイルを実行する環境構築が完了しました。

# 普段のReviewコンパイルについて

## 起動時にDockerデーモンを起動しておく

「Dockerデーモン」の起動は、Windowsの起動毎に実行する必要があります。一度起動すると、次にWindowsをシャットダウンするまでは動き続けてくれます(正確には、ログイン後に1度。ログオフするまで有効。サインアウトしてサインインする＝セッションとしてはログインしたままの操作の範囲では、Dockerデーモンは起動し続けてくれます）。

「Dockerデーモン」の起動方法は先ほどと同様です。起動したら、WSLの画面は閉じてしまって構いません。

1. Ubuntu on WSLを**管理者権限で**起動する。
2. Ubuntuのコマンドライン（ターミナル）上で、以下のコマンド実行する。

```
sudo cgroupfs-mount && sudo service docker start
```

## 容易なReviewのコンパイル実行方法

実際のWindows上での利用方法としては、以下のようになると思います。

1. 任意のエディタ（Visual Studio Codeとか）でReviewファイルを作成する。
2. 作成したReviewファイルを、**reviewコマンドでpdfへコンパイル**する。

一般的なreviewファイルは、以下の様なフォルダ構造で作成すると思います。

```
ドキュメントのフォルダ
　＋articles
　　＋実際のreview.reファイル
    ＋config.yml
    ＋catalog.yml
```

「2.」の「reviewコマンド」を実行する際には、Ubuntu on WSLを通常モードで起動します（**管理者権限は不要**、という意味です）。WSLコマンドライン（ターミナル）上で「ドキュメントのフォルダ」まで移動しておきます（`cd /mnt/d/～`）。「ls」コマンドで「articles」が見えている状態です。この状態であれば、コンパイルの操作「`review-pdfmaker`」はWSL上から以下の**コマンド一行で実行**することができます。

```
docker run --rm -v `pwd`/articles:/work vvakame/review:2.5 /bin/sh -c "cd /work && review-pdfmaker config.yml"
```

上記のコマンドは、以下を纏めて実行しています。

1. dockerイメージを起動（生成）：run
2. カレントフォルダの直下にあるarticlesフォルダを、docker上のルートのworkフォルダとしてマウント：-v
3. docker起動後に、「workフォルダへ移動、reviewコンパイル」を実行：/bin/sh -c
4. dockerイメージを終了（破棄）：-rm


以上で、**仮想マシンなどを立ち上げることなく、Windows上からreviewコマンドのpdfコンパイルを簡単に実行**できるようになります♪


# 補足

## Microsoft Storeで「Linux」ではなく、「Ubuntu」で検索する理由

Storeで「Linux」で検索すると、以下の画面が表示されます。
![スクリーンショット 2018-07-21 09.27.58.png](https://qiita-image-store.s3.amazonaws.com/0/125588/7d827ef1-b25f-c867-b4bc-b152ef371785.png)

ここで、「アプリを入手する」ボタンを押すと、以下の画面が表示されます。
こちらのUbuntuを選んでも、現在（2018/7/22）はバージョンが「16.04」で同一なので問題ありません。しかし、今後にUbuntuのバージョンが上がった倍には、DockerがWSL上では動作しない可能性があります。その面倒を避けるため、「Ubuntu」のキーワードで検索して、動作実績のある「Ubunt16.04」を明確に選択した方が良いと思われます。

![スクリーンショット 2018-07-21 09.27.59.png](https://qiita-image-store.s3.amazonaws.com/0/125588/fa59b4f7-ed4e-55d0-62e1-21b67b1f4169.png)

## 最新のdocker-ceではなく、docker.ioを入れる。

Docker for Ubuntuのページでは、インストール方法として以下のコマンドが示されている。

```sh
sudo apt-get install docker-ce
```

`docker-cd` が最新版(18.xx)で、`docker.io` は旧版（17.xx）らしい。
https://stackoverflow.com/questions/45023363/what-is-docker-io-in-relation-to-docker-ce-and-docker-ee
> > What is docker.io in relation to docker-ce and docker-ee?
> 
> Older versions of Docker were called docker or docker-engine or docker.io

ただし、現時点のWSL上では「docker-ceは動かない（docker.ioは動く）」とのこと。なので、現時点のWSLでは「docker.io」を入れる必要がある。
https://www.reddit.com/r/bashonubuntuonwindows/comments/8cvr27/docker_is_running_natively_on_wsl/
> when I install the docker-ce and run it, it gave me: docker: failed to register layer: Error processing tar file(exit status 1): invalid argument.

https://github.com/Microsoft/WSL/issues/2291#issuecomment-383698720
> The last docker-ce version that works right now on WSL is 17.09.0. Anything after that fails on extracting the docker images.

その後（2020年2月より後のどこか？）、上記の「`docker.io`」指定でもNGになったようだ。より明示的にバージョン指定してインストールする方法は「[Ubuntu 16.04のインストール](https://qiita.com/hoshimado/items/7592cee28c1bde545b78#docker-for-ubuntu-on-wsl%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)」に追記した。at 2020-05-02


# 動作検証した環境（2019/07/22）

* Windows Home 10 
  * Windows 10 April Update 2018（10.0.17134）

* Ubuntu

```sh
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.5 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.5 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
```

* Docker 17.03.2-ce

```sh
$ docker version
Client:
 Version:      17.03.2-ce
 API version:  1.27
 Go version:   go1.6.2
 Git commit:   f5ec1e2
 Built:        Thu Jul  5 23:07:48 2018
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.2-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.6.2
 Git commit:   f5ec1e2
 Built:        Thu Jul  5 23:07:48 2018
 OS/Arch:      linux/amd64
 Experimental: false
```

# 参考サイトなど

Windows 10でLinuxプログラムを利用可能にするWSL（Windows Subsystem for Linux）をインストールする（バージョン1803対応版）
http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html

WSL（Windows Subsystem for Linux）を使ってみた
https://qiita.com/Brutus/items/f26af71d3cc6f50d1640

＠mattn_jp: Windows 10 Home Edition でも WSL から docker 動いちゃった。最高かよ。
https://twitter.com/mattn_jp/status/1015993682594488320

Windows10 Home の WSL で Docker を使う
https://qiita.com/kogaH/items/534560dd1e4004e80df4

Reddit : docker is running natively on wsl
https://www.reddit.com/r/bashonubuntuonwindows/comments/8cvr27/docker_is_running_natively_on_wsl/

vvakame_docker-review  Re VIEW build container by docker
https://github.com/vvakame/docker-review

WSL vs VM for 開発作業
https://qiita.com/satoru_takeuchi/items/a54812806bba0eb48f02

docker コマンド チートシート
https://qiita.com/voluntas/items/68c1fd04dd3d507d4083

マンガでわかるDocker_技術書典4_電子版
https://booth.pm/ja/items/825879