Docker Machine CloudStack Driverを使ってDockerホスト・Swarmクラスタを構築する

以前の記事で[Vagrant](https://www.vagrantup.com/)と[Docker Machine](https://github.com/docker/machine)のGeneric Driverを組み合わせCloudStack上にDockerホストやSwarmクラスタを構築してみました。

[Vagrant+Docker Machine Generic Driverを使ってDockerホスト・Swarmクラスタを構築する](http://qiita.com/atsaki/items/0b48daf4858c61cb29e0#cloudstackidcf%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%AE%E5%A0%B4%E5%90%88)

CloudStackドライバを作成したので、これを使ってDockerホストやSwarmクラスタを構築してみます。

# 背景

以前からDocker Machineは様々な仮想環境・クラウドのドライバをビルトインで持っていました。しかし、新たな環境にDocker Machineを対応させるためには開発したドライバのコードを本体にマージしてもらう必要がありました。

2015/11にリリースされたv0.5.0からドライバを本体とは別のバイナリで追加できるようになりました。これによりドライバを追加する際に本体へのマージが不要になり、誰でも好きな環境のドライバを開発・追加できるようになりました。

[Release v0.5.0 · docker/machine](https://github.com/docker/machine/releases/tag/v0.5.0)

現在ビルトインとなっているドライバについても主要なものだけ残して、残りは別のリポジトリに分けていく予定のようです。

現在公開されているドライバのリストは下記にあります。（あとでCloudStackドライバも記載してもらうようにしたいと思います。）

[machine/AVAILABLE_DRIVER_PLUGINS.md at master · docker/machine](https://github.com/docker/machine/blob/master/docs/AVAILABLE_DRIVER_PLUGINS.md)

CloudStackドライバはもともとビルトインのドライバとして開発が進められていましたが、ドライバの仕組みの変更にともないプラグインとして動くよう修正し[別のリポジトリ](https://github.com/atsaki/docker-machine-driver-cloudstack)で公開しました。

# 特長

Advanced・Basicゾーンへの対応やスタティックNAT・セキュリティグループへの対応などあらゆるCloudStack環境で動作することを目標としています。

# インストール

1. Docker Machine 0.5.1+ をインストール
2. CloudStackドライバのインストール

     CloudStackドライバは下記リンクからお使いの環境にあったファイルをダウンロードしてください。
　　　ダウンロードしたファイルを`/usr/local/bin/docker-machine-driver-cloudstack` に設置し実行権限をつけてください。
     https://github.com/atsaki/docker-machine-driver-cloudstack/releases/latest

    OSXユーザーはHomebrewを使ってインストールすることもできます。

    ```bash
    brew tap atsaki/docker-machine-driver-cloudstack
    brew install docker-machine-driver-cloudstack
    ```

# 使い方

オプションを使ってゾーンやテンプレートなどを指定できます。
APIの認証情報などは環境変数でわたすこともできます。

```bash
export CLOUDSTACK_API_URL=<エンドポイント>
export CLOUDSTACK_API_KEY=<APIキー>
export CLOUDSTACK_SECRET_KEY=<シークレットキー>

docker-machine create -d cloudstack
  --cloudstack-template "Ubuntu Server 14.04“
  --cloudstack-zone “jp-east“
  --cloudstack-service-offering “Small“
  --cloudstack-expunge
  docker-machine
```

# Advancedゾーンの場合

Advancedゾーンの例としてIDCFクラウドにDockerホストを構築してみます。
Advancedゾーンであれば他の環境でも同様の方法でDockerホストを構築することができます。

IDCFクラウドでは```deployVirtualMachine``` を```POST``` で実行できないため、```--cloudstack-http-get-only``` オプションをつけるか環境変数```CLOUDSTACK_HTTP_GET_ONLY=1``` として全てのAPIを```GET``` で実行するようにしてください。

また、仮想マシン削除後にDestroyed状態で残りホストの再構築が失敗してしまうのを防ぐため```--cloudstack-expunge``` オプションをつけておくのがおすすめです。

```bash
export CLOUDSTACK_API_URL=<エンドポイント>
export CLOUDSTACK_API_KEY=<APIキー>
export CLOUDSTACK_SECRET_KEY=<シークレットキー>
export CLOUDSTACK_HTTP_GET_ONLY=1

docker-machine create -d cloudstack \
  --cloudstack-template "Ubuntu Server 14.04" \
  --cloudstack-zone "augusta" \
  --cloudstack-service-offering "light.S1" \
  --cloudstack-expunge \
  docker-machine
```

Advancedゾーンでは、デフォルトで新規にパブリックIPアドレスを取得し、スタティックNATで仮想マシンに接続します。
オプションにより取得済みのIPの使用(```--cloudstack-public-ip``` )や、ポートフォワーディングの使用(```--cloudstack-use-port-forward``` )も可能です。

Swarm関連のオプションをつければSwarmクラスタを構築することもできます。

```bash
SWARM_DISCOVERY_TOKEN=$(curl -s -X POST https://discovery.hub.docker.com/v1/clusters)

docker-machine create -d cloudstack \
    --cloudstack-template "Ubuntu Server 14.04 LTS 64-bit" \
    --cloudstack-zone "augusta" \
    --cloudstack-service-offering "light.S1" \
    --cloudstack-expunge \
    --swarm \
    --swarm-master \
    --swarm-discovery "token://${SWARM_DISCOVERY_TOKEN}" \
    swarm-master

for i in $(seq 3); do
  docker-machine create -d cloudstack \
      --cloudstack-template "Ubuntu Server 14.04 LTS 64-bit" \
      --cloudstack-zone "augusta" \
      --cloudstack-service-offering "light.S1" \
      --cloudstack-expunge \
      --swarm \
      --swarm-discovery "token://${SWARM_DISCOVERY_TOKEN}" \
      swarm-agent${i}
done
```

# おわりに

今回はAdvancedゾーンの簡単な例しか示すことができませんでしたが、Basicゾーンで動かすことも可能です。
ぜひ使っていただいてご意見・PRいただければありがたいです。