2018年2月20日火曜日

docker-compose で load-balancer を使う方法

概要

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 inseq 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 件のコメント:

コメントを投稿