ZooKeeper@Docker – シングルノード

表題の環境を試す。

■ 環境

  • ZooKeeper 3.4.9
  • Docker for Mac 1.12.1
  • Mac OSX ElCapitan

■ run

ZooKeeperをとりあえずシングルノードで稼働させてみる。

$ docker run -d --name zk zookeeper
9d2f562d9475d830fb4e844dcff69e338c7fc450666919ffb6e50f4de22c561f
$

アクセスするには`zkCli`用のコンテナを起動する。

$ docker run -ti --rm --link zk:zk zookeeper zkCli.sh -server zk
Connecting to zk
2016-10-04 19:25:37,817 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.9-1757313, built on 08/23/2016 06:50 GMT
2016-10-04 19:25:37,820 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=9ed51322280c
2016-10-04 19:25:37,820 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_92-internal
2016-10-04 19:25:37,822 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2016-10-04 19:25:37,822 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/usr/lib/jvm/java-1.8-openjdk/jre
2016-10-04 19:25:37,822 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/zookeeper-3.4.9/bin/../build/classes:/zookeeper-3.4.9/bin/../build/lib/*.jar:/zookeeper-3.4.9/bin/../lib/slf4j-log4j12-1.6.1.jar:/zookeeper-3.4.9/bin/../lib/slf4j-api-1.6.1.jar:/zookeeper-3.4.9/bin/../lib/netty-3.10.5.Final.jar:/zookeeper-3.4.9/bin/../lib/log4j-1.2.16.jar:/zookeeper-3.4.9/bin/../lib/jline-0.9.94.jar:/zookeeper-3.4.9/bin/../zookeeper-3.4.9.jar:/zookeeper-3.4.9/bin/../src/java/lib/*.jar:/conf:
2016-10-04 19:25:37,822 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64:/usr/lib/jvm/java-1.8-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2016-10-04 19:25:37,823 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2016-10-04 19:25:37,823 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=
2016-10-04 19:25:37,823 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Linux
2016-10-04 19:25:37,823 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=amd64
2016-10-04 19:25:37,824 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=4.4.20-moby
2016-10-04 19:25:37,824 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=root
2016-10-04 19:25:37,824 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/root
2016-10-04 19:25:37,824 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/zookeeper-3.4.9
2016-10-04 19:25:37,825 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=zk sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@3eb07fd3
2016-10-04 19:25:37,845 [myid:] - INFO  [main-SendThread(zk:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server zk/172.17.0.2:2181. Will not attempt to authenticate using SASL (unknown error)
Welcome to ZooKeeper!
JLine support is enabled
2016-10-04 19:25:37,915 [myid:] - INFO  [main-SendThread(zk:2181):ClientCnxn$SendThread@876] - Socket connection established to zk/172.17.0.2:2181, initiating session
2016-10-04 19:25:37,958 [myid:] - INFO  [main-SendThread(zk:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server zk/172.17.0.2:2181, sessionid = 0x1578ab473ab0001, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

[zk: zk(CONNECTED) 0]

なるほど。

先日”latest“のタグでDockerコンテナを`pull`しているが、現状の最新版である”3.4.9“で動いている様子。JavaはOpenJDKの1.8であるようだ。

以上。

■ 関連

ZooKeeperの公式Dockerコンテナ

表題の通り。

■ 環境

  • ZooKeeper 3.4.9
  • Docker for Mac 1.12.1
  • Mac OSX El Capitan

■ ZooKeeper

何気なく下記コマンドを実行したところ、”OFFICIAL“なコンテナがあった。以前はなかったような気がするのだが作成されたようである。

$ docker search zookeeper
NAME                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
jplock/zookeeper              Builds a docker image for Zookeeper versio...   147                  [OK]
mesoscloud/zookeeper          ZooKeeper                                       63                   [OK]
zookeeper                     Apache ZooKeeper is an open-source server ...   14        [OK]
digitalwonderland/zookeeper   Latest Zookeeper - clusterable                  9                    [OK]
  :
$

OFFICIAL“であるのは心強い。

https://hub.docker.com/_/zookeeper/

なかなか面白そうである。時間を作ってDockerfileもちゃんと確認してみたいと思う。

以上。

■ 関連

ベースとなるコンテナをalipneに変更

Dockerにおいて表題の通り。

■ 環境

  • Docker 1.11.1

■ きっかけ

今までは慣れたCentOSにしていたのだが、コンテナにログインして作業をする機会もほとんどないので軽量だと噂のalpineに変更してみることにする。今回作業をするのは下記ZooKeeperのコンテナである。

ZooKeeperの独自Dockerfileを作成

■ Dockerfile

更新後のDockerfileは下記のようになった。

FROM alpine
MAINTAINER withsin <withsin@gmail.com>

ENV ZOO_VERSION=3.4.8

RUN apk --no-cache add openjdk8-jre bash
RUN mkdir /opt \
    && wget -O - http://archive.apache.org/dist/zookeeper/zookeeper-${ZOO_VERSION}/zookeeper-${ZOO_VERSION}.tar.gz | tar zx -C /opt \
    && ln -s /opt/zookeeper-${ZOO_VERSION} /opt/zookeeper \
    && mkdir /opt/zookeeper/data \
    && chown -R root:root /opt/zookeeper-${ZOO_VERSION} \
    && mv /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg

EXPOSE 2181 2888 3888

CMD ["/opt/zookeeper/bin/zkServer.sh", "start-foreground"]

変更点は下記の通り。

  1. ベースのコンテナをalpineに変更
  2. `yum install`を`apk add`に
  3. ZooKeeperの各種スクリプトでbashが使用されているのでインストール
  4. ZooKeeperのインストール前に/optを作成(alpineでは存在しなかったので)
  5. curlコマンドは存在しなかったのでwgetで代用
  6. `yum clean all`に該当する`apk cache clean`は、インストール時に`–no-cache`とすることで不要

■ build

ビルドした結果は下記の通り。

$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
withsin/zookeeper       3.4.8-alpine        cb316b792c95        About an hour ago   154.9 MB
withsin/zookeeper       latest              cb316b792c95        About an hour ago   154.9 MB
  :
alpine                  latest              d7a513a663c1        4 weeks ago         4.798 MB
  :
withsin/zookeeper       3.4.8               3d8bc0053ba6        9 weeks ago         497.5 MB
  :
$

alpineがそもそも5Mもないのだが、JREを入れたせいか155M程度まで膨れ上がった。しかし、以前のCentOS時の500Mに比べると3分の1以下になっていることが分かる。今後はalpineをベースのコンテナとして採用することにする。

以上。

■ 関連

ZooKeeper-3.4.8 Docker Container

Apache ZooKeeperにおいて表題の通り。2016/02/20にZooKeeper 3.4.8がリリースされたので、以前作成したDockerの”Automated Build“のDockerfileを修正する。

■ 環境

  • Apache ZooKeeper 3.4.8
  • Docker 1.10.1

■ 3.4.7

以前作成した時は”3.4.7“のリリース直後であったが、その後”3.4.7“にバグが見つかりこのversionは切り戻された。しかしそのまま残しておいたので今回は”3.4.8“にupdateする。

DockerHub AutomatedBuild

■ Dockerfile

以前のDockerfileから少し変更し下記のようにした。

FROM centos:7
MAINTAINER withsin <withsin@gmail.com>

ENV ZOO_VERSION=3.4.8

RUN yum update -y
RUN yum install -y java-1.8.0-openjdk
RUN curl http://archive.apache.org/dist/zookeeper/zookeeper-${ZOO_VERSION}/zookeeper-${ZOO_VERSION}.tar.gz | tar zx -C /opt
RUN ln -s /opt/zookeeper-${ZOO_VERSION} /opt/zookeeper
RUN mkdir /opt/zookeeper/data
RUN chown -R root:root /opt/zookeeper-${ZOO_VERSION}
RUN mv /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
RUN yum clean all

EXPOSE 2181 2888 3888

CMD ["/opt/zookeeper/bin/zkServer.sh", "start-foreground"]

ZooKeeperのversionを1箇所に変更。かつ今回の”3.4.8“にしている。

一度、ローカルでDockerfileに問題ないか確認。

$ docker build -t withsin/zookeeper:3.4.8 .

buildに問題がなさそうであったので、gitにcommitしてGitHubにpushしてある。これで前回のエントリの通り”Automated Build“でコンテナも作成さえるはずである。

以上。

■ 関連

ZooKeeperに接続しているコネクション一覧

Apache ZooKeeperにおいて表題の通り。

■ 環境

Apache ZooKeeper 3.4.6

■ 4文字コマンド

ふたつの4文字コマンドで表題の結果を得ることができる。`cons`と`stat`である。

`cons`はそのままコネクションの一覧を取得。`stat`はコネクションの一覧とZooKeeperサーバの状態を取得することができる。各コネクションの情報についても`stat`で得られる結果よりも`cons`で得られる情報の方が多い。下記にそれぞれ取得してみたものを表示する。

`cons`

$ echo cons | nc localhost 2181
 /192.168.33.11:47949[1](queued=0,recved=254366,sent=254366,sid=0x151af8e909e001f,lop=PING,est=1453205223034,to=10000,lcxid=0x0,lzxid=0x3c8f7,lresp=1454053106380,llat=0,minlat=0,avglat=0,maxlat=5)
 /192.168.33.11:37597[1](queued=0,recved=282630,sent=282630,sid=0x151af8e909e001e,lop=PING,est=1453205224036,to=10000,lcxid=0x6e68,lzxid=0x3c8f7,lresp=1454053107375,llat=1,minlat=0,avglat=0,maxlat=22)
 /127.0.0.1:38444[0](queued=0,recved=1,sent=0)
 /192.168.110.151:47948[1](queued=0,recved=339112,sent=339112,sid=0x151af8e909e0020,lop=PING,est=1453205223034,to=10000,lcxid=0x14b0a,lzxid=0x3c8f7,lresp=1454053106380,llat=0,minlat=0,avglat=0,maxlat=34)
 /192.168.33.11:47950[1](queued=0,recved=2583739,sent=2583763,sid=0x151af8e909e0021,lop=GETC,est=1453205223034,to=10000,lcxid=0x238b1d,lzxid=0x3c8f7,lresp=1454053108920,llat=0,minlat=0,avglat=0,maxlat=19)
 /192.168.33.11:42157[1](queued=0,recved=254370,sent=254371,sid=0x151af8e909e001d,lop=PING,est=1453205224037,to=10000,lcxid=0x4,lzxid=0x3c8f7,lresp=1454053107376,llat=0,minlat=0,avglat=0,maxlat=4)

$

`stat`

$ echo stat | nc localhost 2181
Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT
Clients:
 /127.0.0.1:38632[0](queued=0,recved=1,sent=0)
 /192.168.33.11:47949[1](queued=0,recved=254442,sent=254442)
 /192.168.33.11:37597[1](queued=0,recved=282716,sent=282716)
 /192.168.33.11:47948[1](queued=0,recved=339214,sent=339214)
 /192.168.33.11:47950[1](queued=0,recved=2584450,sent=2584474)
 /192.168.33.11:42157[1](queued=0,recved=254446,sent=254447)

Latency min/avg/max: 0/0/41
Received: 14954939
Sent: 14955199
Connections: 6
Outstanding: 0
Zxid: 0x3c909
Mode: standalone
Node count: 60
$

どのホストからの接続が多いのかを見ることができるであろう。上記は”standalone“で稼働しているZooKeeperに対して、Dockerのクラスタ情報を格納しているのだがコネクションが5本も張られているようである。ちなみに”192.168.33.11“でどのプロセスが接続しているのかを確認してみる。

$ ssh 192.168.33.11
[withsin@192.168.33.11 ~]$ sudo lsof -i :47949

これから3つは”docker“プロセスが接続していることを確認できた。しかし下記2つのポートはどのプロセスが使用しているのか前述のコマンドでは判明しなかった。

  • 37597
  • 42157

これはまた別途調べる方法について確認する。

以上。