DockerとWeaveを使って1台のマシンでConsulを複数動かしてみる
March 9, 2015 - docker
軽くConsulを試してみたくて、でもVagrantで複数台仮想マシンを立ち上げるのはちょっと気が重い…ということでUbuntu14.10 on MacBookAirにDockerコンテナを複数立ち上げてクラスタを構築してみるテストをしました。
Dockerfileとか簡単な動かし方(を適当英語で書いたもの)をgithubにあげてあります
Docker内のプロセスがLISTENするポートに対してコンテナ外から接続する場合、-p
でホストのポートにひもづけるか、--link
でコンテナ同士をつなぐのが最も手軽な方法です。が、consulは複数のポート(HTTP API用、DNS用、ゴシッププロトコル用等)を使うため、この手軽な方法でクラスタを構築することができません。
Dockerコンテナの接続パターンとしてはいくつかあって、deeeetさんのブログ記事に詳しく書かれています。
今回は手元のMacBook Airだけで完結させたかったので、weaveを使ったコンテナ間ネットワークを利用することにしました。
weave
dockerコンテナ間の内部ネットワークを構築するものです。詳しくはjacopenさんのSlideShareを。
使い方はとても簡単で、weaveコンテナを立ち上げて、weaveコマンド経由でdockerコマンドを実行するだけ。 これならVagrantのような仮想マシンのためにメモリとディスク容量を割く必要もなくなります。
$ sudo weave launch
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2eda921c011e zettio/weave:0.9.0 "/home/weave/weaver 31 seconds ago Up 30 seconds 0.0.0.0:6783->6783/tcp, 0.0.0.0:6783->6783/udp weave
これだけで仮想ネットワークができあがります。ホストOSで必要なポートは6783だけです。
あとはweaveコマンドにIPを指定しつつdockerコマンドのオプションを付けて起動すればOK。
$ C=$(sudo weave run 10.0.0.1/24 -it ubuntu)
$ sudo docker exec $C -it /bin/bash
ただ、さくらVPSのCentOS6では動きませんでした。面倒なので深く追ってません。。。
$ sudo /usr/local/bin/weave launch
WARNING: Linux kernel version 3.5 or newer is required (you have 2.6)
ERROR: ip utility, iproute2-ss091226 does not support network namespaces.
Please install iproute2-ss111010 or later.
consul
Hashicorp謹製クラスタのオーケストレーションツール。今更説明する必要もないと思うので詳細は省略します。 consul(と周辺ツールのconsul-templateやenvconsul)を使えば複数のホスト間で設定を共有できる、というのを試すのが今回の目的でしたが、とりあえず複数のconsulを動かすところまでを書きます。
consulを起動してクラスタを構築する
weaveネットワークに接続したコンテナを4台立ち上げて、consul1, consul2をserverとして、consul3, consul4をclientとして起動します。
$ sudo weave run 10.0.0.1/24 -it -v $(pwd -P):/opt --name=consul1 restartr/consul-ready
$ sudo weave run 10.0.0.2/24 -it -v $(pwd -P):/opt --name=consul2 restartr/consul-ready
$ sudo weave run 10.0.0.3/24 -it -v $(pwd -P):/opt --name=consul3 restartr/consul-ready
$ sudo weave run 10.0.0.4/24 -it -v $(pwd -P):/opt --name=consul4 restartr/consul-ready
あとはconsul agentを順に起動するだけ。
ここで注意するのが-bind
オプション。
これを指定しないとdockerデフォルトのeth0のでクラスタにjoinすることになってしまい、このネットワークは他のコンテナとつながっていないためにクラスタ構築に失敗します。
必ずweave run 10.0.0.X/24
で指定したIPにbindしておきましょう。
$ sudo docker exec -d consul1 consul agent -server -data-dir=/tmp/consul -bootstrap-expect 1 -bind 10.0.0.1
$ sudo docker exec -d consul2 consul agent -server -data-dir=/tmp/consul -config-dir=/opt/consul.d/web.json -bind 10.0.0.2
$ sudo docker exec -d consul3 consul agent -data-dir=/tmp/consul -config-dir=/opt/consul.d/web.json -bind 10.0.0.3
$ sudo docker exec -d consul4 consul agent -data-dir=/tmp/consul -config-dir=/opt/consul.d/web.json -bind 10.0.0.4
で、先に起動したconsul1に対して残りのコンテナ内のconsul agentをjoinさせていきます。
$ sudo docker exec consul2 consul join 10.0.0.1
$ sudo docker exec consul3 consul join 10.0.0.1
$ sudo docker exec consul4 consul join 10.0.0.1
と、consul members
でjoinしている一覧が見えるようになります。
$ sudo docker exec consul1 consul members
Node Address Status Type Build Protocol
725dca3980ea 10.0.0.1:8301 alive server 0.5.0 2
f82001d6a7b4 10.0.0.2:8301 alive server 0.5.0 2
dcf304f77fdf 10.0.0.3:8301 alive client 0.5.0 2
3be672bd18b1 10.0.0.4:8301 alive client 0.5.0 2
クラスタから離れるときはconsul leave
です。
$ sudo docker exec consul4 consul leave
Graceful leave complete
$ sudo docker exec consul1 consul members
Node Address Status Type Build Protocol
dcf304f77fdf 10.0.0.3:8301 alive client 0.5.0 2
3be672bd18b1 10.0.0.4:8301 left client 0.5.0 2 # <- Statusが'alive'から'left'に変わる
725dca3980ea 10.0.0.1:8301 alive server 0.5.0 2
f82001d6a7b4 10.0.0.2:8301 alive server 0.5.0 2
という感じで、複数のマシンをいじってる感じがまったくしないくらいweave
& docker exec
は便利です。
weaveがプロダクション環境で使えるか、という点については未知ですが。
次回(があれば)consulを使った設定の管理について試したメモを書きたいと思います。