jmeter を master(Windows)で slave(Docker)で実行する

Windows 側は Ctrl-R で次のように jmeter を開始します。 -Jremote_hosts にはスレーブである Docker のホストをカンマ区切りで指定します。

jmeter -Jserver.rmi.ssl.disable=true -Jremote_hosts=192.0.2.123

Docker で次のように jmeter を実行します。イメージは Dockerhub で見つけてきた justb4/jmeter を使っています。気になる人は自前でビルドしても良いでしょう。

-Djava.rmi.server.hostname にはこの Docker ホストのアドレスを指定します。↑の -Jremote_hosts と同じになると思います。

docker run --rm --name jmeter -p 1099:1099 -p 60000:60000 justb4/jmeter \
    -s -n -j /dev/stdout \
    -Jserver.rmi.ssl.disable=true \
    -Jserver.rmi.localport=60000 \
    -Djava.rmi.server.hostname=192.0.2.123

試行錯誤の跡

最初適当にググって下記でできると思ったもののダメでした。

docker run --rm --name jmeter -p 1099:1099 justb4/jmeter \
    -s -n -j /dev/stdout \
    -Jserver.rmi.ssl.disable=true \
    -Djava.rmi.server.hostname=192.0.2.123

-Djava.rmi.server.hostname はリッスンアドレスなの? なら 0.0.0.0 で良いのではと思って見るも、やっぱりダメでした。

docker run --rm --name jmeter -p 1099:1099 justb4/jmeter \
    -s -n -j /dev/stdout \
    -Jserver.rmi.ssl.disable=true \
    -Djava.rmi.server.hostname=0.0.0.0

docker jmeter あたりでググると下記が見つかりました。

うーん? どうも java.rmi.server.hostname は接続しにきたクライアントが接続する先のアドレスなので Windows から見た Docker ホストのIPアドレスを指定する必要があるっぽい(最初の例が正しい)。

それと、1099 以外のポートも使われているようで、tcpdump してみると 60000 より大きいランダムなポートが使用されていました。-Jserver.rmi.localport でポートを固定してそのポートも晒すようにします。

参考