この記事は Docker Advent Calendar 2015 15日目の記事です。
目的
Dockerを利用して、2台のサーバーに対してロードバランシングする環境を作成する。
ではさっそく構築に取り掛かります。
最終的な構成としては以下にになります。
- ロードバランサー
- 1台
- Webサーバー
- 2台
今回はNginx
の機能を使用してロードバランシングを実現します。
別の方法としてはhaproxy
を使う方法があります。
dockerfile/haproxy
Dockerで簡易的にロードバランシングを行いたい場合はこちらで充分でしょう。
前提知識
Nginxでのロードバランシング設定
Using nginx as HTTP load balancer
Nginxを使用してのロードバランシング
上記設定を用います。
今回はデフォルトのラウンドロビンにします。
docker-compose.yml
nginx_server:
image: nginx
links:
- web
volumes:
- ./loadbalancer:/etc/nginx/conf.d
ports:
- "80:80"
web:
image: kitematic/hello-world-nginx
upstream web {
server loadbalance_web_1;
server loadbalance_web_2;
}
server {
listen 80;
location / {
proxy_pass http://web;
}
}
設定は以上です。
構築していきます。
mkdir loadbalance
cd loadbalance
docker-composeは使用できるものとします。
docker-compose up -d
このタイミングでは、nginx_serverのコンテナでloadbalance_web_2
のhostが見つからないとエラーになると思います。
webサーバーを2台に増やします。
docker-compose scale web=2
このコマンドを実行することでwebコンテナが2台に増えます。
nginx_serverのコンテナをリスタートします。
docker-compose restart nginx_server
これで完成です。
docker-machine ip default
で、IPを確認し、アクセスしてみます。
例
http:192.168.99.100
docker-log等で2台のwebサーバーのログを確認しつつアクセスしてみましょう。
ロードバランシングされていることが確認できます。
解説
docker-composeではlinkしたコンテナがhostsに設定されます。
172.17.0.33 loadbalance_web_2
172.17.0.33 loadbalance_web_2.bridge
172.17.0.34 loadbalance_web_1
172.17.0.34 loadbalance_web_1.bridge
scaleコマンドを発行する前はweb_2のhosts設定がなかったためエラーとなり起動ができませんでした。
scale後は再起動することでhostsに反映されます。