表題の通り。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アンサンブルを構成する事ができた。
以上。