ようへいの日々精進XP

よかろうもん

Docker Compose + Registrator + Consul + Consul-template でカヂュアルにスケールする環境の考察(Docker Compose V1 に限ります)

ども、かっぱです。

tl;dr

考察シリーズ。以下のような環境を Docker Compose 一発で起動出来ると嬉しいなあと思ったので雑に考察したのでメモ。

f:id:inokara:20160315003300p:plain


考察

教材

github.com

スケールイン、スケールアウトを試してみる

docker-compose.yml と Dockerfile を取得する

以下のように GitHubリポジトリからプロジェクト一式を適当なディレクトリに clone します。

cd ~/dockerfiles/
git clone https://github.com/inokappa/sample-docker-compose-scale.git

以下のように出力されることを確認します。

Cloning into 'sample-docker-compose-scale'...
remote: Counting objects: 28, done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 28 (delta 8), reused 25 (delta 5), pack-reused 0
Unpacking objects: 100% (28/28), done.
Checking connectivity... done.

環境を起動する

以下のようにコマンドを実行してスケールイン、スケールアウト環境を起動します。

cd ~/dockerfiles/sample-docker-compose-scale
./_demo.sh

以下のように出力されることを確認します。(コンテナのビルドが走りますので暫くお待ち下さい...)

Successfully built 974b57377b7c
Creating sampledockercomposescale_app_1
Creating sampledockercomposescale_consul_server_1
Creating sampledockercomposescale_registrator_1
Creating sampledockercomposescale_haproxy_1

以下のようにコマンドを実行して起動しているコンテナの状態を確認します。

docker-compose -f docker-compose.yml.v1 ps

以下のように出力されることを確認します。

                  Name                                Command               State                                            Ports                                           
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sampledockercomposescale_app_1             sh run-app.sh                    Up      0.0.0.0:32774->4567/tcp                                                                  
sampledockercomposescale_consul_server_1   /bin/consul agent -server  ...   Up      8300/tcp, 8301/tcp, 8301/udp, 8302/tcp, 8302/udp, 8400/tcp, 8500/tcp, 8600/tcp, 8600/udp 
sampledockercomposescale_haproxy_1         /bin/bash /root/run-haproxy.sh   Up      0.0.0.0:80->80/tcp                                                                       
sampledockercomposescale_registrator_1     /bin/registrator --interna ...   Up 

4 つのコンテナが起動していることを確認します。

更に以下のようにブラウザでアクセス出来ることを確認します。

f:id:inokara:20160315003328p:plain

アプリケーションコンテナのホスト名が表示されている(だけ)ですが...

スケールイン、スケールアウトを試してみる

以下のようにコマンドを実行してスケールイン、スケールアウトを行います。

  • スケールアウト
docker-compose -f docker-compose.yml.v1 scale app=2

以下のように出力されることを確認します。

Creating and starting 2 ... done

以下のようにスケールアウト(アプリケーションコンテナが追加)されたことを確認することが出来ます。

docker-compose -f docker-compose.yml.v1 ps app

以下のように出力されることを確認します。

             Name                   Command      State            Ports          
--------------------------------------------------------------------------------
sampledockercomposescale_app_1   sh run-app.sh   Up      0.0.0.0:32774->4567/tcp 
sampledockercomposescale_app_2   sh run-app.sh   Up      0.0.0.0:32775->4567/tcp 

以下のように curl を利用してブラウザと同様に確認することが出来ます。

curl localhost/hostname

以下のように出力されることを確認します。

# 一回目の実行結果
$ curl localhost/hostname
a0aaa121c96e
# 二回目の実行結果
$ curl localhost/hostname
068962497d6d
  • スケールイン
docker-compose -f docker-compose.yml.v1 scale app=1

以下のように出力されることを確認します。

Stopping and removing sampledockercomposescale_app_2 ... done

以下のようにスケールイン(アプリケーションコンテナが削除)されたことを確認することが出来ます。

docker-compose -f docker-compose.yml.v1 ps app 

以下のように出力されることを確認します。

             Name                   Command      State            Ports          
--------------------------------------------------------------------------------
sampledockercomposescale_app_1   sh run-app.sh   Up      0.0.0.0:32774->4567/tcp

以下のように curl を利用してブラウザと同様に確認することが出来ます。

curl localhost/hostname

以下のように出力されることを確認します。

# 一回目の実行結果
$ curl localhost/hostname
a0aaa121c96e
# 二回目の実行結果
$ curl localhost/hostname
a0aaa121c96e

アプリケーションコンテナが削除されたので何度アクセスしても同じホスト名しか出力されないことを確認します。


以上

メモでした。

今回、Docker Compose の v2 フォーマットで作成した環境だと Registrator で Service Address が取得出来ない現象を確認したので引き続き調査したいと思います。(やっぱり、v2 フォーマットで弄りたいので)