Vagrantでクラウド上にDocker環境を作る（IDCFクラウドの場合）

Vagrantを使ってIDCFクラウド上にDockerの環境を作成してみる例です。

# IDCFクラウドの準備

この例では[IDCFクラウド](http://www.idcf.jp/cloud/)を使用するためIDCFのアカウントを取得が必要です。
仮想マシンの作成にはお金がかかりますが最小構成では1時間1円程度です。キャンペーンが利用できる場合もあります。

## 動作確認とSSH鍵の登録

アカウントが作成できたら仮想マシンの作成とSSHの接続が正しくできることを確認しておきます。
方法はドキュメントを参照してください。

* http://www.idcf.jp/cloud/document.html

作成したSSH鍵の名前を控えておいてください。

SSH接続が正しくできることが確認できたら仮想マシンは削除してかまいません。

## IPアドレスのID取得

IDCFの管理画面のサイドバーのIPアドレス > network1をクリックします。
表示される画面の「ID」を控えます。（「関連ネットワークID」ではないので注意。）

## APIの情報の取得

IDCFの管理画面のサイドバーのAPIをクリックしAPI Key、Secret Keyの情報を控えておきます。

# プラグインのインストール

IDCFクラウドはCloudStackというソフトウェアを基盤としているためCloudStack用のプラグインをインストールします。

```bash
$ vagrant plugin install vagrant-cloudstack
```

# VagrantfileにCloudStack用の設定を追加

VirtualBoxをプロバイダーとして使用していた場合には既にVagrantfileがあると思いますのでCloudStack用の設定を追加してみます。

例として以下のようなUbuntu14.04の仮想マシンを起動するVagrantfileがあったとします。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
end
```

このVagrantfileにIDCFクラウドでUbuntu 14.04の仮想マシンを起動する設定を追加します。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.provider :cloudstack do |cloudstack, override|
    # ダミーBox
    override.vm.box = "dummy"
    override.vm.box_url = "https://github.com/klarna/vagrant-cloudstack/raw/master/dummy.box"

    # CloudStackAPIを使用するためのエンドポイント・認証情報
    cloudstack.host    = "compute.jp-east.idcfcloud.com"
    cloudstack.path    = "/client/api"
    cloudstack.port    = "443"
    cloudstack.scheme  = "https"
    cloudstack.api_key    = "API Keyをここに記入"
    cloudstack.secret_key = "Secret Keyをここに記入"

    # 仮想マシン作成のパラメータ
    cloudstack.display_name          = "ubuntu"
    cloudstack.template_name         = "Ubuntu Server 14.04 LTS 64-bit"
    cloudstack.zone_name             = "tesla"
    cloudstack.service_offering_name = "light.S1"

    # 仮想マシンへの接続に必要なネットワークの設定
    cloudstack.pf_ip_address_id   = "IPアドレスのIDを記入"
    cloudstack.pf_public_port     = "22"
    cloudstack.pf_private_port    = "22"
    cloudstack.keypair            = "SSH鍵の名前を記入"
    override.ssh.private_key_path = "SSHの秘密鍵のパスを記入"
    override.ssh.username         = "root"
  end
end
```

IDCFクラウドに限らずクラウドを使用する場合、通常仮想マシンはクラウド上にあるイメージを使用して作成されます。
VirtualBoxを使用する際のようにイメージとしてのBoxは必要ないためダミーを使用します。

```rb
    override.vm.box = "dummy"
    override.vm.box_url = "https://github.com/klarna/vagrant-cloudstack/raw/master/dummy.box"
```

CloudStack APIを使用するためのエンドポイントおよび認証情報です。ここに控えておいたAPI Key、Secret Keyが入ります。

```rb
    cloudstack.host    = "compute.jp-east.idcfcloud.com"
    cloudstack.path    = "/client/api"
    cloudstack.port    = "443"
    cloudstack.scheme  = "https"
    cloudstack.api_key    = "API Keyをここに記入"
    cloudstack.secret_key = "Secret Keyをここに記入"
```

作成する仮想マシンのスペック・イメージの設定です。

```rb
    cloudstack.display_name          = "ubuntu"
    cloudstack.template_name         = "Ubuntu Server 14.04 LTS 64-bit"
    cloudstack.zone_name             = "tesla"
    cloudstack.service_offering_name = "light.S1"
```

クラウド上の仮想マシンにSSHで接続するための設定です。

```rb
    cloudstack.pf_ip_address_id   = "IPアドレスのIDを記入"
    cloudstack.pf_public_port     = "22"
    cloudstack.pf_private_port    = "22"
    cloudstack.keypair            = "SSH鍵の名前を記入"
    override.ssh.private_key_path = "SSHの秘密鍵のパスを記入"
    override.ssh.username         = "root"
```

# 仮想マシンの起動

次の用にプロバイダーを指定することでIDCFクラウド上で仮想マシンを起動することができます。

```bash
$ vagrant up --provider=cloudstack
```

upした後のSSH、仮想マシンの削除等の操作についてはVirtualBoxの場合と同じです。

# Docker Provisionerでコンテナを起動する

VagrantのDocker Provisionerを使用して作成した仮想マシン上でコンテナを起動してみます。

## Vagrantfile

例としてMySQLのコンテナを起動する例を示します。先ほどのVagrantfileにProvisionerの設定を追加すると以下の様になります。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.provider :cloudstack do |cloudstack, override|
    # ダミーBox
    override.vm.box = "dummy"
    override.vm.box_url = "https://github.com/klarna/vagrant-cloudstack/raw/master/dummy.box"

    # CloudStackAPIを使用するためのエンドポイント・認証情報
    cloudstack.host    = "compute.jp-east.idcfcloud.com"
    cloudstack.path    = "/client/api"
    cloudstack.port    = "443"
    cloudstack.scheme  = "https"
    cloudstack.api_key    = "API Keyをここに記入"
    cloudstack.secret_key = "Secret Keyをここに記入"

    # 仮想マシン作成のパラメータ
    cloudstack.display_name          = "ubuntu"
    cloudstack.template_name         = "Ubuntu Server 14.04 LTS 64-bit"
    cloudstack.zone_name             = "tesla"
    cloudstack.service_offering_name = "light.S1"

    # 仮想マシンへの接続に必要なネットワークの設定
    cloudstack.pf_ip_address_id   = "IPアドレスのIDを記入"
    cloudstack.pf_public_port     = "22"
    cloudstack.pf_private_port    = "22"
    cloudstack.keypair            = "SSH鍵の名前を記入"
    override.ssh.private_key_path = "SSHの秘密鍵のパスを記入"
    override.ssh.username         = "root"
  end

  # MySQLのコンテナを起動
  config.vm.provision "docker" do |d|
    d.run "mysql-server", image: "mysql",
                          args: "-e MYSQL_ROOT_PASSWORD=password"
  end
end
```

## Provisionerの実行

一度仮想マシンを削除して再度仮想マシンを作成すると、仮想マシンでDockerのインストールとコンテナの起動が行われているメッセージが表示されます。
（Docker Provisionerを使用した場合、VagrantによってDockerがインストールされます。）

```bash
$ vagrant destroy -f
$ vagrant up --provider=cloudstack
```

```vagrant provision```コマンドでProvisionerのみを実行することも可能です。

## コンテナの動作確認

仮想マシンにでログインし正常にコンテナが起動したことを確認してみます。

まず、SSHで仮想マシンにログインします。

```bash
$ vagrant ssh
```

```bash
$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS               NAMES
b6817f3c83eb        mysql:latest        "/entrypoint.sh mysq   About a minute ago   Up About a minute   3306/tcp            mysql-server  
```

MySQLサーバーに接続するためにlinkオプションを指定して新規のコンテナを起動しbashを実行します。

```bash
$ docker run -it --link mysql-server:mysql --rm mysql bash
```

linkによって設定された環境変数を確認してみます。

```bash
$ env | grep MYSQL
MYSQL_ENV_MYSQL_ROOT_PASSWORD=password
MYSQL_VERSION=5.6.22
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.2:3306
MYSQL_ENV_MYSQL_VERSION=5.6.22
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_NAME=/drunk_nobel/mysql
MYSQL_MAJOR=5.6
MYSQL_PORT_3306_TCP_ADDR=172.17.0.2
MYSQL_ENV_MYSQL_MAJOR=5.6
MYSQL_PORT=tcp://172.17.0.2:3306
```

これらの環境変数を使ってMySQLサーバーに接続できることができます。

```bash
$ mysql -u root -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"
```

次のように```docker run``` コマンドを使って直接MySQLサーバーに接続することも可能です。

```bash
$ docker run -it --link mysql-server:mysql --rm mysql sh -c 'exec mysql -u root -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
```

# 参考

* [vagrant-cloudstack](https://github.com/klarna/vagrant-cloudstack)
* [VagrantでIDCFクラウド、Cloud n、ALTUSを使ってみる - Qiita](http://qiita.com/atsaki/items/f12e82f109193321fb13)
* [Vagrantを使ってCloudStack上の環境構築をしてみよう - IDC Frontier Engineers' Blog](http://www.idcf.jp/blog/cloud/vagrant-cloudstack/)