DockerでZooKeeperアンサンブル

表題の通り。Dockerでやる意味は無い気もするがやってみる。

■ 環境

  • Docker 1.9.0
  • Apache ZooKeeper 3.4.6

■ Docker

`docker-machine`で稼働させている。versionは下記の通り。

$ docker version
Client:
 Version:      1.9.0
 API version:  1.21
 Go version:   go1.5.1
 Git commit:   76d6bc9
 Built:        Tue Nov  3 21:17:46 UTC 2015
 OS/Arch:      darwin/amd64

Server:
 Version:      1.9.0
 API version:  1.21
 Go version:   go1.4.3
 Git commit:   76d6bc9
 Built:        Tue Nov  3 19:20:09 UTC 2015
 OS/Arch:      linux/amd64
$

使用するコンテナイメージは”jplock/zookeeper:3.4.6“。

■ ZooKeeper

ZooKeeperコンテナを3つ稼働させる。”jplock/zookeeper:3.4.6“には”ENTRYPOINT“で”zkServer.sh“が実行されるようになっているので、これを実行させないように起動している。

$ docker run -ti --entrypoint=/bin/bash --name zoo1 jplock/zookeeper:3.4.6
root@07d92a8be38e:/opt/zookeeper#
$
$ docker run -ti --entrypoint=/bin/bash --name zoo2 jplock/zookeeper:3.4.6
root@f85b1b8ee23a:/opt/zookeeper#
$
$ docker run -ti --entrypoint=/bin/bash --name zoo3 jplock/zookeeper:3.4.6
root@3aca4b69a17a:/opt/zookeeper#
$
$ docker ps
CONTAINER ID        IMAGE                    COMMAND             CREATED              STATUS              PORTS                          NAMES
3aca4b69a17a        jplock/zookeeper:3.4.6   "/bin/bash"         About a minute ago   Up About a minute   2181/tcp, 2888/tcp, 3888/tcp   zoo3
f85b1b8ee23a        jplock/zookeeper:3.4.6   "/bin/bash"         About a minute ago   Up About a minute   2181/tcp, 2888/tcp, 3888/tcp   zoo2
07d92a8be38e        jplock/zookeeper:3.4.6   "/bin/bash"         About a minute ago   Up About a minute   2181/tcp, 2888/tcp, 3888/tcp   zoo1
$

コンテナを起動させた後は`control-P`→`control-Q`でデタッチしている。

起動したコンテナのIPを調べる。`attach`してそれぞれコマンドで調べても良いのだが、`inspect`で表示の中から見てみる。

$ docker inspect zoo1 zoo2 zoo3
[
{
    "Id": "07d92a8be38ef00a645b35f30a83ca4014156a780b92d305acbbf68ded892d75",
      :
                    "IPAddress": "172.17.0.2",
      :
                    "IPAddress": "172.17.0.3",
      :
                    "IPAddress": "172.17.0.4",
      :
}
$

IPが判明したので”zoo.cfg“に追記する。追記する内容は下記の通り。

server.1=172.17.0.2:2888:3888
server.2=172.17.0.3:2888:3888
server.3=172.17.0.4:2888:3888

また、上記と同じIDをそれぞれ”/tmp/zookeeper“にmyidファイルを作成している。

root@07d92a8be38e:/opt/zookeeper# echo 1 > /tmp/zookeeper/myid

以上で設定は終わったので、それぞれ”zkServer.sh“で起動する。

$ docker attach zoo1
root@07d92a8be38e:/opt/zookeeper# ./bin/zkServer.sh start
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
root@07d92a8be38e:/opt/zookeeper#
$
$ docker attach zoo2
root@f85b1b8ee23a:/opt/zookeeper# ./bin/zkServer.sh start
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
root@f85b1b8ee23a:/opt/zookeeper#
$
$ docker attach zoo3
root@3aca4b69a17a:/opt/zookeeper# ./bin/zkServer.sh start
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
root@3aca4b69a17a:/opt/zookeeper#
$

クライアント用に別途コンテナを起動し、確認してみる。

$ docker run -ti --entrypoint=/bin/bash --name client jplock/zookeeper:3.4.6
root@9b69a99fb003:/opt/zookeeper# ./bin/zkCli.sh -server 172.17.0.2:2181
[zk: 172.17.0.2:2181(CONNECTED) 0]
[zk: 172.17.0.2:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: 172.17.0.2:2181(CONNECTED) 1] create /test test
Created /test
[zk: 172.17.0.2:2181(CONNECTED) 2] ls /
[test, zookeeper]
[zk: 172.17.0.2:2181(CONNECTED) 3] quit
Quitting...
root@9b69a99fb003:/opt/zookeeper# ./bin/zkCli.sh -server 172.17.0.3:2181
[zk: 172.17.0.3:2181(CONNECTED) 0] ls /
[test, zookeeper]
[zk: 172.17.0.3:2181(CONNECTED) 1] get /test
test
cZxid = 0x100000002
ctime = Tue Nov 17 10:22:40 UTC 2015
mZxid = 0x100000002
mtime = Tue Nov 17 10:22:40 UTC 2015
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: 172.17.0.3:2181(CONNECTED) 2]

クライアント用のコンテナから”zoo1“コンテナ上のZooKeeperに接続し、”/test“を作成。その後、”zoo2“コンテナのZooKeeperに接続し内容を確認してみた。

Dockerコンテナ上でもZooKeeperアンサンブルを構成する事ができた。

以上。

■ 関連