Docker のコンテナを使用する際に、わざわざ ssh 等でコンテナにログインして操作したり、
関連するコンテナの IP アドレスを調べて手動で設定したり、プロビジョニングツールで環境を構築するのは面倒なので、
試しに docker run するだけで試験できるようにしてみました
負荷をかける対象のコンテナ
Dockerfile
FROM ubuntu:14.04
RUN apt-get -y update
RUN apt-get -y install aptitude
RUN aptitude -y install apache2
CMD service apache2 start && tail -f /var/log/apache2/access.log
EXPOSE 80
通信はコンテナ間のみですので --link を指定するためにコンテナに名前を付けておきます
$ docker.io run -d -t --name HTTP_SERVER hexa/apache2
c21067ce1c2a9eff781c747922c4123fda6e270e4acce4738a5d589de6eb543c
リクエストを送信するクライアント用のコンテナ
Dockerfile
FROM ubuntu:14.04
RUN apt-get -y update
RUN apt-get -y install aptitude
RUN aptitude -y install erlang make gcc autoconf curl
RUN curl -L -o /root/tsung-1.5.1.tar.gz http://tsung.erlang-projects.org/dist/tsung-1.5.1.tar.gz
RUN cd /root && tar zxvf /root/tsung-1.5.1.tar.gz
RUN cd /root/tsung-1.5.1 && ./configure
RUN cd /root/tsung-1.5.1 && make && make install
ENV TSUNG_LOG_DIR /root/tsung/log
ENV TSUNG_CONF_DIR /root/tsung/conf
ENV TSUNG_CONF $TSUNG_CONF_DIR/http.xml
ENV TSUNG_INTERARRIVAL 1
ENV TSUNG_DURATION 1
RUN mkdir -p $TSUNG_LOG_DIR
RUN mkdir -p $TSUNG_CONF_DIR
ADD ./http.xml $TSUNG_CONF
ADD ./setup.sh /root/setup.sh
RUN chmod 700 /root/setup.sh
CMD /root/setup.sh && tsung -l $TSUNG_LOG_DIR -f /root/tsung/conf/http.xml start
docker run に --link を指定することで、Apache2 のコンテナの IP アドレスが、
このコンテナの環境変数に設定されていますので、この環境変数の値を使用して Tsung の設定ファイルを設定します
setup.sh
#!/bin/bash
[ "$TSUNG_CONF" != "/root/tsung/conf/http.xml" ] && cp $TSUNG_CONF /root/tsung/conf/http.xml
ENVS=$( env | grep HTTP_SERVER_ )
for ENV in ${ENVS[@]}
do
sed -i "s@{{\s${ENV%%=*}\s}}@${ENV#*=}@" /root/tsung/conf/http.xml
done
ENVS=$( env | grep TSUNG_ )
for ENV in ${ENVS[@]}
do
sed -i "s@{{\s${ENV%%=*}\s}}@${ENV#*=}@" /root/tsung/conf/http.xml
done
試験用の Tsung の設定ファイル
http.xml
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
<clients>
<client host="localhost" use_controller_vm="true" />
</clients>
<servers>
<server host="{{ HTTP_SERVER_PORT_80_TCP_ADDR }}" port="{{ HTTP_SERVER_PORT_80_TCP_PORT }}" type="tcp"></server>
</servers>
<load>
<arrivalphase phase="1" duration="{{ TSUNG_DURATION }}" unit="minute">
<users interarrival="{{ TSUNG_INTERARRIVAL }}" unit="second"></users>
</arrivalphase>
</load>
<options>
<option type="ts_http" name="user_agent">
<user_agent probability="100">Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36</user_agent>
</option>
</options>
<sessions>
<session name="http-example" probability="100" type="ts_http">
<request>
<http url="/index.html" method="GET" version="1.1" ></http>
</request>
</session>
</sessions>
</tsung>
下記のように実行します
$ docker.io run -d -t \
-v /home/vagrant/log:/root/log \
-e TSUNG_LOG_DIR=/root/log \
--link HTTP_SERVER:HTTP_SERVER \
hexa/tsung
設定を変更する場合は -v や -e を使って各値を指定します
$ docker.io run -d -t \
-v /home/vagrant/conf:/root/conf \
-v /home/vagrant/log:/root/log \
-e TSUNG_CONF=/root/conf/http.xml \
-e TSUNG_LOG_DIR=/root/log \
-e TSUNG_INTERARRIVAL=1 \
-e TSUNG_DURATION=1 \
--link HTTP_SERVER:HTTP_SERVER \
hexa/tsung
http.xml に設定した試験が完了すると、-v で指定したホストのディレクトリに試験結果が出力されます
$ ls /home/vagrant/log/20140518-1612/
http.xml match.log tsung_controller@7b7078dcc539.log tsung.log