この記事の内容
この記事では、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の設定で単純なラウンドロビンだけではなく、サーバに重みづけを行ったり、死活監視を行ったりと機能が豊富のため、興味がある方は、そちらも試してみると良いかと思います。
コメント