WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

GatlingとnginxのDockerコンテナを構築する

ネイティブアプリケーション事業部の山内です。

ワンダープラネットでは、プロダクトローンチ前あるいはローンチ後にサーバーの負荷テストを実施してボトルネックを探り、パフォーマンスチューニングを実施しています。Apache BenchJMeterVegetaなど様々な無償ツールがありますが、社内ではGatlingが人気です。負荷テストの結果が静的ファイルにも出力され、グラフや表をブラウザで確認できて便利です。


f:id:crux-one:20160928170606p:plain

今回は、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、今後も目が離せません。