Docker Machine を使って VirtualBox に Dockerホストを立てる


## 概要
Docker公式オーケストレーションツールの 1 つ Docker Machine を使って VirtualBox に Docker がインストールされた VM を作成し、`hello world` を出力するコンテナを走らせてみるという話

## 必要なもの

* VirtualBox 4.3.20 以上

## Hello World
`docker-machine ls` コマンドでDockerホストの一覧を出す。
（まだマシンを作成してないので何も出ない）

```
$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM
```

Dockerホストマシンを作るには、` docker-machine create`を使う。
`--driver`オプションに `virtualbox` を指定し、引数にマシン名 `dev` を渡す。

```
$ docker-machine create --driver virtualbox dev
INFO[0000] Creating CA: /Users/seigo/.docker/machine/certs/ca.pem
INFO[0000] Creating client certificate: /Users/seigo/.docker/machine/certs/cert.pem
INFO[0002] Downloading boot2docker.iso to /Users/seigo/.docker/machine/cache/boot2docker.iso...
INFO[0141] Creating SSH key...
INFO[0141] Creating VirtualBox VM...
INFO[0149] Starting VirtualBox VM...
INFO[0150] Waiting for VM to start...
INFO[0182] "dev" has been created and is now the active machine.
INFO[0182] To point your Docker client at it, run this in your shell: $(docker-machine env dev)
```

マシンリストを見てみる

```
$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM
dev    *        virtualbox   Running   tcp://192.168.99.100:2376
```

`ACTIVE` カラムの `*` は マシン `dev` がアクティブなホストであることを示している。
これまでのDockerであれば、リモートのDockerホストを使うには、`DOCKER_HOST`を指定して通信する。
`docker-machine env dev` コマンドで、ホストマシンのDocker Remote API のエンドポイントや、certファイルのパスが表示される。

```
$ docker-machine env dev
export DOCKER_TLS_VERIFY=yes
export DOCKER_CERT_PATH=/Users/seigo/.docker/machine/machines/dev
export DOCKER_HOST=tcp://192.168.99.100:2376
```

ここで表示される export コマンドを打ってもいいが、`docker-machine config` というコマンドも用意されていて、`docker` コマンドのオプションの形にしてくれる。

```
$ docker-machine config dev
--tls --tlscacert=/Users/seigo/.docker/machine/machines/dev/ca.pem --tlscert=/Users/seigo/.docker/machine/machines/dev/cert.pem --tlskey=/Users/seigo/.docker/machine/machines/dev/key.pem -H="tcp://192.168.99.100:2376"
```

これを利用して、`docker`コマンドを実行する

```
$ docker $(docker-machine config dev) ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

Hello World

```
$ docker $(docker-machine config dev) run busybox echo hello world
Unable to find image 'busybox' locally
511136ea3c5a: Pull complete
df7546f9f060: Pull complete
ea13149945cb: Pull complete
4986bf8c1536: Pull complete
busybox:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.

Status: Downloaded newer image for busybox:latest
hello world
```

マシンをストップしてみる

```
$ docker-machine stop dev
$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL   SWARM
dev    *        virtualbox   Stopped
```

ストップしたマシンをスタートしてみる

```
$ docker-machine start dev
INFO[0000] Waiting for VM to start...
$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM
dev    *        virtualbox   Running   tcp://192.168.99.100:2376
```

SSH ログイン

```
$ docker-machine ssh dev
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.5.0, build master : a66bce5 - Tue Feb 10 23:31:27 UTC 2015
Docker version 1.5.0, build a8a31ef
docker@dev:~$
```

SSH 経由でのコマンド実行

```
$ docker-machine ssh dev "hostname && uname -a"
dev
Linux dev 3.18.5-tinycore64 #1 SMP Sun Feb 1 06:02:30 UTC 2015 x86_64 GNU/Linux
```


マシンの削除

```
$ docker-machine rm dev
$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM
```

## REF

* [Docker Machine 公式ドキュメント](https://docs.docker.com/machine/)
* [Docker Machine リファレンス](http://qiita.com/spesnova/items/073dd64a8a1d580d9ae9)