Docker

JMETERのスレーブを、docker-composeを使ってビルドしてみた

開発環境を作ることを考えると、Dockerメチャ便利やん!と思ってきた浅見です。

前回、JMETERのスレーブをDOCKER上に立ててみた という記事では、JMeterスレーブをDockerで動かしてみました。dockerコマンドでも問題なく利用できますが、毎回コマンド実行するのは結構手間がかかりました。

その手間を解消するツールとして、「docker-compose」というものがあるようです。「docker-compose」を使うと、実行コマンドをファイル定義できるようになるので、より手軽にDockerを使うことができます。

ということで、今回は、「docker-compose」を使ってみようと思います。ホストOSは「AmazonLinux2」になります。

インストール

公式サイト を参考に、インストールをしてみます。

「/usr/local/bin」配下に実行コマンドをダウンロードし、実行権限をつけるだけで利用が可能です。rootユーザーで利用する場合は、「/usr/bin」へシンボリックリンクを貼ってあげる必要がありました。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose

$ docker-compose --version
docker-compose version 1.26.2, build eefe0d31

Dockerfileの作成

Dockerfileは前回作成したものから変更はありません。

# centos7イメージを利用
FROM centos:centos7

# JMeterをインストール
RUN cd /usr/local/src/ \
    && yum update -y \
    && yum install -y wget \
    && yum install -y jre \
    && wget https://ftp.kddi-research.jp/infosystems/apache//jmeter/binaries/apache-jmeter-5.3.tgz \
    && tar -xvzf apache-jmeter-5.3.tgz \
    && rm apache-jmeter-5.3.tgz \
    && ln -s /usr/local/src/apache-jmeter-5.3/ /usr/local/jmeter

# IPアドレスは引数で指定
ARG IP

# JMeterスレーブの起動設定
# - SSL通信無効化
# - rmi.localport指定
# - rmi.server.hostname指定
# - メモリ調整(t3.microを利用しているので64MBとしています
RUN sed -i_date +%Y%m%d -e s/#server.rmi.ssl.disable=false/server.rmi.ssl.disable=true/g /usr/local/jmeter/bin/jmeter.properties \
    && sed -i_date +%Y%m%d -e s/#server.rmi.localport=4000/server.rmi.localport=4000/g /usr/local/jmeter/bin/jmeter.properties \
    && sed -i_date +%Y%m%d -e s/#RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx/RMI_HOST_DEF=-Djava.rmi.server.hostname=$IP/g /usr/local/jmeter/bin/jmeter-server \
    && sed -i_date +%Y%m%d -e 's/: "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"/: "${HEAP:="-Xms64m -Xmx64m -XX:MaxMetaspaceSize=64m"}"/g' /usr/local/jmeter/bin/jmeter

# JMeterスレーブの起動
CMD [ "/usr/local/jmeter/bin/jmeter-server" ]

docker-compose.ymlの作成

前回実行したコマンドを「docker-compose.yml」に置き換えていきます。

buildコマンドの定義

まずは、buildコマンドです。次のようなコマンドを使ってbuildを行っていました。ホストOSのローカルIPを引数で渡したいために、長くなっています。

$ TOKEN=curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
&& IP=curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/local-ipv4 \
&& docker build -t ptune/jmeter:5.3 --build-arg IP=$IP .

docker-compose.ymlへ書くと次のようになります。

version: '3.7'
services:
  jmeter-slave:
    build:
      context: .
      args:
        - IP=$IP

引数で渡していたIPアドレスは、「.env」ファイルへ記載する必要があるので、別途「.env」ファイルを作成します。

TOKEN=curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
&& IP=curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/local-ipv4 \
&& echo "IP=$IP" > .env

runコマンドの定義

runコマンドは次のようにしていました。

$ docker run -d -it --name jmeter-slave -p 1099:1099 -p 4000:4000 ptune/jmeter:5.3

「docker-compose.yml」へcontainer_name以降を追加します。

version: '3.7'
services:
  jmeter-slave:
    build:
      context: .
      args:
        - IP=$IP

    container_name: jmeter-slave
    restart: always
    ports:
      - 1099:1099
      - 4000:4000

docker-composeの実行

docker-composeを使ってイメージ作成および起動してみます。

$ docker-compose up -d

作成されたイメージおよびコンテナを確認してみます。無事に起動しています。

$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
docker_jmeter-slave   latest              2952b974a64d        6 minutes ago       647MB
centos                centos7             b5b4d78bc90c        2 months ago        203MB

$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                            NAMES
7489379bfc1a        docker_jmeter-slave   "/usr/local/jmeter/b…"   7 minutes ago       Up 7 minutes        0.0.0.0:1099->1099/tcp, 0.0.0.0:4000->4000/tcp   jmeter-slave

まとめ

JMETERのスレーブをDOCKER上に立ててみた で実行したdockerコマンドを、「docker-compose」を使って実装してみました。

「docker-compose」を使うと、ファイル定義できるようになるので再現性が高まりそうです。