[実践編]docker-machine + さくらのクラウド：石狩〜東京間でスケールアウト可能なswarmクラスタ組むよ。

#### 関連記事

[[導入編]docker-machine + さくらのクラウドでお手軽リモートdockerするよ](http://qiita.com/yamamoto-febc/items/4aff7472fc1ea025db0a)

[[実践編]docker-machine + さくらのクラウドでリモートdocker:ビルドサーバ作るよ](http://qiita.com/yamamoto-febc/items/48510a570d6758a6e5b2)

* * * 

## はじめに

今回はdocker-machine-sakuracloudを使って石狩〜東京リージョンをまたいだswarmクラスタを組んでみます。

swarmについては以下がわかりやすかったです。
[Docker Swarm入門](http://www.slideshare.net/zembutsu/introduction-to-docker-swarm)

swarmクラスタについては以下を参考に作成していきます。
[Install and Create a Docker Swarm](https://docs.docker.com/swarm/install-w-machine/)

上記記事の翻訳としてQiitaのこちらの記事が読みやすいと思います。
[Docker Swarm: Docker Swam を始めましょう](http://qiita.com/zembutsu/items/d4db18c0f12356f11112)

* * * 

さくらのクラウドには石狩に2つと東京、合わせて3つのリージョンがありますので
全てのリージョンにサーバを配置して構成します。

docker-machine-sakuracloudの使い方については[こちら](http://qiita.com/yamamoto-febc/items/4aff7472fc1ea025db0a)を参照してください。

**docker-machine-sakuracloudはv0.0.4以降を利用してください。
(東京リージョンでのサーバ作成バグFix済みのバージョンです)**


## 今回の構成

| 役割         | リージョン        | サーバ名                 |
|------------------|----------------|---------------------|
| swarmマネージャ    | 石狩第1リージョン| sakura-is1a-manager |
| swarmエージェント   | 石狩第1リージョン| sakura-is1a-agent   |
| 　                | 石狩第2リージョン| sakura-is1b-agent   |
| 　                | 東京第1リージョン| sakura-tk1a-agent   |

## 前準備

swarmクラスタではディスカバリトークンと呼ばれる文字列を用いて
クラスタ内でのディスカバリやエージェントの登録を行うため、
クラスタ作成前にディスカバリトークンを生成しておく必要があります。

ローカル環境のdockerコンテナで生成しても良いですが、今回はさくらのクラウド上で作業します。

以下のコマンドを実施し、出力されたトークンを控えておいてください。

```bash
# コマンド入力補助用の環境変数設定
$ export SAKURACLOUD_ACCESS_TOKEN=[さくらのクラウドのアクセストークン]
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET=[さくらのクラウドのトークンシークレット]

# さくらのクラウド上にサーバ作成
$ docker-machine create -d sakuracloud sakura-token

# docker-machineの対象サーバを切り替え
$ eval "$(docker-machine env sakura-token)"

# ディスカバリトークンの生成
$ docker run swarm create

#
# トークンが出力されるため控えておく
#

# サーバを削除
$ docker-machine rm sakura-token

```


## 1. docker-machineでさくらのクラウド上にswarmマネージャを構築

docker-machine-sakuracloudを使ってswarmマネージャを作成できます。

以下コマンドを実行します。

```bash
$ docker-machine create -d sakuracloud \
        --swarm \
        --swarm-master \
        --swarm-discovery token://<ディスカバリトークン> \
        --sakuracloud-region is1a \
        sakura-is1a-manager
```

## 2. 各リージョン(石狩第1、石狩第2、東京第1)にswarmエージェントを構築

こちらももちろんdocker-machine-sakuracloudを使って構築します。

```bash
# 石狩第1リージョン
$ docker-machine create -d sakuracloud \
        --swarm \
        --swarm-discovery token://<ディスカバリトークン> \
        --sakuracloud-region is1a \
        sakura-is1a-agent
        
        
# 石狩第2リージョン
$ docker-machine create -d sakuracloud \
        --swarm \
        --swarm-discovery token://<ディスカバリトークン> \
        --sakuracloud-region is1b \
        sakura-is1b-agent

# 東京第1リージョン
$ docker-machine create -d sakuracloud \
        --swarm \
        --swarm-discovery token://<ディスカバリトークン> \
        --sakuracloud-region tk1a \
        sakura-tk1a-agent

```

これで計4台のサーバができているはずです。
`docker-machine ls`コマンドなどで確認しておきましょう。

![kobito.1448680953.140529.png](https://qiita-image-store.s3.amazonaws.com/0/20668/397094b8-b330-1ac4-a03e-d7158b9027d4.png "kobito.1448680953.140529.png")

最後に以下のコマンドでdockerコマンドの接続先をswarmマネージャにしておきます。

```bash
$ eval "$(docker-machine env --swarm sakura-is1a-manager)"
```

## 3. コンテナを起動させてみる

docker-composeでコンテナを起動させてみます。

起動するイメージはなんでもよいのですが、動作確認がブラウザで行えて楽なため
[kitematic/hellw-world-nginx](https://hub.docker.com/r/kitematic/hello-world-nginx/)を利用しています。

まずは以下のファイルを作成します。

```bash
$ vi docker-compose.yml

web:
  image: kitematic/hello-world-nginx
  ports:
    - "80:80"

```

作成したらdocker-composeコマンドで起動してみます。

```bash
$ docker-compose up -d
```

どのノードで起動したか確認してみましょう。

```bash 
$ docker ps -a

CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                                     NAMES
bc79b4b45146        kitematic/hello-world-nginx   "sh /start.sh"           7 seconds ago       Up 6 seconds        133.242.52.77:80->80/tcp                  sakura-is1a-agent/sakuraswarm_web_1

#以下swarm関連コンテナの出力のため省略

```

`is1a`の文字があるので石狩リージョンですね。

## 4. 石狩〜東京リージョンをまたいでスケールアウトしてみる

いよいよリージョンをまたいでスケールアウトしてみましょう。
以下コマンドでスケールする数を指定するだけです。

```bash
$ docker-compose scale web=3
```

結果確認してみましょう。

```bash
$ docker ps -a

6e7170526008        kitematic/hello-world-nginx   "sh /start.sh"           17 seconds ago      Up 15 seconds       27.133.129.167:80->80/tcp                 sakura-tk1a-agent/sakuraswarm_web_3
3fe015b8f26c        kitematic/hello-world-nginx   "sh /start.sh"           17 seconds ago      Up 15 seconds       153.127.193.144:80->80/tcp                sakura-is1b-agent/sakuraswarm_web_2
bc79b4b45146        kitematic/hello-world-nginx   "sh /start.sh"           47 seconds ago      Up 45 seconds       133.242.52.77:80->80/tcp                  sakura-is1a-agent/sakuraswarm_web_1

#以下swarm関連コンテナの出力のため省略

```

無事にis1a(石狩第1)とis1b(石狩第2)、tk1a(東京)でスケールできましたね！

後は各サーバのIPアドレス宛にブラウザで接続すれば以下のようなhellow-world-nginxのスタートページが表示されるはずです。
![kobito.1448684184.191613.png](https://qiita-image-store.s3.amazonaws.com/0/20668/a5b5339c-8a99-cee8-a393-cd60bbb5e939.png "kobito.1448684184.191613.png")



## 終わりに

docker-machineを使えばswarmでクラスタ作成も楽チンです。
さくらのクラウドには[GSLB(広域負荷分散アプライアンス)](http://cloud-news.sakura.ad.jp/gslb/)なども用意されているため、
組み合わせれば面白そうです。

まだまだクラスタのノード間でのデータ同期やコンテナ間のリンクをどうするかといった問題はありますので、
docker-machine-sakuracloudでは以下のような機能を今後取り込みたいなと考えています。

 - [オブジェクトストレージ](http://cloud.sakura.ad.jp/specification.php#section-object)を活用したコンテナ間のデータ共有
 - [ブリッジ](http://cloud-news.sakura.ad.jp/bridge/)を利用したサーバ間接続への対応


以上です。