Dockerを使って軽くConsulを触ってみる
サーバ界隈の技術革新が激しい今日この頃ですが、名前は知っていつつもなかなか触る機会がないなんて状態ではないでしょうか。特に複数台のサーバを予め用意しなければならないソフトウェアは準備だけでも大変で、なかなか手出ししづらいかと思います。
そこで使ってみたいのがDockerです。Dockerを使うことで1台のサーバでも仮想的に複数台サーバ構成を試すことができます。今回は最近登場したConsulをDocker上で簡単に試してみたいと思います。あくまでも触れる程度なので、本格的な運用とは別でお考えください。
サーバを立てる
さくらのクラウドを使ってサーバを準備します。OSはCoreOSになります。サーバの追加を行う際にアーカイブ選択で CoreOS 367.1.0 (stable) #112600559854 を選択します。
CoreOSに接続
サーバが立ち上がったら ssh で接続します。
$ ssh core@server_ip_address
server_ip_address はサーバのIPに読み替えてください。
Consulを用意する
サーバに接続したらConsulを用意します。
$ docker pull progrium/consul
少し時間がかかりますが、終わったらまず1つ目のノードを立ち上げます。
$ docker run -d --name node1 -h node1 progrium/consul -server -bootstrap-expect 3
2台目のノードからは、この1台目のノードに接続する形になりますので、IPアドレスを取得します。
$ JOIN_IP="$(docker inspect -f '{{ .NetworkSettings.IPAddress }}' node1)"
これで $JOIN_IP にIPアドレスが入ります。では続けてノードを立ち上げます。
$ docker run -d --name node2 -h node2 progrium/consul -server -join $JOIN_IP $ docker run -d --name node3 -h node3 progrium/consul -server -join $JOIN_IP
これでサーバ同士はつながったのですが、外部からその状態を見ることはできません。ということで4台目はサーバではなくクライアントとして立ち上げます。
$ docker run -d -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node4 progrium/consul -join $JOIN_IP
これで8400、8500番ポートを使ってConsulの状態を見られるようになりました。例えばcurlで次のように入力します。
$ curl localhost:8500/v1/catalog/nodes [{"Node":"node4","Address":"172.17.0.9"},{"Node":"node1","Address":"172.17.0.5"},{"Node":"node2","Address":"172.17.0.6"},{"Node":"node3","Address":"172.17.0.7"}]
ノードがつながっているのが分かります。
Consulクライアントを使う
今回はDockerなのでConsulコマンドがインストールできません。ということで Mac OSX側から使ってみることにします。使うのはHomebrewです。
$ brew install caskroom/cask/brew-cask $ brew cask install consul $ consul members -rpc-addr=server_ip_address:8400 Node Address Status Type Build Protocol node4 172.17.0.9:8301 alive client 0.4.0 2 node3 172.17.0.7:8301 alive server 0.4.0 2 node1 172.17.0.5:8301 alive server 0.4.0 2 node2 172.17.0.6:8301 alive server 0.4.0 2
このように外部からもノードの状態が見られるようになっています。
データを送ってみる
ConsulはシンプルなKVSでもあるので、
$ curl -XPUT -d 'hello, world!' http://server_ip_address:8500/v1/kv/hello/key
のようにしてデータを登録し、
$ curl -s http://server_ip_address:8500/v1/kv/hello/key | jq . { "CreateIndex": 26, "ModifyIndex": 26, "LockIndex": 0, "Key": "hello/key", "Flags": 0, "Value": "aGVsbG8sIHdvcmxkIQ==" } ]
としてデータの取得ができるようになっています。
Consulの主な利用法としてはサービスの登録と、そのヘルスチェックにあると思いますのでこのまま使うという訳ではないと思いますが、Consulがどういった感じなのか触ってみるのであれば、こんな感じに簡単に体験できるようになっています。
Dockerの使い方として面白いですね。