LoginSignup
1
1

More than 5 years have passed since last update.

Gantryを使って既存のコンテナイメージにそのままバックエンドを接続する

Last updated at Posted at 2015-10-12

dockerを使ってシステムを構成する場合、孤立したコンテナを使うことはあまりなくて、複数のコンテナを連携させるのが普通だと思いますが、動的に構成が変動する場合など、なかなか考えることが多くて大変です。

あるフロントのコンテナから別なバックエンドのコンテナに接続する場合、フロント側にconsul-templateやconfdを組み込んだイメージを作成し、registratorなどでetcdやconsul上に登録されたバックエンドを見つけて接続を確立するのがどうやら主流のようです。

しかしこのやり方だと、せっかくポータブルに作成されたフロント側のコンテナを再度buildする必要があり、サービスの数だけフロントのコンテナイメージを用意する必要があって美しくないと思っていました。コンテナとコンテナの橋渡しは docker run のオプションだけで完結したほうが良いですよね。

ということで、Gantryというものを作りました。
Gantryの機能は、基本的にはconsul-templateやconfdと同様、

  • 指定した設定ファイルのテンプレートからetcdのサービス登録状況を参照して動的に設定ファイルを生成すること
  • -e GANTRY_CHECKでの設定ファイルのチェック
  • -e GANTRY_RELOADでのフロントプロセスのリロード
  • それに加えてCMDで指定されたプロセスの起動も行います。

設定ファイルのテンプレートは -vでマウントすれば、基本的に全て docker run のオプションだけでコンテナ間の接続を確立できます。

Gantryの構成

Gantryはetcdを監視してサービス登録状況を把握するserverと、Gantry経由で起動されるフロントコンテナ側でserverに接続するclientに分かれています。

Gantryサーバーは各ホストに1つ起動しておきます。クライアントとの通信はホスト上のvolume (/var/lib/gantry/socket)に作られた UNIX domain socketを使います。そのため、通常のdockerコンテナのIPアドレスのように動的に変動せず、Gantryサーバーが停止した場合でも、クライアントは再び起動するのを待つことができます。これによってシステムを停止せずにGantryコンテナ自体をアップグレード (stop -> rm -> run) できるように作られています。

Gantryを使うためには、sh, awk, nc -U が入っている必要があります。busyboxなどの軽量コンテナにも入っているので大体大丈夫だとおもいますが、ない場合でも busyboxのバイナリ(1〜2MBぐらい)を -vでマウントして-e NETCAT="/path/to/busybox nc -U" のようにすればokです。

Gantryはetcdをバックエンドとして参照しますが、普通のRegistratorが登録する情報"IP:PORT"だけでは情報が少なすぎて困るので、consulと同程度の情報をJSONで格納するように少しカスタマイズしたもの (docker hub) を使っています。

1
1
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
1
1