以前の記事でVagrantとDocker MachineのGeneric Driverを組み合わせCloudStack上にDockerホストやSwarmクラスタを構築してみました。
Vagrant+Docker Machine Generic Driverを使ってDockerホスト・Swarmクラスタを構築する
CloudStackドライバを作成したので、これを使ってDockerホストやSwarmクラスタを構築してみます。
背景
以前からDocker Machineは様々な仮想環境・クラウドのドライバをビルトインで持っていました。しかし、新たな環境にDocker Machineを対応させるためには開発したドライバのコードを本体にマージしてもらう必要がありました。
2015/11にリリースされたv0.5.0からドライバを本体とは別のバイナリで追加できるようになりました。これによりドライバを追加する際に本体へのマージが不要になり、誰でも好きな環境のドライバを開発・追加できるようになりました。
Release v0.5.0 · docker/machine
現在ビルトインとなっているドライバについても主要なものだけ残して、残りは別のリポジトリに分けていく予定のようです。
現在公開されているドライバのリストは下記にあります。(あとでCloudStackドライバも記載してもらうようにしたいと思います。)
machine/AVAILABLE_DRIVER_PLUGINS.md at master · docker/machine
CloudStackドライバはもともとビルトインのドライバとして開発が進められていましたが、ドライバの仕組みの変更にともないプラグインとして動くよう修正し別のリポジトリで公開しました。
特長
Advanced・Basicゾーンへの対応やスタティックNAT・セキュリティグループへの対応などあらゆるCloudStack環境で動作することを目標としています。
インストール
-
Docker Machine 0.5.1+ をインストール
-
CloudStackドライバのインストール
CloudStackドライバは下記リンクからお使いの環境にあったファイルをダウンロードしてください。
ダウンロードしたファイルを/usr/local/bin/docker-machine-driver-cloudstack
に設置し実行権限をつけてください。
https://github.com/atsaki/docker-machine-driver-cloudstack/releases/latestOSXユーザーはHomebrewを使ってインストールすることもできます。
brew tap atsaki/docker-machine-driver-cloudstack brew install docker-machine-driver-cloudstack
使い方
オプションを使ってゾーンやテンプレートなどを指定できます。
APIの認証情報などは環境変数でわたすこともできます。
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
オプションをつけておくのがおすすめです。
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クラスタを構築することもできます。
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いただければありがたいです。