docker-machineでZooKeeper

表題の通り。docker-machineでローカルにDockerサーバを起動し、そこにApache ZooKeeperのコンテナを稼働させてみる。また、稼働しているZooKeeperに対して、ローカルのMacからアクセスをする。

■ 環境

  • Docker 1.8.1
  • docker-machine 0.3.1
  • ZooKeeper 3.4.6
  • Mac OSX (10.10.5)

■ Dockerサーバ

docker-machineでローカルにVirtualBoxをDriverに起動する。docker-machine上における名前はわかりやすいように”local”とした。

$ docker-machine create -d virtualbox local
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env local
$

起動したらDockerサーバにアクセス可能になるように設定を入れる。

$ eval $(docker-machine env local)

これでdockerコマンドが利用可能となったはずだ。接続対象はdocker-machineで起動したDockerホストである。

$ docker version
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:49:29 UTC 2015
 OS/Arch:      darwin/amd64

Server:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:49:29 UTC 2015
 OS/Arch:      linux/amd64
$

■ ZooKeeperコンテナ

Dockerのコンテナを共有する公式のページにてZooKeeperを探す。

https://hub.docker.com

公式なものは無いようであるので、”Downloads“でソートし一番ダウンロードされているものにした。

https://hub.docker.com/r/jplock/zookeeper/

現時点ではコンテナイメージはローカルに存在しない。上記を`pull`する。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
$
$ docker pull jplock/zookeeper
Using default tag: latest
Pulling repository docker.io/jplock/zookeeper
  :
Status: Downloaded newer image for jplock/zookeeper:latest
$
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
jplock/zookeeper    latest              9ce81845fa8f        21 months ago       515.6 MB
$

※ 2015/09/02 追記 —>

latest“タグで`pull`したコンテナのZooKeeperのVersionは”3.4.5“であった。”3.4.6“を使用したい場合は、”3.4.6“タグの付いたコンテナを`pull`しなくてはならない。

※ 2015/09/02 追記 <—

■ Dockerコンテナ起動

ZooKeeperのコンテナを起動する。

$ docker run -d jplock/zookeeper

起動して接続と思ったが、このままではローカルのMacからはアクセスできないことに気がついた。起動時のオプションを追加する。その前に現在稼働しているコンテナの停止と削除。

$ docker stop 2aec96c41577
$ docker rm 2aec96c41577

コンテナ名を指定していなかったので、`docker stop`/`docker rm`の実行時にコンテナIDを指定しなければならなかった。次はコンテナ名を指定することにする。また、`-p`オプションを使用して2181ポートをDockerホストの外部に向けて開放する。

$ docker run -d -p 2181:2181 --name zookeeper jplock/zookeeper

確認してみると下記のようになっている。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
6a41317bfd37        jplock/zookeeper    "/opt/zookeeper-3.4.5"   5 seconds ago       Up 4 seconds        0.0.0.0:2181->2181/tcp   zookeeper
$

■ ローカルからの接続確認

DockerホストのIPを確認する。

$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM
local   *        virtualbox   Running   tcp://192.168.99.100:2376
$

これでローカルMacのzkCliコマンドでも接続ができるはずだ。

$ zkCli -server 192.168.99.100:2181
Connecting to 192.168.99.100:2181
Welcome to ZooKeeper!
JLine support is enabled

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.99.100:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: 192.168.99.100:2181(CONNECTED) 1]

接続ができた。

以上。

■ 関連

ZooKeeperのautopurge

Apache ZooKeeperにおいて表題の通り。以前のversionにはなかったような気がするのだがとても便利なので設定しておくべし。ちなみにどのversionから入ったのかは知らない。調べる…気も今はない。そのうち調べるかも。調べないかも。

■ 環境

  • ZooKeeper 3.4.6

■ autopurge

気がついたのはzoo_sample.cfgを元に、zoo.cfgをいつものように編集しようとした時である。

$ cat zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

最後にコメントアウトされているが2つの項目が書かれている。

  • autopurge.snapRetainCount
  • autopurge.purgeInterval

これらをコメントインさせておくと、”dataDir“で設定したディレクトリでトランザクションログやスナップショットファイルでディスクが氾濫し、ディスクが圧迫されるということが無くなるだろう。

以前はcronに下記ツールを実行するように設定していた。

zkCleanup.sh

ちなみに”autopurge“の設定項目は見てわかる通り、何世代分を残すかと実行間隔だけである。zookeeper.outには下記のようにログ出力されているはずだ。

2015-08-28 19:20:23,515 [myid:] - INFO  [PurgeTask:DatadirCleanupManager$PurgeTask@138] - Purge task started.
2015-08-28 19:20:23,515 [myid:] - INFO  [PurgeTask:DatadirCleanupManager$PurgeTask@144] - Purge task completed.

以上。

■ 関連

zookeeper.outの出力先

Apache ZooKeeperにおいて表題の通り。たまに忘れてしまうのでメモ。

■ 環境

  • ZooKeeper 3.4.6

■ zookeeper.out

`zkServer.sh start`を実行したカレントディレクトリに作成される。owner/groupはコマンドを実行したユーザのものとなる。

なぜコマンドを実行したカレントディレクトリになるかは、`zkEnv.sh`を見るとわかる。下記のようなコードがある。

$ cat zkEnv.sh
  :
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
    ZOO_LOG_DIR="."
fi
  :

これを元に、`zkServer.sh`の中で下記のように設定される。

$ cat zkServer.sh
  :
if [ ! -w "$ZOO_LOG_DIR" ] ; then
mkdir -p "$ZOO_LOG_DIR"
fi

_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"

case $1 in
start)
  :
    nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
  :

よってコマンドを実行したカレントディレクトリにデフォルトでは作成されてしまう。

ここまで見ればわかるように、環境変数”ZOO_LOG_DIR“を設定しておけば、そのディレクトリに`zookeeper.out`は作成されるようになる。`.bashrc`に書いてしまうなり、コマンド実行時に下記のようにすれば良いであろう。

$ ZOO_LOG_DIR=/path/to/dir zkServer.sh start

ちなみにHomebrewでインストールしたMacにおいては、下記のようになっている。

$ cat /usr/local/Cellar/zookeeper/3.4.6_1/bin/zkServer
#!/usr/bin/env bash
. "/usr/local/etc/zookeeper/defaults"
cd "/usr/local/Cellar/zookeeper/3.4.6_1/libexec/bin"
./zkServer.sh "$@"
$

`cd`でディレクトリを移動した後に`zkServer.sh`が実行されているので、この`cd`したディレクトリに作成されているはずだ。

以上。

■ 関連

複数のDockerホストをローカルで稼働

表題の通り。docker-machineを用いて複数のDockerホストの管理を少しかじってみる。

■ 環境

  • docker-machine 0.3.1
  • Mac OSX (10.10.5)

■ 1台のDockerホスト

先日のエントリで稼働させたDockerホストをそのまま利用する。現時点では下記の通り。

$ docker-machine ls
NAME ACTIVE DRIVER      STATE    URL                       SWARM
test        virtualbox  Running  tcp://192.168.99.100:2376
$

起動させただけでは上記のままである。docker-machineでVMを起動時に表示されたコマンドの通り環境変数に入れると表記が少し変わるようだ。実行しているシェルで、どのDockerホストにアクセスしているのかが把握できる。

$ eval $(docker-machine env test)
$
$ docker-machine ls
NAME ACTIVE DRIVER      STATE    URL                       SWARM
test *      virtualbox  Running  tcp://192.168.99.100:2376
$

■ 2台のDockerホスト

2台目を追加で起動する。

$ docker-machine create --driver virtualbox test2
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env test2
$

この状態で一覧を見てみる。

$ docker-machine ls
NAME  ACTIVE DRIVER      STATE    URL                       SWARM
test2        virtualbox  Running  tcp://192.168.99.101:2376
test  *      virtualbox  Running  tcp://192.168.99.100:2376
$

Dockerホストの管理が容易そうである。シェル毎に環境変数に入れる必要があるが、どこにアクセスしているのかも確認がしやすいだろう。boot2dockerの時は`~/.bash_profile`等に直書きしていたが、自身で起動・設定したDockerホストの時は環境変数から`unset`しなければならなかったりしたので、こちらの方が良いのかもしれない。

さらにSwarmで複数のDockerホストをひとつのDockerクラスタで扱う…というようなイメージになるのであろうか。順次見ていくことにする。

以上。

■ 関連

boot2dockerの代わりにdocker-machine

表題の通り。以前、どこかで『docker-machineはboot2dockerの代替ではない』といった記述を見かけた気がするのだが…。とりあえず`docker-machine`を試してみる。

■ 環境

  • boot2docker 1.8.0
  • docker-machine 0.3.1
  • Mac OSX (10.10.5)

■ boot2docker

boot2dockerでVMを起動しようとしたところ下記のようなメッセージが出力された。今回のエントリのきっかけである。

$ boot2docker start

  WARNING: The 'boot2docker' command line interface is officially deprecated.

  Please switch to Docker Machine (https://docs.docker.com/machine/) ASAP.

  Docker Toolbox (https://docker.com/toolbox) is the recommended install method.

Waiting for VM and Docker daemon to start...
................oooooooo
Started.
  :
$

`docker-machine`に移行しろ、ということか。`docker-machine`の`help`を見ると、`boot2docker`で起動しているVMに対してもアクションが起こせそうである。しかし折角なのでいちから`docker-machine`でやってみることにする。

まずはboot2dockerで起動していたVMを削除しておく。

$ boot2docker delete

■ docker-machine

そもそものイメージがあまりできていないのだが、docker-machineはboot2dockerのようにDockerサービスを稼働させるVM相当のものを起動・管理させるもの、と自身の中ではイメージしている。その為、Mac上ではVirtualBox等の”driver“を指定する。boot2dockerと同じようなものであるが、boot2dockerはVirtualBox固定であったものが、EC2やAzure、VMware、OpenStack等々を対象にすることができるようだ。

boot2dockerと実質的には変わらないかもしれないが、現状と同じVirtualBoxでやってみる。

$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM
$

もちろんこの時点では対象の”machine“は存在しない。`create`で作成するのであろう。試してみる。

$ docker-machine create
  :
You must specify a machine name
$

多くのオプションが設定できるようだが、”machine name“を指定しなければならないようだ。ここでは仮なので”test“で試してみる。

$ docker-machine create test
Creating CA: /Users/withsin/.docker/machine/certs/ca.pem
Creating client certificate: /Users/withsin/.docker/machine/certs/cert.pem
Error creating machine: --url option is required when no driver is selected
You will want to check the provider to make sure the machine and associated resources were properly removed.

provider“を指定する必要があるようだが、`help`を見ると”–driver“を指定すれば良いようである。

$ docker-machine create --driver "virtualbox" test
Image cache does not exist, creating it at /Users/withsin/.docker/machine/cache...
No default boot2docker iso found locally, downloading the latest release...
Downloading https://github.com/boot2docker/boot2docker/releases/download/v1.8.1/boot2docker.iso to /Users/withsin/.docker/machine/cache/boot2docker.iso...
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env test

boot2dockerと同じISOを使用するようである。VirtualBoxでVMを稼働させ、同じようにアクセスをするようだ。

$ docker-machine env test
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/withsin/.docker/machine/machines/test"
export DOCKER_MACHINE_NAME="test"
# Run this command to configure your shell:
# eval "$(docker-machine env test)"
$
$ docker-machine ls
NAME ACTIVE DRIVER     STATE   URL                       SWARM
test        virtualbox Running tcp://192.168.99.100:2376

boot2dockerコマンドを今後は利用しないようにしよう。`boot2docker`をクライアントコマンドとして使用しないように削除してしまっても良いのかもしれない。

以上。

■ 関連