ネイティブアプリケーション事業部の山内です。
ワンダープラネットでは、プロダクトローンチ前あるいはローンチ後にサーバーの負荷テストを実施してボトルネックを探り、パフォーマンスチューニングを実施しています。Apache BenchやJMeter、Vegetaなど様々な無償ツールがありますが、社内ではGatlingが人気です。負荷テストの結果が静的ファイルにも出力され、グラフや表をブラウザで確認できて便利です。
今回は、Docker上にGatlingとnginxを動かすコンテナを用意し実際に負荷テストを実施、テスト結果をブラウザで閲覧するまでの一連の流れをご紹介します。
環境
・MacBook Pro (El Capitan 10.11.6)
・Docker for Mac Version 1.12.1-beta26.1 (build: 12100)
docker-compose.ymlの作成
適当な場所にディレクトリを作成し、その中に docker-compose.yml ファイルを作成します。
version: '2' services: gatling: build: ./gatling container_name: gatling restart: always stdin_open: true tty: true volumes: - /usr/local/bin command: /bin/sh nginx: build: ./nginx container_name: nginx restart: always stdin_open: true tty: true volumes_from: - gatling ports: - "80:80"
Dockerfileの作成
Gatlingを実行するコンテナを次のように定義します。Gatlingは執筆時点(2016年10月6日現在)での最新の安定版 2.2.2を使います。
FROM dockerzone/lubuntu-desktop ENV LANG C.UTF-8 # Install JDK8 RUN apt-get update && \ apt-get install -y unzip wget software-properties-common python-software-properties && \ add-apt-repository -y ppa:webupd8team/java && \ apt-get update && \ echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" | sudo debconf-set-selections && \ apt-get install -y oracle-java8-installer # Donwload and Unzip Gatling RUN cd /usr/local/bin/ && \ wget -N https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/2.2.2/gatling-charts-highcharts-bundle-2.2.2-bundle.zip && \ unzip -f /usr/local/bin/gatling-charts-highcharts-bundle-2.2.2-bundle.zip
Gatlingのテスト結果はresultsディレクトリに出力されます。今回はブラウザで結果を閲覧できるようにnginxのドキュメントルートを変更します。デフォルトでは /usr/share/nginx/html ですが、Gatlingの結果が出力される /usr/local/bin/gatling-charts-highcharts-bundle-2.2.2/results に置換するよう命令を記述しています。
FROM nginx ENV LANG C.UTF-8 # Change DocumentRoot so that we can browse gatling result RUN sed -i 's/root \/usr\/share\/nginx\/html;/root \/usr\/local\/bin\/gatling-charts-highcharts-bundle-2.2.2\/results;/' /etc/nginx/conf.d/default.conf
構成
docker-compose.yml、Dockerfileは次のような構成になります。
# tree . ├── docker-compose.yml ├── gatling │ └── Dockerfile └── nginx └── Dockerfile 2 directories, 3 files
ビルド
docker-compose.ymlファイルのあるディレクトリに移動してビルドします。初回ビルドには少し時間がかかります。
# docker-compose build
コンテナの起動
ビルドが終わったらコンテナを起動させます。
# docker-compose up Creating network "gatling_default" with the default driver Creating gatling Creating nginx Attaching to gatling, nginx
-dオプションを付けるとコンテナをバックグラウンドで起動できます。
# docker-compose up -d
Dockerコンテナの確認
docker psコマンドでコンテナのステータスを確認することができます。ここでは2つのコンテナのSTATUSがUpになっていることを確認します。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fe2366bda6b6 gatling_nginx "nginx -g 'daemon off" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp, 443/tcp nginx bfce0b54d4fb gatling_gatling "/opt/init /bin/sh" 13 minutes ago Up 3 minutes 22/tcp, 5901-5999/tcp gatling
Gatlingの実行
docker execコマンドでGatlingのテストを実行することができます。コンテナのIDは適宜指定します。
今回はGatlingのコンテナのIDが bfce0b54d4fb なので、次のようなコマンドを実行します。bfce0b54d4fbコンテナ内の gatling.sh を実行する、というような意味です。
# docker exec -it bfce0b54d4fb /usr/local/bin/gatling-charts-highcharts-bundle-2.2.2/bin/gatling.sh
gatling.sh実行後にコンパイルが走り、テスト(シミュレーション)を選択することができます。
GATLING_HOME is set to /usr/local/bin/gatling-charts-highcharts-bundle-2.2.2 07:30:33.006 [WARN ] i.g.c.ZincCompiler$ - Pruning sources from previous analysis, due to incompatible CompileSetup. Choose a simulation number: [0] computerdatabase.BasicSimulation [1] computerdatabase.advanced.AdvancedSimulationStep01 [2] computerdatabase.advanced.AdvancedSimulationStep02 [3] computerdatabase.advanced.AdvancedSimulationStep03 [4] computerdatabase.advanced.AdvancedSimulationStep04 [5] computerdatabase.advanced.AdvancedSimulationStep05
テスト結果の閲覧
テスト実行後、/usr/local/bin/gatling-charts-highcharts-bundle-2.2.2/results/ ディレクトリ配下に結果が出力されます。
Reports generated in 1s. Please open the following file: /usr/local/bin/gatling-charts-highcharts-bundle-2.2.2/results/basicsimulation-1475739367052/index.html
今回は、resultsディレクトリ配下に basicsimulation-1475739367052 が出力されたので、ブラウザから http://localhost/basicsimulation-1475739367052/ にアクセスすることで結果を閲覧することができます。(1475739367052は結果出力時のUNIXタイムです。)
まとめ
今回はGatlingとnginxの2つのコンテナを構築し、テスト結果をブラウザで閲覧する流れをご紹介しました。2016年はDocker for Mac、Docker for Windowsなどの登場によりVirtual Boxを使うことなく簡単にコンテナを構築できるようになりました。急成長中のDocker、今後も目が離せません。