こんにちは、小柳津です。
docker であれこれ環境構築を自動化したり、Jenkins で手作業やビルド・デプロイを自動化したり、サーバを構築したり、たまに開発をしたり、いろいろなことに取り組んでいるエンジニアです。
この記事を読んでほしい方
この記事は下記にあてはまる方にぜひ読んでほしいです。
(特にプロキシ環境下の方は作業の参考としたい記事にプロキシについての記載がされていないことも多く、時間をかけてしまった経験もあるかと思います)
- docker の知識をある程度持っている、触ったことがある、業務で使用している
- JMeter でさくっと Web アプリの負荷テストをやってみたい
- JMeter を Server – Client 構成で実行してみたい
- 作業場はプロキシ環境下である
本記事の概要
本記事のテーマは Apache が公開している Web アプリの負荷テストツールの JMeter を Server – Client 構成で実行したい、というものです。
Server、 Client はそれぞれ docker コンテナとして作成し、 Client となるコンテナからよりスペックの高いサーバにある Server 役コンテナに命令を送り JMeter を実行させます。
また別記事で取り上げますが、実行中の JMeter メトリクスを InfluxDB に送り、その結果を Grafana で可視化させることも目標とします。

環境
- RedHat 7.3
- Docker v19.03.13
- Docker-Compose v1.27.4
- justb4/docker-jmeter v5.4
- JMeter v5.4.3
- (InfluxDB v2.2.0)
- (Grafana v8.4.5)
参考にしたページ
- Apache JMeter – User’s Manual: Remote (Distributed) Testing
- JMeter Client/Server Remote Testing on Docker – Qiita
JMeter の docker イメージを作成している Git リポジトリを Clone
今回 JMeter の docker コンテナを作成するにあたり、 justb4/docker-jmeter の v5.4 (2022.06 時点の最新) を使用しました。
こちらのリポジトリをサーバに Clone します。
https://github.com/justb4/docker-jmeter
使い方については README にわかりやすく記載されているため参照ください。
justb4/jmeter イメージをビルド
サーバに JMeter の docker イメージをビルドします。
本来であればリポジトリ内の build.sh
を叩くだけでイメージをビルドしてくれるのですが、私の現場はプロキシ配下の環境であるため実際は下記のようにプロキシ情報を docker build コマンドに渡すよう少し手を入れています。
また、タイムゾーンもデフォルトでは Europe/Amsterdam
となっているため Asia/Tokyo
に変更します。
#!/bin/bash
JMETER_VERSION="5.4"
IMAGE_TIMEZONE="Asia/Tokyo"
docker build --build-arg JMETER_VERSION=${JMETER_VERSION} \
--build-arg TZ=${IMAGE_TIMEZONE} \
--build-arg http_proxy=${proxy} \
--build-arg https_proxy=${proxy} \
-t "justb4/jmeter:${JMETER_VERSION}" .
適当に変更したら build.sh
を 実行します。
JMeter Server の起動
Server 役のサーバ上で下記を実行。
実行すると Client からの命令を待ってくれます。
sudo docker run -it --rm \
-p20000:20000 \
justb4/jmeter:5.4 \
-s -n -j /dev/stdout \
-Dserver_port=20000 -Dserver.rmi.localport=20000 \
-Dserver.rmi.ssl.disable=true \
-Djava.rmi.server.hostname=$(host $(hostname)| awk '{print $4}') \
-Jmode=Statistical
-p20000:20000
20000 番ポートを空ける-Dserver_port=20000 -Dserver.rmi.localport=20000
使用するポートを指定する-Dserver.rmi.ssl.disable=true SSLを無効化
-Djava.rmi.server.hostname=$(hostname -i | awk '{print $1}')
RMI(Remote Method Invocation)の設定。自身のホストサーバのIPアドレスを取得する-Jmode=Statistical
Cleint – Server間の通信量が多いため Statistical を設定して通信量を削減
JMeter Client の起動
test.sh から JMeter Client コンテナを起動できるよう修正
test.sh
から呼ばれる run.sh
は docker コンテナを起動させるシェルとなっています。
コンテナが JMeter の Client として起動されるよう引数部分を修正します。
# JMeterClient の起動
./run.sh -Dlog_level.jmeter=DEBUG \
-Djava.rmi.server.hostname=$(hostname -i | awk '{print $1}') \
-Dclient.rmi.localport=20001 \
-Dserver.rmi.ssl.disable=true \
-Jremote_hosts=${server-IPAddress}:20000 \
-Jmode=Statistical \
-n -t test/test.jmx -l test/test.jtl \
-j test/jmeter.log \
-e -o report -r -X
-Dlog_level.jmeter=DEBUG
JMeter のログレベル-Djava.rmi.server.hostname=$(hostname -i | awk '{print $1}')
RMI(Remote Method Invocation)の設定。自身のホストサーバのIPアドレスを取得する-Dclient.rmi.localport=20001
デフォルトではポート番号が動的に使用されてしまうため固定化する-Dserver.rmi.ssl.disable=true
SSLを無効化-Jremote_hosts=${server-IPAddress}:20000
リモートサーバのIPアドレスとポート番号を指定(リモートサーバは 20000 ポートを空けます)-Jmode=Statistical
Cleint – Server間の通信量が多いため Statistical を設定して通信量を削減-n
JMeter をCLIモードで実行-t
JMeter のシナリオファイルを指定-l
JMeter の結果ファイルを指定-j
JMeter のログファイルを指定-e
JMeter 実行後にダッシュボードのレポートファイル作成-o
ダッシュボードのレポートファイルを指定-r
remote_hosts
で指定されたサーバでテストを実行-X
テスト終了時にサーバを終了(ログアウト)する
run.sh を修正
test.sh
から呼ばれる run.sh
を修正します。
#!/bin/bash
# Run JMeter Docker image with options
NAME="jmeter"
JMETER_VERSION="5.4"
IMAGE="justb4/jmeter:${JMETER_VERSION}"
# Finally run
docker run --rm --name ${NAME} --network=external-jmeter -i -v ${PWD}:${PWD} -w ${PWD} -p20001:20001 -p20002:20002 -p20003:20003 ${IMAGE} $@
d
-p20001:20001 -p20002:20002 -p20003:20003
リモートサーバとやり取りするポートは最大3つ使われるためこのオプションでポートを空ける-network=external-jmeter
JMeter のメトリクスを InfluxDB に送るための docker の使用ネットワーク
※別記事で説明します
test.sh
を実行し Client を起動すると Server に実行命令が送られ JMeter が実行されます。
テスト終了まで待つと test.sh
に指定したディレクトリにログやレポートファイルが作成されます。
レポートファイルについては下記を参照ください。すべて英語です。
Apache JMeter – User’s Manual: Generating Dashboard Report
ちなみに、環境さえ整えればシェルを実行するだけなので Jenkins ジョブから実行させてレポートファイルもジョブから確認する、なんてこともできます。(いつか Jenkins についての記事も書けたら。。)
また別の記事で JMeter メトリクスを InfluxDB に送り、Grafana でリアルタイムで結果を可視化させるようにする手順を紹介します。
ぼちぼち記事投稿できるようがんばります。