Windows Subsystem for LinuxからDockerを使う

Bash on WindowsことWSLはUbuntuの強力な開発ツールチェインをWindows10で利用できるとてもイカした仕組みです。
以前、こんな記事も書きました。

- [Windows Subsystem for Linux ＋ Cmderで最強のCLI環境を作る](http://qiita.com/koduki/items/ab68b917b8dbc7d51af0)

ただ、Docker動かないのは不便だなーと思ってたのですが、試してみたらDocker Toolboxで立ち上げてるDockerに繋げることは出来ました。

手順はいたって簡単で下記の通り。
1 WSLにDockerをインストール

```bash
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
sudo apt-get install docker-ce
```

2 Windows上のDockerMachineでboot2dockerを立ち上げる

```bash
                       ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
$ docker-machine.exe config
--tlsverify
--tlscacert="C:\\Users\\koduki\\.docker\\machine\\certs\\ca.pem"
--tlscert="C:\\Users\\koduki\\.docker\\machine\\certs\\cert.pem"
--tlskey="C:\\Users\\koduki\\.docker\\machine\\certs\\key.pem"
-H=tcp://192.168.99.100:2376
```
3 WSLでDOCKER_HOSTとTSLの設定を指定して起動

```bash
% docker -H tcp://192.168.99.100:2376 --tlsverify \
--tlscacert /mnt/c/Users/$USER/.docker/machine/machines/default/ca.pem \
--tlscert /mnt/c/Users/$USER/.docker/machine/machines/default/cert.pem \
--tlskey /mnt/c/Users/$USER/.docker/machine/machines/default/key.pem \
ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

これだけです。実に簡単ですね。

実は前にもネットワーク的には繋がるからWindows側からつながるんじゃね？ と普通に

```bash
export DOCKER_HOST=tcp://192.168.99.100:2376
export DOCKER_MACHINE_NAME=default
export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=$HOME/.docker/machine/machines/default/
```

としてたのですが、何故か下記のようにローカルのデーモンを見に行ってエラーになるので放置してました。

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

今回は直接オプションで指定したのでうまく動いてるようです。
とはいえ、毎回このように書くのは長すぎるので下記のようにaliasに追加するが吉。

```bash
alias docker="docker -H tcp://192.168.99.100:2376 --tlsverify --tlscacert /home/$USER/.docker/machine/machines/default/ca.pem --tlscert /home/$USER/.docker/machine/machines/default/cert.pem --tlskey /home/$USER/.docker/machine/certs/key.pem"
```

これで普通のDockerコマンドと同様に使えます。

ちなみにdocker-machineもgenerics-driverを使う事でSSH経由で指定が可能です。

```bash
$ docker-machine create --driver generic \ 
--generic-ssh-user docker --generic-ip-address=192.168.99.100 \
--generic-ssh-key /mnt/c/Users/$USER/.docker/machine/machines/default/id_rsa 
default
```

ただ、TSLエラーになるので解決するには`docker-machine regenerate-certs`を使う必要があります。
それをすると今度はWindows側でアクセスできなくなって不便なので、まあDockerMchineの事はWindows側に任せるのが良い気がします。

まとめ
=====

これでWindowsでも快適なBash/Dockerライフが満喫できそうです。
それWindowsじゃなくて良くね？ と聞こえてきそうですが聞こえなーい。

それではHappy Hacking!

参考
=======

- [Docker on Bash on Ubuntu on Windows10 は動かない](http://qiita.com/tbuchi888/items/e5f422c51e0c8f2267e0)
- [Cannot connect to the Docker daemon. Is 'docker -d' running on this host?](https://github.com/docker/kitematic/issues/1010)