関連記事
[導入編]docker-machine + さくらのクラウドでお手軽リモートdockerするよ
[実践編]docker-machine + さくらのクラウドでリモートdocker:ビルドサーバ作るよ
はじめに
今回はdocker-machine-sakuracloudを使って石狩〜東京リージョンをまたいだswarmクラスタを組んでみます。
swarmについては以下がわかりやすかったです。
Docker Swarm入門
swarmクラスタについては以下を参考に作成していきます。
Install and Create a Docker Swarm
上記記事の翻訳としてQiitaのこちらの記事が読みやすいと思います。
Docker Swarm: Docker Swam を始めましょう
さくらのクラウドには石狩に2つと東京、合わせて3つのリージョンがありますので
全てのリージョンにサーバを配置して構成します。
docker-machine-sakuracloudの使い方についてはこちらを参照してください。
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コンテナで生成しても良いですが、今回はさくらのクラウド上で作業します。
以下のコマンドを実施し、出力されたトークンを控えておいてください。
# コマンド入力補助用の環境変数設定
$ 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マネージャを作成できます。
以下コマンドを実行します。
$ 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を使って構築します。
# 石狩第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
コマンドなどで確認しておきましょう。
最後に以下のコマンドでdockerコマンドの接続先をswarmマネージャにしておきます。
$ eval "$(docker-machine env --swarm sakura-is1a-manager)"
3. コンテナを起動させてみる
docker-composeでコンテナを起動させてみます。
起動するイメージはなんでもよいのですが、動作確認がブラウザで行えて楽なため
kitematic/hellw-world-nginxを利用しています。
まずは以下のファイルを作成します。
$ vi docker-compose.yml
web:
image: kitematic/hello-world-nginx
ports:
- "80:80"
作成したらdocker-composeコマンドで起動してみます。
$ docker-compose up -d
どのノードで起動したか確認してみましょう。
$ 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. 石狩〜東京リージョンをまたいでスケールアウトしてみる
いよいよリージョンをまたいでスケールアウトしてみましょう。
以下コマンドでスケールする数を指定するだけです。
$ docker-compose scale web=3
結果確認してみましょう。
$ 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のスタートページが表示されるはずです。
終わりに
docker-machineを使えばswarmでクラスタ作成も楽チンです。
さくらのクラウドにはGSLB(広域負荷分散アプライアンス)なども用意されているため、
組み合わせれば面白そうです。
まだまだクラスタのノード間でのデータ同期やコンテナ間のリンクをどうするかといった問題はありますので、
docker-machine-sakuracloudでは以下のような機能を今後取り込みたいなと考えています。
- オブジェクトストレージを活用したコンテナ間のデータ共有
- ブリッジを利用したサーバ間接続への対応
以上です。