練習的に、クラスタを構成する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コンテナを起動し、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のダウンロード)に妙に時間がかかったところが難点でした…。