Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

オライリーの 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

参考

billthelizard
元アプリケーションエンジニアでしたが、 As Code 化の流れにのってインフラエンジニアに転身しました。AWS / IaC / Container 関連技術 をメインに記事を執筆しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away