LoginSignup
17
18

More than 5 years have passed since last update.

Dockerのdns round robinでバックエンドのコンテナを切り替える

Last updated at Posted at 2016-04-14

はじめに

先週の時点では、ngx_mrubyでバックエンドのコンテナを切り替えるという方法を取っていたのですが、
(参考: ngx_mrubyとdockerでblue-green deployment)
なんと、docker networkのDNSにround robin機能が備わりその必要もなくなりました。←そうでもなかったです。
前佛さんの記事 (Docker 1.11 リリース情報の要約) で知りました。翻訳感謝m(__)m

サンプルを動かす

DNS round robin機能を使うので docker >= 1.11, docker-compose >= 1.6 でお試し頂けます。

git clone https://github.com/muk-ai/rest-api.git
cd rest-api/
git checkout eb04f8e8e3e6dffe46842bddc656ba5dc6265fc8

docker-compose build
docker-compose up -d

この時点では、nginxのバックエンドにいるfalconというコンテナはhello, worldというメッセージを返します。

$ for i in $(seq 20); do curl http://localhost/;echo; done
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}

別のコンテナを起動させます。
このコンテナはgoodbye, worldというメッセージを返すものです。

cid=$(docker run -d mukai/rest-api:goodbye2)

こいつにfalconという、既に動いているコンテナと同じ名前を割り当てます。

docker network connect --alias falcon restapi_flat-network $cid

すると

for i in $(seq 20); do curl http://localhost/;echo; done
{"messages": "hello, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "hello, world"}
{"messages": "hello, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "hello, world"}
{"messages": "goodbye, world"}
{"messages": "hello, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "hello, world"}
{"messages": "goodbye, world"}
{"messages": "hello, world"}

ラウンドロビンされました!
元もと動いていたhello, worldを返す方のコンテナを外します。

docker network disconnect restapi_flat-network restapi_falcon_1
(network aliasだけ削除したかったが方法がわからん)

おおー!

$ for i in $(seq 20); do curl http://localhost/;echo; done
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}
{"messages": "goodbye, world"}

追記

この方法だとダウンタイムが発生しますね。
Embedded DNSからレコードを削除できるようになれば。。

17
18
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
17
18