- 更改docker镜像源
vi /etc/default/docker
DOCKER_OPTS=”–registry-mirror=http://aad0405c.m.daocloud.io” - 拉去zookeeper镜像
docker pull garland/zookeeper //不要使用官方的zookeeper;garland/zookeeper镜像有些额外配置,对新手来说非常友好 - 启动集群
docker run -d \
--name=zk1 \
--net=host \
-e SERVER_ID=1 \
-e ADDITIONAL_ZOOKEEPER_1=server.1=localhost:2888:3888 \
-e ADDITIONAL_ZOOKEEPER_2=server.2=localhost:2889:3889 \
-e ADDITIONAL_ZOOKEEPER_3=server.3=localhost:2890:3890 \
-e ADDITIONAL_ZOOKEEPER_4=clientPort=2181 \
garland/zookeeper
docker run -d \
--name=zk2 \
--net=host \
-e SERVER_ID=2 \
-e ADDITIONAL_ZOOKEEPER_1=server.1=localhost:2888:3888 \
-e ADDITIONAL_ZOOKEEPER_2=server.2=localhost:2889:3889 \
-e ADDITIONAL_ZOOKEEPER_3=server.3=localhost:2890:3890 \
-e ADDITIONAL_ZOOKEEPER_4=clientPort=2182 \
garland/zookeeper
docker run -d \
--name=zk3 \
--net=host \
-e SERVER_ID=3 \
-e ADDITIONAL_ZOOKEEPER_1=server.1=localhost:2888:3888 \
-e ADDITIONAL_ZOOKEEPER_2=server.2=localhost:2889:3889 \
-e ADDITIONAL_ZOOKEEPER_3=server.3=localhost:2890:3890 \
-e ADDITIONAL_ZOOKEEPER_4=clientPort=2183 \
garland/zookeeper
–net=host指令指定改容器使用host网络模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用使用宿主机的IP和端口,不用任何NAT转换,就如直接跑在宿主机中的进程一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
-e 指定镜像创建完毕执行的命令的参数, garland/zookeeper镜像创建完容器会执行/opt/run.sh,-e指定的参数就是run.sh运行时的参数,run.sh内容如下:
#!/bin/sh
ZOO_CFG="/opt/zookeeper/conf/zoo.cfg"
# Output server ID
echo "server id (myid): ${SERVER_ID}"
echo "${SERVER_ID}" > /tmp/zookeeper/myid
# Add additional ZooKeeper servers into the zoo.cfg file
echo "${ADDITIONAL_ZOOKEEPER_1}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_2}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_3}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_4}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_5}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_6}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_7}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_8}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_9}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_10}" >> ${ZOO_CFG}
# Start Zookeeper
/opt/zookeeper/bin/zkServer.sh start-foreground
- 由于是使用host网络模式,所以在连接zookeeper时可以直接使用宿主机的IP,如
zkCli.cmd -server 192.168.74.131:2181
zkCli.cmd -server 192.168.74.131:2182
zkCli.cmd -server 192.168.74.131:2183
- 附上garland/zookeeper Darkfile文件
# DOCKER-VERSION 1.0.1
# VERSION 0.5
# SOURCE https://github.com/jplock/docker-zookeeper
FROM debian:jessie
MAINTAINER Justin Plock <justin@plock.net>
RUN apt-get update && apt-get install -y openjdk-7-jre-headless wget
RUN wget -q -O - http://apache.mirrors.pair.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz | tar -xzf - -C /opt \
&& mv /opt/zookeeper-3.4.6 /opt/zookeeper \
&& cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg \
&& mkdir -p /tmp/zookeeper
ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
ADD ./run.sh /opt/run.sh
RUN chmod 777 /opt/run.sh
EXPOSE 2181 2888 3888
WORKDIR /opt/zookeeper
VOLUME ["/opt/zookeeper/conf", "/tmp/zookeeper"]
CMD ["/opt/run.sh"]
- 附上一些常用命令
- 停用全部运行中的容器:
docker stop $(docker ps -q) - 删除全部容器:
docker rm $(docker ps -aq) - 一条命令实现停用并删除容器:
docker stop $(docker ps -q) & docker rm $(docker ps -aq) - 将宿主机2181端口和容器docker端口对应,并将容器命名为zk1
docker run -d -p 2181:2181 –name zk1 zookeeper - 使用zkCli.cmd连接该zookeeper验证是否部署成功
zkCli.cmd -server 宿主机IP:2181
docker run -it -link=zk1:zkCli zookeeper zkCli.sh -server 192.168.74.131 - docker logs -t –tail=20 容器ID 查看容器日志
- 停用全部运行中的容器:
参考文件: https://github.com/denverdino/aliyungo/wiki/Zookeeper-cluster-with-Docker