CLOVER🍀

That was when it all began.

Infinispan ServerのDockerイメージを作って、クラスタを構成してみる

練習的に、クラスタを構成するDockerイメージ、コンテナを使ってみようかなと思いまして。

今回は、Infinispan ServerをDockerイメージとして作成して、クラスタ化されたMemcached Serverとして遊んでみたいと思います。

Dockerfile

作成したDockerfileはこちら。
Dockerfile

FROM java:8

ENV INFINISPAN_VERSION 7.2.3.Final

RUN mkdir -p /opt/infinispan

WORKDIR /opt/infinispan

RUN wget -q http://downloads.jboss.org/infinispan/$INFINISPAN_VERSION/infinispan-server-$INFINISPAN_VERSION-bin.zip && \
    unzip infinispan-server-$INFINISPAN_VERSION-bin.zip && \
    mv infinispan-server-$INFINISPAN_VERSION infinispan-server && \
    chmod +x infinispan-server/bin/standalone.sh && \
    chmod +x infinispan-server/bin/clustered.sh

EXPOSE 8080 8181 9990 11211 11222

ENTRYPOINT ["infinispan-server/bin/clustered.sh"]

思いっきり、JBossのInfinispan ServerのDockerfileが元ネタになっています。

jboss/infinispan-server
https://registry.hub.docker.com/u/jboss/infinispan-server/

まあ、ベースイメージを含めて、多少変えましたが…。

ENTRYPOINTとして「clustered.sh」を指定しているので、クラスタ構成前提で起動します。

Dockerイメージのビルド

カレントディレクトリにDockerfileがある状態で、以下のコマンドでビルド。

$ docker build -t infinispan-server:7.2.3 .

Dockerコンテナを起動し、Infinispan Serverクラスタを構成する

で、Dockerコンテナを起動するわけですが、ここでは3つNodeを起動することにします。

## Node 1
$ docker run -it --rm --net=host infinispan-server:7.2.3 -Djboss.node.name=node1

## Node 2
$ docker run -it --rm --net=host infinispan-server:7.2.3 -Djboss.socket.binding.port-offset=1000 -Djboss.node.name=node2

## Node 3
$ docker run -it --rm --net=host infinispan-server:7.2.3 -Djboss.socket.binding.port-offset=2000 -Djboss.node.name=node3

ポイントは、マルチキャストが使えるように「--net=host」が入っていることです。これで、ホスト側のネットワークを使います。なので、clustered.shに渡すパラメーターは、普通にInfinispan Serverを単一のホストで複数起動する時と変わりません。

ここでは、ENTRYPOINTのclustered.shに、-Djboss〜の各種パラメーターをそのまま渡すようにしました。
※ENTRYPOINTを使った場合には実行時に引数が指定できることを指摘していただいた@makingさん、ありがとうございます!

動作確認

あとは、クラスタ化されたMemcached Serverとなっているか確認するだけです。

以下のコマンドは、ホスト側で実行しています。

まず、Node 1に接続してデータ登録。

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set key1 0 600 6
value1
STORED
quit
Connection closed by foreign host.

Node 2に接続して、Node 1で登録したデータの確認、そして新しいデータを登録します。

$ telnet localhost 12211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
get key1
VALUE key1 0 6
value1
END
set key2 0 600 6
value2
STORED
quit
Connection closed by foreign host.

Node 3で、Node 1、Node 2で登録したデータを参照します。

$ telnet localhost 13211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
get key1
VALUE key1 0 6
value1
END
get key2
VALUE key2 0 6
value2
END
quit
Connection closed by foreign host.

いずれもOKそうですね。

やりたいことはなんとかできた感じです。Dockerイメージを作るところ(Infinispan Serverのダウンロード)に妙に時間がかかったところが難点でした…。