LoginSignup
5
5

More than 5 years have passed since last update.

公式のDockerイメージからConsulを起動して遊ぶ

Last updated at Posted at 2018-08-18

はじめに

オライリーの Docker を読んで、 Consul を触ってみたかったが、
書籍の出版から時間が経っていて、書籍のとおりに環境構築できなかった。
公式ページのドキュメンテーションを見ながら構築したときの備忘録。

構成の概要

  • HashiCorp社の公式Dockerイメージ を使う。
  • Digital Ocean に 2 台ノードを用意。 Docker Machine でコンテナをデプロイする。
    • consul-1
    • consul-2
  • 本来のConsulの運用では奇数台用意するが、今回はConsulの動作を確認したいだけなので2台にする
  • 公式イメージのドキュメントの記述に乗っ取って、コンテナを起動するときに -net=nost オプションを指定している。こうすることでホストマシンのインターフェースから直接コンテナのインターフェースとやりとりできるので、オーバーヘッドが少なく、高速に動作する。
  • DNSサービスはデフォルトの5300番ポートでなく、53番ポートを使う

環境構築

仮想マシンの起動

DigitalOcean上に仮想マシンを2台起動する。

ローカルPC
$ docker-machine create --driver=digitalocean --digital-ocean-access-token xxxxxxx consul-1
$ docker-machine create --driver=digitalocean --digital-ocean-access-token xxxxxxx consul-2

Consulサーバエージェントの起動

consul-1 と consul-2 のそれぞれに consul コンテナを起動する。

ノードのIPは何回か参照するので環境変数に設定しておく。

ローカルPC
$ HOSTA=$(docker-machine ip consul-1)
$ HOSTB=$(docker-machine ip consul-2)

consul-1 にConsulサーバエージェントを起動。

consul-1
$ eval $(docker-machine env consul-1)
$ docker run -d \
  --name=consul \
  --net=host \
  -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
  -e 'CONSUL_ALLOW_PRIVILEGED_PORTS=' \
  consul:1.2.2 agent -server \
    -bind=$HOSTA \
    -advertise=$HOSTA \
    -dns-port=53 \
    -recursor=8.8.8.8 \
    -client=0.0.0.0 \
    -retry-join=$HOSTB \
    -bootstrap-expect=2

consul-2 にConsulサーバエージェントを起動。

consul-2
$ eval $(docker-machine env consul-2)
$ docker run -d \
  --name=consul \
  --net=host \
  -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
  -e 'CONSUL_ALLOW_PRIVILEGED_PORTS=' \
  consul:1.2.2 agent -server  \
    -bind=$HOSTB \
    -advertise=$HOSTB \
    -dns-port=53 \
    -recursor=8.8.8.8 \
    -client=0.0.0.0 \
    -retry-join=$HOSTA \
    -bootstrap-expect=2

クラスターのメンバーにサーバエージェントが2つ起動していることを確認。

consul-1,consul-2
$ docker exec consul consul members
Node      Address               Status  Type    Build  Protocol  DC   Segment
consul-1  x.x.x.x:8301  alive   server  1.2.2  2         dc1  <all>
consul-2  x.x.x.x:8301     alive   server  1.2.2  2         dc1  <all>

これで環境構築完了。

Consulで遊んでみる

サービスを登録してみる

ConsulにRedisサービスの情報を登録する。

consul-2にredisを起動。

consul-2
$ eval $(docker-machine env consul-2)
$ docker run -d -p 6379:6379 --name redis redis:4

redisサービスをconsulに登録する。

consul-1
$ curl -XPUT http://$HOSTA:8500/v1/agent/service/register -d \
  '{"name":"redis","address":"'$HOSTB'","port":6379}'

redis.service.consul で名前解決できるようになる。

consul-1
$ dig @$HOSTA SRV +short redis.service.consul
1 1 6379 8e5d41c2.addr.dc1.consul.

ヘルスチェックを設定してみる

アプリケーションのヘルスチェックの設定をする。

サービスの起動

dnmonster サービスを起動する。

consul-1
$ docker run --net=host \
             --dns=$HOSTA \
             --dns-search=service.consul -d \
             --name dnmonster amouat/dnmonster:1.0

サービスの登録

  • ヘルスチェックの監視周期を10秒に指定する
consul-1
curl -XPUT http://$HOSTA:8500/v1/agent/service/register --data @dnmonster.json
dnmonster.json
{
  "name":"dnmonster", 
  "address":"(consul-1のIPアドレス)", 
  "port":8080, 
  "check": { 
    "http": "http://(consul-1のIPアドレス):8080/monster/foo", 
    "interval":"10s"
  }
}

サービス停止を検知するかの確認

dnmosneter サービスを停止する

consul-1
$ docker stop dnmonster

consul のログにエラーが出る。

consul-1
$ docker logs -f consul
...
2018/08/11 08:18:11 [WARN] agent: Check "service:dnmonster" HTTP request failed: Get http://x.x.x.x:8080/monster/foo: dial tcp x.x.x.x:8080: connect: connection refused

参考

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5