docker-composeでzookeeperクラスターを立てるって本当に簡単にできるよね。
公式ドキュメントみれば、最新のイメージを使用してすぐにクラスターを構築できます。
公式がサポートしていないzookeeperのバージョンを使用したい時、
自分でイメージから作り直す必要があります。
現状dockerhubから取得できるのは3.4.9までです。
今回は、それより古いバージョンであるzookeeper3.4.6のイメージを作成します。
事前準備
baseとするdocker imageはopenjdk:8-jre-alpineです。
準備するものは4つです。
・Dockerfile
・docker-compose.yml
・docker-entrypoint.sh
・zookeeper-3.4.6.tar.gz
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
FROM openjdk:8-jre-alpine LABEL noffuy <3330072-noffuy@users.noreply.gitlab.com> # Install required packages RUN apk add --no-cache \ bash \ su-exec ENV ZOO_USER=zookeeper \ ZOO_CONF_DIR=/conf \ ZOO_DATA_DIR=/data \ ZOO_DATA_LOG_DIR=/datalog \ ZOO_LOG_DIR=/logs \ ZOO_PORT=2181 \ ZOO_TICK_TIME=2000 \ ZOO_INIT_LIMIT=5 \ ZOO_SYNC_LIMIT=2 \ ZOO_AUTOPURGE_PURGEINTERVAL=0 \ ZOO_AUTOPURGE_SNAPRETAINCOUNT=3 \ ZOO_MAX_CLIENT_CNXNS=60 # Add a user and make dirs RUN set -ex; \ adduser -D "$ZOO_USER"; \ mkdir -p "$ZOO_DATA_LOG_DIR" "$ZOO_DATA_DIR" "$ZOO_CONF_DIR" "$ZOO_LOG_DIR"; \ chown "$ZOO_USER:$ZOO_USER" "$ZOO_DATA_LOG_DIR" "$ZOO_DATA_DIR" "$ZOO_CONF_DIR" "$ZOO_LOG_DIR" ARG GPG_KEY=C61B346552DC5E0CB53AA84F59147497767E7473 ARG DISTRO_NAME=zookeeper-3.4.6 # Download Apache Zookeeper, verify its PGP signature, untar and clean up COPY ./zookeeper-3.4.6.tar.gz / RUN set -ex; \ apk add --no-cache --virtual .build-deps \ ca-certificates \ gnupg \ libressl; \ tar -xzf "$DISTRO_NAME.tar.gz"; \ mv "$DISTRO_NAME/conf/"* "$ZOO_CONF_DIR"; \ rm -rf "$GNUPGHOME" "$DISTRO_NAME.tar.gz" \ apk del .build-deps WORKDIR $DISTRO_NAME VOLUME ["$ZOO_DATA_DIR", "$ZOO_DATA_LOG_DIR", "$ZOO_LOG_DIR"] EXPOSE $ZOO_PORT 2888 3888 |
このDockerfileを利用してdocker-composeで起動します。
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
version: '3' services: zoo1: build: ./ restart: always ports: - 2181:2181 volumes: - ./log:/logs environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 ZOO_TICK_TIME: 4000 ZOO_INIT_LIMIT: 10 ZOO_LOG4J_PROP: INFO,ROLLINGFILE zoo2: build: ./ restart: always ports: - 2182:2181 volumes: - ./log:/logs environment: ZOO_MY_ID: 2 ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 ZOO_TICK_TIME: 4000 ZOO_INIT_LIMIT: 10 ZOO_LOG4J_PROP: INFO,ROLLINGFILE zoo3: build: ./ restart: always ports: - 2183:2181 volumes: - ./log:/logs environment: ZOO_MY_ID: 3 ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 ZOO_TICK_TIME: 4000 ZOO_INIT_LIMIT: 10 ZOO_LOG4J_PROP: INFO,ROLLINGFILE |
docker-entrypoint.sh
次にdocker-entrypoint.shを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#!/bin/bash set -e # Allow the container to be started with `--user` if [[ "$1" = 'zkServer.sh' && "$(id -u)" = '0' ]]; then chown -R "$ZOO_USER" "$ZOO_DATA_DIR" "$ZOO_DATA_LOG_DIR" "$ZOO_LOG_DIR" "$ZOO_CONF_DIR" exec su-exec "$ZOO_USER" "$0" "$@" fi # Generate the config only if it doesn't exist if [[ ! -f "$ZOO_CONF_DIR/zoo.cfg" ]]; then CONFIG="$ZOO_CONF_DIR/zoo.cfg" echo "clientPort=$ZOO_PORT" >> "$CONFIG" echo "dataDir=$ZOO_DATA_DIR" >> "$CONFIG" echo "dataLogDir=$ZOO_DATA_LOG_DIR" >> "$CONFIG" echo "tickTime=$ZOO_TICK_TIME" >> "$CONFIG" echo "initLimit=$ZOO_INIT_LIMIT" >> "$CONFIG" echo "syncLimit=$ZOO_SYNC_LIMIT" >> "$CONFIG" echo "autopurge.snapRetainCount=$ZOO_AUTOPURGE_SNAPRETAINCOUNT" >> "$CONFIG" echo "autopurge.purgeInterval=$ZOO_AUTOPURGE_PURGEINTERVAL" >> "$CONFIG" echo "maxClientCnxns=$ZOO_MAX_CLIENT_CNXNS" >> "$CONFIG" for server in $ZOO_SERVERS; do echo "$server" >> "$CONFIG" done fi # Write myid only if it doesn't exist if [[ ! -f "$ZOO_DATA_DIR/myid" ]]; then echo "${ZOO_MY_ID:-1}" > "$ZOO_DATA_DIR/myid" fi exec "$@" |
zookeeper-3.4.6.tar.gz
人によってはバージョンをもっと古いやつを使う人もいるかも知れません。
その時は、Dockerfileを適宜修正してね。
下記からダウンロードして下さい。
https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
この4つを準備したら
ディレクトリはこんな感じになります。
1 2 3 4 5 6 |
$ tree . ├── docker-compose.yml ├── docker-entrypoint.sh ├── Dockerfile └── zookeeper-3.4.6.tar.gz |
docker-compose up -d で起動すればオッケーです。
./log/配下にログが出力されるのでそこで確認して下さい。
本番で使えるかはまだ怪しいですが
開発・テスト環境などで大活躍
じゃあね〜〜〜〜。