Dockerでロードバランサを実現してみる

コンテナ技術 コンテナ技術

この記事の内容

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

コメント