書き留めていたものを再構成して公開。
参考
- Consul Template + Registrator で、コンテナ上のWebサーバをHAProxyへリアルタイムに登録してみる – log.fstn
- CoreOS 上の Docker コンテナのサービス情報を registrator を使って etcd へ自動登録する – Qiita
Registrator とは
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_addr
を 0.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 > 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 を使って今度は試してみたいよなあ。
ということでお疲れ様でした。