ようへいの日々精進XP

よかろうもん

Docker コンテナのサービスを自動で登録してくれる Registrator が面白かったのでメモ

書き留めていたものを再構成して公開。

参考

Registrator とは

github.com

Docker コンテナで動いているサービスを Consul や etcd や SkyDNS2 に自動的に登録してくれるツール。詳細は上記の GitHub リポジトリを。

何が面白かったのか

結論から言うと...

  • Docker コンテナでポート晒す際に Docker ホスト上のポート番号を意識しなくて良くなった
  • Consul で利用する際にサービス検出(登録)の API を叩く必要が無くなった

触ってみる

構成

  • 気が向いたら図を書く

Registrator のインストール

wget https://github.com/gliderlabs/registrator/releases/download/v0.4.0/registrator_0.4.0_linux_x86_64.tgz
tar zxvf registrator_0.4.0_linux_x86_64.tgz

Consul 環境の用意

Consul 環境すら Docker コンテナで用意したが、注意点がひとつ。Docker ホストから Consul の API にアクセスする為には、以下のように client_addr0.0.0.0 で Consul を起動しておく。

{
  "data_dir": "/opt/consul",
  "server": true,
  "client_addr": "0.0.0.0",
  "bootstrap_expect": 3,
  "node_name": "consul_01"
}

ひとまず 3 node 構成で。

Node       Address          Status  Type    Build  Protocol  DC
consul_01  172.17.0.1:8301  alive   server  0.5.2  2         dc1
consul_02  172.17.0.2:8301  alive   server  0.5.2  2         dc1
consul_03  172.17.0.3:8301  alive   server  0.5.2  2         dc1

コンテナの構成は以下の状態。

CONTAINER ID        IMAGE                           COMMAND                CREATED             STATUS              PORTS                                            NAMES
cbdd4ed59ff2        inokappa/centos-consul:latest   "/bin/sh -c '/usr/sb   6 days ago          Up About an hour    0.0.0.0:32773->22/tcp, 0.0.0.0:32772->8500/tcp   consul_03
27663be7d6b6        inokappa/centos-consul:latest   "/bin/sh -c '/usr/sb   6 days ago          Up About an hour    0.0.0.0:32770->22/tcp, 0.0.0.0:32771->8500/tcp   consul_02
dc655720ce80        inokappa/centos-consul:latest   "/bin/sh -c '/usr/sb   6 days ago          Up About an hour    0.0.0.0:32768->22/tcp, 0.0.0.0:32769->8500/tcp   consul_01

Docker ホスト側から API を叩く場合には、以下のように 8500 番ポートにバインドされているポートに対してリクエストを送る。

$ curl -s localhost:32769/v1/status/peers?pretty
[
    "172.17.0.1:8300",
    "172.17.0.2:8300",
    "172.17.0.3:8300"
]

Registrator の起動

以下のように consul のエンドポイントをオプションに指定して Registrator を起動する。

registrator consul://127.0.0.1:32769 &

Registrator を起動した時点で既に以下のように consul からサービスが検出されている。

$ curl -s localhost:32769/v1/catalog/services?pretty
{
    "centos-consul-22": [],
    "centos-consul-8500": [],
    "consul": []
}

せっかくなんで centos-consul-22 を見てみる。

$ curl -s localhost:32769/v1/catalog/service/centos-consul-22?pretty
[
    {
        "Node": "consul_01",
        "Address": "172.17.0.1",
        "ServiceID": "vagrant-ubuntu-trusty-64:consul_03:22",
        "ServiceName": "centos-consul-22",
        "ServiceTags": null,
        "ServiceAddress": "",
        "ServicePort": 32773
    },
    {
        "Node": "consul_01",
        "Address": "172.17.0.1",
        "ServiceID": "vagrant-ubuntu-trusty-64:consul_02:22",
        "ServiceName": "centos-consul-22",
        "ServiceTags": null,
        "ServiceAddress": "",
        "ServicePort": 32770
    },
    {
        "Node": "consul_01",
        "Address": "172.17.0.1",
        "ServiceID": "vagrant-ubuntu-trusty-64:consul_01:22",
        "ServiceName": "centos-consul-22",
        "ServiceTags": null,
        "ServiceAddress": "",
        "ServicePort": 32768
    }
]

すげえ。

サービスの登録と削除

せっかくなんで Web アプリケーションなんざコンテナで起動してサービス登録させてみたいので、Python の Web サーバーが起動するだけのコンテナを以下のようにこさえて起動してみる。

cat << EOT >> Dockerfile
FROM inokappa/centos-base
EXPOSE 1919
CMD python -m SimpleHTTPServer 1919
EOT
docker build -t simple-webapp .
docker run --name=web01 -t -d -p 1919 simple-webapp
docker run --name=web02 -t -d -p 1919 simple-webapp
docker run --name=web03 -t -d -p 1919 simple-webapp

コンテナを起動すると、以下のように標準出力に Registrator からのメッセージが出力される。

2015/06/13 05:31:36 registrator: added: 3b342be6d2ed vagrant-ubuntu-trusty-64:web01:1919
2015/06/13 05:31:40 registrator: added: 6033253ca282 vagrant-ubuntu-trusty-64:web02:1919
2015/06/13 05:31:45 registrator: added: e1aef677f54b vagrant-ubuntu-trusty-64:web03:1919

サービスの登録状態を確認してみる。

curl -s localhost:32769/v1/catalog/services?pretty
{
    "centos-consul-22": [],
    "centos-consul-8500": [],
    "consul": [],
    "simple-webapp": []
}

simple-webapp が登録されている。simple-webapp の詳細を確認。

$ curl -s localhost:32769/v1/catalog/service/simple-webapp?pretty
[
    {
        "Node": "consul_01",
        "Address": "172.17.0.1",
        "ServiceID": "vagrant-ubuntu-trusty-64:web01:1919",
        "ServiceName": "simple-webapp",
        "ServiceTags": null,
        "ServiceAddress": "",
        "ServicePort": 32780
    },
    {
        "Node": "consul_01",
        "Address": "172.17.0.1",
        "ServiceID": "vagrant-ubuntu-trusty-64:web02:1919",
        "ServiceName": "simple-webapp",
        "ServiceTags": null,
        "ServiceAddress": "",
        "ServicePort": 32781
    },
    {
        "Node": "consul_01",
        "Address": "172.17.0.1",
        "ServiceID": "vagrant-ubuntu-trusty-64:web03:1919",
        "ServiceName": "simple-webapp",
        "ServiceTags": null,
        "ServiceAddress": "",
        "ServicePort": 32782
    }
]

おお、いいねえ。

ついでにコンテナを停止させてみると...

docker stop web01

以下のように Registrator からメッセージ。

2015/06/13 05:36:35 registrator: removed: 3b342be6d2ed vagrant-ubuntu-trusty-64:web01:1919

どうやら web01 はサービスから削除された模様。念のために確認。

$ curl -s localhost:32769/v1/catalog/service/simple-webapp?pretty
[
    {
        "Node": "consul_01",
        "Address": "172.17.0.1",
        "ServiceID": "vagrant-ubuntu-trusty-64:web02:1919",
        "ServiceName": "simple-webapp",
        "ServiceTags": null,
        "ServiceAddress": "",
        "ServicePort": 32781
    },
    {
        "Node": "consul_01",
        "Address": "172.17.0.1",
        "ServiceID": "vagrant-ubuntu-trusty-64:web03:1919",
        "ServiceName": "simple-webapp",
        "ServiceTags": null,
        "ServiceAddress": "",
        "ServicePort": 32782
    }
]

おお。

ということで

Registrator で遊んでみたけど、コンテナ起動したらすぐさまサービス登録の快感は何物にも代え難いものだった。そもそも Registrator との出会いは以下の記事だったので、以下の記事のように Amazon ECS を使って今度は試してみたいよなあ。

ということでお疲れ様でした。