はじめに
先週の時点では、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からレコードを削除できるようになれば。。