この記事の内容
この記事では、Dockerで以下のようにWebサーバをロードバランシングする環境を構築する方法を紹介します。
ロードバランスには、nginxを使用します。今回は純粋なラウンドロビンの形式を実装します。
また、docker-composeを使用します。
実装方法
ファイル構成
ファイル構成は以下の様に配置します。各ファイルの内容は次に記載します。
loadbalancer_test
│ docker-compose.yml
│
└─lb_server
nginx.conf
docker-compose.yml
docker-compose.ymlにロードバランサであるlb_serverとテスト用のweb_serverのサービス情報を記載します。ロードバランサのサーバは、ホストOSから呼び出せるように80番ポートでポートフォワーディングします。
web_serverはcontaner_nameを指定してません。これはweb_serverを複数起動する際に重複してしまうため、指定せず、連番で命名するようにするためです。詳しくは次に説明します。
version: '3'
services:
lb_server:
image: nginx
container_name: lb_server
volumes:
- ./lb_server:/etc/nginx/conf.d
ports:
- 80:80
web_server:
image: kitematic/hello-world-nginx
nginx.conf
ロードバランサの設定を行うnginx.confのファイルです。
upstream以下のserverにロードバランサでラウンドロビンするサーバを指定します。
web_serverを指定するのですが、docker-composeでscaleを指定して生成するとコンテナ名は以下となります。<COMPOSE_PROJECT_NAME>_<service名>_<ID>
COMPOSE_PROJECT_NAMEは、docker-compose.ymlのフォルダ名で、IDはコンテナの連番が入ります。
そのため、loadbalancer_test_web_server_1とloadbalancer_test_web_server_2を指定します。
upstream lb_server {
server loadbalancer_test_web_server_1;
server loadbalancer_test_web_server_2;
}
server {
listen 80;
location / {
proxy_pass http://lb_server;
}
}
コンテナの起動
コンテナの起動には以下のコマンドを実行します。–scaleでweb_server=2を指定することで、2コンテナを起動することができます。
docker-compose up -d --scale web_server=2
起動すると以下の様に表示されます。
ロードバランサの起動が完了しましたが、このままだと両方のサーバ内容が同一で、切り替わっていることがわからないので、片方のweb_serverのindex.htmlを変更しておきます。
以下の様にweb_serverのコンテナに入り、index.htmlを変更します。
ここでは、index.htmlのh2要素内を変更しました。
docker exec -it loadbalancer_test_web_server_1 sh
# vi website_files/index.html
変更後、ホストOSのブラウザでlocalhostにアクセスをすると、アクセスするたびに以下の様に内容が切り替わります。
さいごに
この記事では、docker-composeやnginxを使用して、ロードバランサを実装する方法を紹介しました。
処理の高速化を図る場合など使えるかと思います。また、nginxの設定で単純なラウンドロビンだけではなく、サーバに重みづけを行ったり、死活監視を行ったりと機能が豊富のため、興味がある方は、そちらも試してみると良いかと思います。






コメント