Windows Subsystem for Linux + Docker for Windows を使えるようにするまでメモ


参考 URL

- [“Windows Subsystem for Linuxとは？ そのインストールと使い方 - Build Insider”](https://www.buildinsider.net/enterprise/wsl/01)
- [“Docker for Windowsで快適な環境を得るまでの そこそこ長い闘い - Qiita”](https://qiita.com/YukiMiyatake/items/73c7d6c4f2c9739ebe60)


## Win10 で Windows Subsystem for Linux

1. 「Windows 10 Fall Creators Update」の更新を充てる
2. 管理者モードでPowerShellウィンドウを起動して以下のコマンドを実行する（実行後、再起動が要求されると解説されていたがされなかった）

    ```
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    ```

3. 「Microsoft Store」から "Windows Subsystem for linux" で検索してディストリビューションを見つける
4. ディストリビューションを「入手」でインストールする
5. この 「Ubuntu」を起動すると実際の WSL へのインストールが行われ、Ubuntu のプロンプトウィンドウが起動する

    ![スクリーンショット 2018-01-25 10.13.24.png](https://qiita-image-store.s3.amazonaws.com/0/36566/ff49f4ba-ca91-79cb-0e1f-525fe355fd3a.png "スクリーンショット 2018-01-25 10.13.24.png")
    ユーザー名とパスワードを入力して、作業ユーザーを作成してセットアップ完了する

### 注意点

どうも「Windows 10 Fall Creators Update」をインストールすると、MS 謹製の sshd がインストールされ勝手に（Windows のサービスとして）起動する状態になる様なので注意。

- [“Windows10 Anniversary updateで知らぬ間にSSHdが起動している : やすひでぶろぐ”](http://yasuhide.blog.jp/archives/48155574.html)

殺しておかないと、VirtualBox や WSL 側の sshd に入れないのでハマる。

デフォルトでパスワード認証設定の様なのでセキュリティー的にも好ましくない。

## Docker

Docker for Windows のインストール方法は省略する。

Ubuntu への Docker のインストール方法は公式のインストール方法を参照。

- [“Get Docker CE for Ubuntu | Docker Documentation”](https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/)

現時点では参考URL [“Docker for Windowsで快適な環境を得るまでの そこそこ長い闘い - Qiita”](https://qiita.com/YukiMiyatake/items/73c7d6c4f2c9739ebe60) の「Bash on WindowsでDockerのインストール」の内容と同じ。

古い Docker がインストール済みの場合削除しておく必要があるので注意

#### 準備

`apt` パッケージインデックスの更新

```bash
$ sudo apt-get update
```

`apt` が HTTPS を通してパッケージをインストール出来るようにする

```bash
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
```

Docker の公式 GPG キーを追加する

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

GPG キーの目視ベリファイ（`DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88`）

```bash
$ sudo apt-key fingerprint 0EBFCD88

pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22
```

Docker の apt-get リポジトリを `stable` リポジトリとしてセットアップする

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

#### Docker CE のインストール

`apt`のパッケージインデックスを更新する。（ Docker の apt リポジトリをセットしたので）

```bash
$ sudo apt-get update
```

インストール

```bash
$ sudo apt-get install docker-ce
```


バージョンを指定する場合は以下のコマンドで利用可能なバージョンを確認して

```bash
$ apt-cache madison docker-ce
```

バージョン指定インストール

```bash
$ sudo apt-get install docker-ce=<VERSION>
```

Hellow World テスト

```bash
$ sudo docker run hello-world
```

→ この段階では動かない

### Docker for Windows との協調設定

以下二項の設定を行う事により、 WSL 側 Docker クライアントが Win 側の Docker engine を使用する様になってくれる模様。

#### Ubuntu on WSL

`~/.bashrc` に以下を書き込んでおく

```bash
export DOCKER_HOST='tcp://0.0.0.0:2375'
```

#### Docker for Windows の設定

- 「Settings」 の 「General」 で「Expose daemon on tcp://localhost:2375 without TLS」にチェックする
- 「Shared Drives」で WSL にマウントするボリュームをチェックする

## パーミッションの問題

WSL + Ubuntu では自動的に `C` ドライブを `/mnt/c` にマウントしてくれる。

_※ `etc/fstab` などに記述されているわけではないので VirtualBox の自動マウントのような仕組みと思われる。_

### /mnt/c の制約

- パーミッション・オーナーが root:root の 0777
- パーミッション変更不可


Virtual Box + Ubuntu のボリュームマウントの制約と同じで意味が無い

### じゃあどうするか

- [“WSL その84 - リムーバブルディスクやネットワーク上のボリュームなど様々なボリュームがマウント可能に - kledgeb”](https://kledgeb.blogspot.jp/2017/04/wsl-84.html)

によれば普通に mount コマンドでマウントできると書かれているので、任意のディレクトリを任意のパーミッションでマウントできるかやってみる。

```bash
$ sudo mount -t drvfs -o uid=tettekete,gid=tettekete C:\Users\tettekete\wsl_share /mnt/wsl_share
mount: wrong fs type, bad option, bad superblock on C:\Users\tettekete\wsl_share,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.
```

→ ディレクトリをマウントすることはできない（ドライブ単位でしか出来ない模様）

### samba という選択

Win 側ディレクトリを好きなパーミッションでマウントできないなら WSL 側ディレクトリを共有すればいいじゃない、

- [“Samba file server running inside Bash on Windows”](https://www.samba.org/~garming/)

と Samba の中の人も考えたらしい。

が、これ以上のキメラ環境は精神衛生上好ましくないのでおとなしく Docker for mac を使った方が良い気がする。