Docker Machine リファレンス

## 概要
[2014年末の DockerCon EUで発表された公式のオーケストレーションツール Machine, Swarm, Compose](http://blog.docker.com/2014/12/announcing-docker-machine-swarm-and-compose-for-orchestrating-distributed-apps/) のうち **Machine** についてのまとめ。
2015年02月26日にダウンロード可能な最初のバージョンが出た

Machine を一言で説明するならば Docker ホストを作成、管理できるツール。


Swarm, Compose については以下参照

* [Docker Swarm リファレンス](http://qiita.com/spesnova/items/f4b5f7ee57c9271c9dbd)
* [Docker Compose リファレンス](http://qiita.com/spesnova/items/6e8919b34e763f27c34e)

## Machine とは
Machine は開発マシン、クラウド、データセンターに Docker ホストを簡単に作成できるツール。

machine ができること

* 軽量なホストマシンマネジメントツール
 * Dockerホストの作成
 * Dockerホストのスタート
 * Dockerホストのストップ
 * Dockerホストの削除
* SSH経由でのリモートコマンドの実行やログイン
* Dockerのバージョンアップグレード

2015年02月27日現在はベータ版という扱い

## インストール
### OSX x86_64
[GitHub リポジトリの releases](https://github.com/docker/machine/releases) から OSX x86_64 用のバイナリをダウンロードする

例: https://github.com/docker/machine/releases/download/v0.1.0/docker-machine_darwin-amd64


```
$ sudo mv ~/Downloads/docker-machine_darwin-amd64 /usr/bin/docker-machine
$ sudo chmod +x /usr/bin/docker-machine
$ docker-machine -v
docker-machine version 0.1.0
```

### Linux x86_64
[GitHub リポジトリの releases](https://github.com/docker/machine/releases) から Linux x86_64 用のバイナリをダウンロードする

例: https://github.com/docker/machine/releases/download/v0.1.0/docker-machine_linux-amd64

```
core@core-01 ~ $ wget https://github.com/docker/machine/releases/download/v0.1.0/docker-machine_linux-amd64
core@core-01 ~ $ sudo mv docker-machine_linux-amd64 /opt/bin/docker-machine
core@core-01 ~ $ sudo chmod +x /opt/bin/docker-machine
core@core-01 ~ $ docker-machine -v
docker-machine version 0.1.0
```

### Docker Container
DockerHubに公式イメージは置かれていないようだが、[`Dockerfile`](https://github.com/docker/machine/blob/master/Dockerfile) は存在する。が、Docker in Docker になって複雑になるのでやらないかな。

## Hello World
### VirtualBox
[Docker Machine を使って VirtualBox に Dockerホストを立てる](http://qiita.com/spesnova/items/038af6a8a4e401e3d2aa)

### DigitalOcean

[Docker Machine を使って DigitalOcean に Dockerホストを立てる](http://qiita.com/spesnova/items/c1a8b7c1a079834aed2d)

### EC2
[Docker Machine を使って EC2 に Dockerホストを立てる](http://qiita.com/spesnova/items/4d3738627997ce135deb)

## How It Works
`create` コマンドでは何が行われているのか

0. 作成する Docker ホストにアクセスするための SSH キーを作成 (e.g. `~/.docker/machine/machines/<MACHINE_NAME>/id_rsa`)
0. Docker のインストール
0. リモートからTLSで通信可能なよう設定して Docker Daemon を起動

証明書とかは `~/.docker/machine/certs` 以下にある

## ドライバを使わずに管理ホストを追加する
エンドポイントの URL だけを渡して管理ホストを追加することもできるので、
既に構築された Docker ホストを machine 管理化に追加することができる。

```
$ docker-machine create --url tcp://172.17.8.101:2375 core-01
INFO[0000] "core-01" has been created and is now the active machine.
INFO[0000] To point your Docker client at it, run this in your shell: $(docker-machine env core-01)
```

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

* TLS の準備は自分でやる必要がある
* ドライバなしのマシンには `docker-machine ssh` はできない

## サブコマンド
### active
アクティブなマシン（Dockerホスト）をセットする。

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

# アクティブなマシンを dev-02 にセット
$ eval "$(docker-machine env dev-02)"

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

アクティブなマシンについては、いくつかのサブコマンドでマシン名の指定を省略出来る

```
$ docker-machine ssh
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ 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-02:~$
```

### create
Docker ホストを作成する

```
$ docker-machine create --driver virtualbox dev
INFO[0000] Creating SSH key...
INFO[0000] Creating VirtualBox VM...
INFO[0007] Starting VirtualBox VM...
INFO[0007] Waiting for VM to start...
INFO[0038] "dev" has been created and is now the active machine. To point Docker at this machine, run: export DOCKER_HOST=$(docker-machine url) DOCKER_AUTH=identity
```

### config
Docker クライアント用の設定を表示する

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

こんな風に使う

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

### env
特定のマシンに対して `docker` コマンドを打つよう環境変数の設定をする。

```bash
# 始めは DOCKER 関連の環境変数はセットされていない
$ env | grep DOCKER

# env コマンドを実行すると環境変数を export する文が表示される
$ docker-machine env dev-01
export DOCKER_TLS_VERIFY=yes
export DOCKER_CERT_PATH=/Users/seigo/.docker/machine/machines/dev-01
export DOCKER_HOST=tcp://192.168.99.100:2376

# サブシェルで env コマンドを実行して環境変数をセットする
$ $(docker-machine env dev-01)

# 手元の Docker クライアントが dev-01 を向くよう環境変数がセットされた
$ env | grep DOCKER
DOCKER_HOST=tcp://192.168.99.100:2376
DOCKER_TLS_VERIFY=yes
DOCKER_CERT_PATH=/Users/seigo/.docker/machine/machines/dev-01

# dev-01 に対して docker コマンドを実行できる
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

# セットした DOCKER 関連の環境変数を unset する
$ $(docker-machine env -u)
$ env | grep DOCKER
```

### inspect
マシン情報を表示する

```
$ docker-machine inspect dev-01
{
    "DriverName": "virtualbox",
    "Driver": {
        "MachineName": "dev-01",
        "SSHPort": 54286,
        "Memory": 1024,
        "DiskSize": 20000,
        "Boot2DockerURL": "",
        "CaCertPath": "/Users/seigo/.docker/machine/certs/ca.pem",
        "PrivateKeyPath": "/Users/seigo/.docker/machine/certs/ca-key.pem",
        "SwarmMaster": false,
        "SwarmHost": "tcp://0.0.0.0:3376",
        "SwarmDiscovery": ""
    },
    "CaCertPath": "/Users/seigo/.docker/machine/certs/ca.pem",
    "ServerCertPath": "",
    "ServerKeyPath": "",
    "PrivateKeyPath": "/Users/seigo/.docker/machine/certs/ca-key.pem",
    "ClientCertPath": "",
    "SwarmMaster": false,
    "SwarmHost": "tcp://0.0.0.0:3376",
    "SwarmDiscovery": ""
}
```

### ip
マシンの IP アドレスを表示する

```
$ docker-machine ip dev-01
192.168.99.100
```

### kill
マシンを強制的にストップする

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

### ls
マシンの一覧を見る

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

### restart
マシンをリスタートする。
これは `docker-machine stop; machine start` と同等。

```
$ docker-machine restart dev-02
INFO[0005] Waiting for VM to start...
```

### rm
マシンを削除する

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

### ssh
マシンに SSH ログインまたは SSH 経由でコマンドを実行する

```
$ docker-machine ssh dev-01
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ 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-machine ssh dev-01 "hostname && uname -a"
dev-01
Linux dev-01 3.18.5-tinycore64 #1 SMP Sun Feb 1 06:02:30 UTC 2015 x86_64 GNU/Linux
```

`df -h` のようなオプションを使うコマンドを実行する場合は、`--` を使うかクオートで囲む

```
$ docker-machine ssh dev-01 -- df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                  899.9M     86.9M    812.9M  10% /
tmpfs                   899.9M     86.9M    812.9M  10% /
tmpfs                   499.9M         0    499.9M   0% /dev/shm
/dev/sda1                18.2G     58.6M     17.2G   0% /mnt/sda1
cgroup                  499.9M         0    499.9M   0% /sys/fs/cgroup
none                    233.0G    193.6G     39.3G  83% /Users
/dev/sda1                18.2G     58.6M     17.2G   0% /mnt/sda1/var/lib/docker/aufs

$ docker-machine ssh dev-01 "df -h"
Filesystem                Size      Used Available Use% Mounted on
rootfs                  899.9M     86.9M    812.9M  10% /
tmpfs                   899.9M     86.9M    812.9M  10% /
tmpfs                   499.9M         0    499.9M   0% /dev/shm
/dev/sda1                18.2G     58.6M     17.2G   0% /mnt/sda1
cgroup                  499.9M         0    499.9M   0% /sys/fs/cgroup
none                    233.0G    193.6G     39.3G  83% /Users
/dev/sda1                18.2G     58.6M     17.2G   0% /mnt/sda1/var/lib/docker/aufs
```

### start
マシンをスタートする

```
$ docker-machine start dev-01
INFO[0000] Waiting for VM to start...
```

### stop
マシンをストップする

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

### upgrade
最新バージョンの Docker を使うようマシンをアップグレードする。

```
# with VirtualBox
$ docker-machine upgrade dev-02
INFO[0000] Stopping machine...
INFO[0006] Downloading boot2docker...
# 2015/02/27 現在はここで止まってしまう...

# with DigitalOcean
# 起動した状態だとダメだと言われた
$ docker-machine upgrade staging
ERRO[0018] exec: already started
$ docker-machine stop staging
# 今は動かない模様
$ docker-machine upgrade staging
ERRO[0075] exit status 255
```

### url
マシンの Docker Remote API のエンドポイント URL を表示する

```
$ docker-machine url dev-01
tcp://192.168.99.100:2376
```

## ドライバ
2015年02月27日現在サポートされているドライバ一覧

* Amazon EC2
* Microsoft Azure
* Microsoft Hyper-V
* DigitalOcean
* Google Compute Engine
* OpenStack
* Rackspace
* SoftLayer
* VirtualBox
* VMware Fusion
* VMware vCloud Air
* VMware vSphere

これ以外にも[ドライバ追加プルリクエストがある](https://github.com/docker/machine/pulls?q=is%3Aopen+is%3Apr+label%3Aproposed-driver)

### AWS
[Amazon Web Services](https://docs.docker.com/machine/#amazon-web-services)

### Digital Ocean
[Digital Ocean](https://docs.docker.com/machine/#digital-ocean)


## Change Log
リポジトリに [CHANGES.md](https://github.com/docker/machine/blob/master/CHANGES.md) がある

## Roadmap
リポジトリに [`ROADMAP.md`](https://github.com/docker/machine/blob/master/ROADMAP.md) がある。

今挙っているもので良さそうなのは

* Cloud-init のサポート
* Docker の各種設定
* Swarm との連携の強化
* REST API の提供（マシン作成とかを REST API 経由でできる？）

## REF

* [docker/machine](https://github.com/docker/machine)
 * [CHANGE LOG](https://github.com/docker/machine/blob/master/CHANGES.md)
 * [ROADMAP](https://github.com/docker/machine/blob/master/ROADMAP.md)
* [公式ドキュメント](https://docs.docker.com/machine/)
* [ANNOUNCING DOCKER MACHINE BETA](http://blog.docker.com/2015/02/announcing-docker-machine-beta/)