Linux版本:Ubuntu 16.04.2 LTS
Docker版本:Docker version 17.09.0-ce, build afdb6d4
Docker Compose版本:docker-compose version 1.22.0, build f46880fe
JDK版本:java version "1.8.0_102"
Zookeeper版本:zookeeper-3.4.14
相关构建配置文件如下:
JDK Dockerfile
From ubuntu:16.04.4
MAINTAINER xxxxx
ADD jdk-8u102-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME=/usr/local/jdk1.8.0_102
ENV PATH=${JAVA_HOME}/bin:$PATH
ENV CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
RUN echo "export JAVA_HOME=/usr/local/jdk1.8.0_102" >> /etc/profile
RUN echo "export PATH=${JAVA_HOME}/bin:$PATH" >> /etc/profile
RUN echo "export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar" >> /etc/profile
RUN ["/bin/bash","-c","source /etc/profile"]
RUN apt-get update && apt-get install -y net-tools iputils-ping vim iptables
docker build --no-cache -t jdk:1.8.0.102 images/jdk
Zookeeper Dockerfile
From jdk:1.8.0.102
MAINTAINER xxxxx
ADD zookeeper-3.4.14.tar.gz /usr/local/
RUN mv /usr/local/zookeeper-3.4.14 /usr/local/zookeeper
ENV ZOOKEEPER_HOME=/usr/local/zookeeper \
ZOOKEEPER_CONF_DIR=/usr/local/zookeeper/conf \
ZOOKEEPER_DATA_DIR=/usr/local/zookeeper/data \
ZOOKEEPER_DATA_LOG_DIR=/usr/local/zookeeper/datalog \
ZOOKEEPER_LOG_DIR=/usr/local/zookeeper/logs \
ZOOKEEPER_TICK_TIME=2000 \
ZOOKEEPER_INIT_LIMIT=5 \
ZOOKEEPER_SYNC_LIMIT=2 \
ZOOKEEPER_AUTOPURGE_PURGEINTERVAL=0 \
ZOOKEEPER_AUTOPURGE_SNAPRETAINCOUNT=3 \
ZOOKEEPER_MAX_CLIENT_CNXNS=60
RUN mkdir -p "$ZOOKEEPER_DATA_DIR" "$ZOOKEEPER_DATA_LOG_DIR" "$ZOOKEEPER_LOG_DIR"
RUN sed -i 's/zookeeper.log.dir=./zookeeper.log.dir=\/usr\/local\/zookeeper\/logs/g' $ZOOKEEPER_HOME/conf/log4j.properties
RUN sed -i 's/zookeeper.tracelog.dir=./zookeeper.tracelog.dir=\/usr\/local\/zookeeper\/logs/g' $ZOOKEEPER_HOME/conf/log4j.properties
WORKDIR $ZOOKEEPER_HOME
VOLUME ["$ZOOKEEPER_DATA_DIR", "$ZOOKEEPER_DATA_LOG_DIR", "$ZOOKEEPER_LOG_DIR"]
EXPOSE 2181 2888 3888
ENV PATH=$PATH:$ZOOKEEPER_HOME/bin \
ZOOCFGDIR=$ZOOKEEPER_CONF_DIR \
ZOO_DATADIR=$ZOOKEEPER_DATA_DIR
COPY zookeeper-entrypoint.sh /
RUN chmod +x /zookeeper-entrypoint.sh
ENTRYPOINT ["/zookeeper-entrypoint.sh"]
zookeeper-entrypoint.sh
#!/bin/bash
set -e
if [[ ! -f "$ZOOKEEPER_CONF_DIR/zoo.cfg" ]]; then
CONFIG="$ZOOKEEPER_CONF_DIR/zoo.cfg"
echo "clientPort=2181" >> "$CONFIG"
echo "dataDir=$ZOOKEEPER_DATA_DIR" >> "$CONFIG"
echo "dataLogDir=$ZOOKEEPER_DATA_LOG_DIR" >> "$CONFIG"
echo "tickTime=$ZOOKEEPER_TICK_TIME" >> "$CONFIG"
echo "initLimit=$ZOOKEEPER_INIT_LIMIT" >> "$CONFIG"
echo "syncLimit=$ZOOKEEPER_SYNC_LIMIT" >> "$CONFIG"
echo "autopurge.snapRetainCount=$ZOOKEEPER_AUTOPURGE_SNAPRETAINCOUNT" >> "$CONFIG"
echo "autopurge.purgeInterval=$ZOOKEEPER_AUTOPURGE_PURGEINTERVAL" >> "$CONFIG"
echo "maxClientCnxns=$ZOOKEEPER_MAX_CLIENT_CNXNS" >> "$CONFIG"
for server in $ZOOKEEPER_SERVERS; do
echo "$server" >> "$CONFIG"
done
fi
if [[ ! -f "$ZOOKEEPER_DATA_DIR/myid" ]]; then
echo "${ZOOKEEPER_MY_ID:-1}" > "$ZOOKEEPER_DATA_DIR/myid"
fi
$ZOOKEEPER_HOME/bin/zkServer.sh start-foreground
exec "$@"
docker build --no-cache -t zookeeper:3.4.14 images/zookeeper
docker-compose.yml
version: '3.4'
services:
zookeeper1:
image: zookeeper:3.4.14
restart: always
hostname: zookeeper1
container_name: zookeeper1
ports:
- 12181:2181
volumes:
- "/home/docker/zookeeper-3.4.14/cluster/zookeeper1/data:/usr/local/zookeeper/data"
- "/home/docker/zookeeper-3.4.14/cluster/zookeeper1/datalog:/usr/local/zookeeper/datalog"
- "/home/docker/zookeeper-3.4.14/cluster/zookeeper1/logs:/usr/local/zookeeper/logs"
environment:
ZOOKEEPER_MY_ID: 1
ZOOKEEPER_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zookeeper2:2888:3888 server.3=zookeeper3:2888:3888
zookeeper2:
image: zookeeper:3.4.14
restart: always
hostname: zookeeper2
container_name: zookeeper2
ports:
- 22181:2181
volumes:
- "/home/docker/zookeeper-3.4.14/cluster/zookeeper2/data:/usr/local/zookeeper/data"
- "/home/docker/zookeeper-3.4.14/cluster/zookeeper2/datalog:/usr/local/zookeeper/datalog"
- "/home/docker/zookeeper-3.4.14/cluster/zookeeper2/logs:/usr/local/zookeeper/logs"
environment:
ZOOKEEPER_MY_ID: 2
ZOOKEEPER_SERVERS: server.1=zookeeper1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zookeeper3:2888:3888
zookeeper3:
image: zookeeper:3.4.14
restart: always
hostname: zookeeper3
container_name: zookeeper3
ports:
- 32181:2181
volumes:
- "/home/docker/zookeeper-3.4.14/cluster/zookeeper3/data:/usr/local/zookeeper/data"
- "/home/docker/zookeeper-3.4.14/cluster/zookeeper3/datalog:/usr/local/zookeeper/datalog"
- "/home/docker/zookeeper-3.4.14/cluster/zookeeper3/logs:/usr/local/zookeeper/logs"
environment:
ZOOKEEPER_MY_ID: 3
ZOOKEEPER_SERVERS: server.1=zookeeper1:2888:3888 server.2=zookeeper2:2888:3888 server.3=0.0.0.0:2888:3888
networks:
bridge:
external:
name: bridge
docker-compose up
宿主主机测试验证Zookeeper集群
bin/zkCli.sh -server 192.168.0.1:12181,192.168.0.1:22181,192.168.0.1:32181
[zk: 192.168.0.1:12181,192.168.0.1:22181,192.168.0.1:32181(CONNECTED) 0] ls /
[zookeeper]