WSL(Bash on Windows)でDockerを使用する

この記事はWSL(Bash on Windows)上でDockerを使用するための手順です。

# 動作環境
- Windows 10 Pro (Docker for WindowsはHyper-V必須)
- Docker for Windows Stable v17.03 
- WSL(Bash on Windows): Creator Update以降
- WSL上のdocker: 17.03以降

WSL, Docker関連のバージョンはこれよりも低くても動作するかもしれませんが、***Windows 10についてはProfessinal版を使用しないとDocker for Windowsを利用できないため注意してください***。これはDocker for WindowsではHyper-Vを使用する前提があり、Hyper-VはWindows10 Professinal版でしか利用できないためです。

ということで、仮想環境、コンテナ技術をWindows上使いたい場合は、Windows10のエディションはHyper-V対応のProfessional版にすることをお勧めします。

# 完成イメージ
WSL上のDockerクライアントから、Docker for Windowsのデーモンにアクセスします。本当はWSL上のDockerデーモンを使うことができれば簡単なのですが、残念ながら今のところはWSLで対応する予定はありません。

![docker-on-wsl_Fotor.png](https://qiita-image-store.s3.amazonaws.com/0/174502/34ed37b9-bacd-1a70-272c-0e40c2b59ba5.png)

# 導入および設定

## Docker for Windowsのインストールおよび設定
1. Docker for Windowsをインストールします([こちらから](https://docs.docker.com/docker-for-windows/install/#download-docker-for-windows))。Stabe/EdgeのどちらもOKです。
2. インストール後、Docker for Windowsを起動します。
3. Setting画面からGeneralタブを開き、`Expose daemon on tcp://localhost:2375 without TLS`にチェックを入れる。
![docker-for-windows-setting.png](https://qiita-image-store.s3.amazonaws.com/0/174502/8d956204-b360-023b-8b9f-7ecf98b17820.png)



これで導入および設定完了です。
なお、上記 `Expose daemon on tcp://localhost:2375 without TLS` オプションはセキュリティ面のリスクが高くなるため注意する必要があります。より安全な設定にしたい場合はTLS設定を前提にした記事を検索してください。

## WSL上のDockerインストール
次にWSL上でdockerクライアントをインストールと設定を行います。（注釈：厳密にはクライアントとデーモンの両方がインストールされますが、前述した通りWSL上ではDockerのデーモンは動作しません）
既にWSLが導入済みであることを前提とします。
手順は[公式サイトの内容](https://docs.docker.com/engine/installation/linux/ubuntu/)をそのまま記載しています。

```bash
# 事前パッケージインストール
sudo apt-get install \
    apt-transport-https  ca-certificates curl \
    software-properties-common

# Docker公式のGPG鍵を追加,確認
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88

# Dockerレポジトリを追加 (Stableチャンネルのレポジトリ)
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# Dockerインストール (Communityエディション)
sudo apt-get update
sudo apt-get install docker-ce
```

これでインストール作業は完了となります。


## WSL上のDocker設定
Docker for Windowsのデーモンに接続するための設定を行います。
以下のようにDockerクライアントがDocker for Windowsのデーモンのホストを環境変数として設定します。

  ```bash
  echo "export DOCKER_HOST='tcp://0.0.0.0:2375'" >> ~/.bashrc
  source ~/.bashrc
  ```

`docker version`を実行し、ClientおよびServerの両方のバージョン情報が表示されることを確認します。
確認ができたら設定完了です。WSL上のDockerクライアントからpull, build, runなどを実行できるようになります。

```
$ docker version 
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 17:14:09 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Fri Mar 24 00:00:50 2017
 OS/Arch:      linux/amd64
 Experimental: true
```

なお `Server:` のメッセージ出力で下記メッセージが表示されいる場合は、DockerクライアントがDockerデーモンに接続できてない状態です。Docker for Windows側の `Expose daemon on tcp://localhost:2375 without TLS` オプションが有効になっていない可能性が高いです。

```
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. 
Is the docker daemon running?

```

# 留意事項
Docker for WindowsのためHyper-Vを利用すると、VirtualBoxを使用できなくなります。このためVirualBoxの利用が必須の方は、素直に仮想マシン上のLinuxでDockerを使用した方がよいでしょう。