負荷試験用のコンテナ

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 を指定するためにコンテナに名前を付けておきます

```bash:
$ 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 の設定ファイルを設定します

```bash: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 の設定ファイル

```xml: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>
```

下記のように実行します

```bash:
$ 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 を使って各値を指定します

```bash:
$ 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
```