概要
docker が公式で load-balancer 用のイメージを出しているのでそれを使います
dockercloud-haproxy というやつです
環境
- macOS 10.13.2
- Docker version 18.02.0-ce, build fc4de44
- docker-compose version 1.19.0, build 9e633ef
docker-compose.yml
version: '2'
services:
web:
image: kakakikikeke/debug_container
ports:
- 4567
lb:
image: dockercloud/haproxy
ports:
- 80:80
links:
- web
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- docker-compose up -d
curl -s localhost | jq '.hostname'
こんな感じでアクセスするとコンテナ ID が取得できます
スケールしてみる
docker-compose scale web=3
でスケールできます
これで何度か curl を叩いてみましょう
for i in
seq 1 10; do curl -s localhost | jq '.hostname'; done
"7a6fd1982372"
"d35f25b865a1"
"57236b7f536d"
"7a6fd1982372"
"d35f25b865a1"
"57236b7f536d"
"7a6fd1982372"
"d35f25b865a1"
"57236b7f536d"
"7a6fd1982372"
こんな感じで別のコンテナにアクセスしてくれていることがわかると思います
ローカルで動作させる場合には volumes で指定している /var/run/docker.sock
を haproxy にマウントしていないとちゃんとバランシングしてくれないので注意してください
最後に
dockercloud-haproxy を使ってコンテナのロードバランシングをしてみました
scale するだけでバランシングしてくれるので haproxy の再起動が不要なのが嬉しい点です
haproxy 自体の多重構成もできるはずです
AWS などには ALB など専用のロードバランサがありますが、そこまでアクセスがないのであれば、コンテナで簡単に LB を立てるのもありかなと思います
本番運用するのであれば Swarm でクラスタ化してちゃんと affinity ルールを考える必要はありそうですが
0 件のコメント:
コメントを投稿