Zookeeper的Docker镜像制作详解

一、环境描述

1. 宿主机

  • CPU:双核
  • 内存:4 GB
  • 硬盘:120 GB
  • IP地址:192.168.190.128
  • 操作系统:CentOS 7.4 x86_64 Minimal

2. Docker

3. 基础镜像

4. Zookeeper

  • 版本:3.4.11
  • 安装方式:zookeeper-3.4.11.tar.gz

二、创建必要的文件

1. 创建Zookeeper配置文件

Zookeeper容器的配置文件存放在宿主机中,便于调整Zookeeper服务的配置项。在shell中运行以下命令,创建zoo.cfg文件:

cat > /root/Downloads/zoo.cfg << "EOF"
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
EOF

这个配置文件将Zookeeper的心跳时间设置为2秒,数据目录为/var/lib/zookeeper,客户端连接2181端口。

2. 创建xsl文件

configuration.xsl也是Zookeeper的配置文件之一。在shell中运行以下命令,创建configuration.xsl文件:

cat > /root/Downloads/configuration.xsl << "EOF"
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="configuration">
<html>
<body>
<table border="1">
<tr>
 <td>name</td>
 <td>value</td>
 <td>description</td>
</tr>
<xsl:for-each select="property">
<tr>
  <td><a name="{name}"><xsl:value-of select="name"/></a></td>
  <td><xsl:value-of select="value"/></td>
  <td><xsl:value-of select="description"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
EOF

3. 创建日志配置文件

log4j.properties是Zookeeper的日志配置文件。在shell中运行以下命令,创建log4j.properties文件:

cat > /root/Downloads/log4j.properties << "EOF"
# Define some default values that can be overridden by system properties
zookeeper.root.logger=INFO, CONSOLE
zookeeper.console.threshold=INFO
zookeeper.log.dir=.
zookeeper.log.file=zookeeper.log
zookeeper.log.threshold=DEBUG
zookeeper.tracelog.dir=.
zookeeper.tracelog.file=zookeeper_trace.log

#
# ZooKeeper Logging Configuration
#

# Format is "<default threshold> (, <appender>)+

# DEFAULT: console appender only
log4j.rootLogger=${zookeeper.root.logger}

# Example with rolling log file
#log4j.rootLogger=DEBUG, CONSOLE, ROLLINGFILE

# Example with rolling log file and tracing
#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE

#
# Log INFO level and above messages to the console
#
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n

#
# Add ROLLINGFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}

# Max log file size of 10MB
log4j.appender.ROLLINGFILE.MaxFileSize=10MB
# uncomment the next line to limit number of backup files
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10

log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n


#
# Add TRACEFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.TRACEFILE=org.apache.log4j.FileAppender
log4j.appender.TRACEFILE.Threshold=TRACE
log4j.appender.TRACEFILE.File=${zookeeper.tracelog.dir}/${zookeeper.tracelog.file}

log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout
### Notice we are including log4j's NDC here (%x)
log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L][%x] - %m%n
EOF

4. 创建supervisor配置文件

supervisor是一种Linux的进程管理工具,Zookeeper容器会用其管理自身的后台服务。在shell中运行以下命令,创建supervisord.conf文件:

cat > /root/Downloads/supervisord.conf << "EOF"
[supervisord]
nodaemon=true

[program:zookeeper]
command=/usr/local/zookeeper/bin/zkServer.sh start
EOF

三、制作Zookeeper镜像

1. 创建Dockerfile文件

在shell中运行以下命令,创建Dockerfile文件:

cat > /root/Downloads/Dockerfile << "EOF"
# 使用自建的CentOS 6.9基础镜像
FROM registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos:6.9

# 镜像维护者
MAINTAINER ghoulich@aliyun.com

# 安装依赖包
RUN yum install -y epel-release
RUN rpm --rebuilddb && yum install -y supervisor wget java-1.8.0-openjdk tar
COPY supervisord.conf /etc/supervisord.conf

# 安装zookeeper
RUN wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz
RUN tar xvzf zookeeper-3.4.11.tar.gz
RUN mv zookeeper-3.4.11 /usr/local/zookeeper
RUN rm -rf zookeeper-3.4.11.tar.gz
ENV ZOO_LOG_DIR /usr/local/zookeeper/logs
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-3.b14.el6_9.x86_64/jre

# 清理系统
RUN yum clean all

# 开放端口
EXPOSE 2181

# 挂载数据、配置和日志目录
VOLUME ["/var/lib/zookeeper", "/usr/local/zookeeper/conf", "/usr/local/zookeeper/logs"]

# 自动启动zookeeper
CMD ["/usr/bin/supervisord"]
EOF

上述文件有两点需要注意:

  • 公开2181端口,这是Zookeeper的默认服务端口。
  • 创建数据、配置和日志目录的挂载点,这样便可以通过宿主机直接编辑和查看Zookeeper容器的数据、配置和日志,即使删除容器,这些数据也不会丢失。

2. 创建Zookeeper镜像

在shell中执行以下命令,创建镜像(耗时较长):

cd /root/Downloads
docker build -t zookeeper:latest .

3. 查看镜像

在shell中查看镜像信息,若如下图所示,则表示镜像创建成功:

查看Zookeeper镜像的状态

四、上传镜像

1. 登录阿里云镜像库

在shell中运行以下命令:

docker login --username=ghoulich@aliyun.com registry.cn-hangzhou.aliyuncs.com

请根据实际情况,使用真实的用户名和密码。

2. 创建镜像标签

在shell中运行以下命令:

docker tag zookeeper:latest registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-zookeeper:3.4.11

3. 推送镜像

在shell中运行以下命令:

docker push registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-zookeeper:3.4.11

五、使用方法

1. 创建目录和文件

在shell中运行以下命令,在宿主机上创建Zookeeper的数据、配置和日志目录,然后将配置文件拷贝至相应的目录:

mkdir -p /usr/local/zookeeper/{data,conf,logs}
cp /root/Downloads/{zoo.cfg,configuration.xsl,log4j.properties} /usr/local/zookeeper/conf/

2. 启动容器

在shell中运行以下命令,启动Zookeeper容器:

docker run --detach \
    --name zookeeper \
    --hostname zookeeper \
    --volume /usr/local/zookeeper/data:/var/lib/zookeeper \
    --volume /usr/local/zookeeper/conf:/usr/local/zookeeper/conf \
    --volume /usr/local/zookeeper/logs:/usr/local/zookeeper/logs \
    --publish 2181:2181 \
    registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-zookeeper:3.4.11

有几个选项需要说明:

  • --volume:将Zookeeper容器的数据、配置和日志目录映射至宿主机的相应目录;
  • --publish:将Zookeeper容器的2181端口映射至宿主机的2181端口。

4. 验证测试

通过telnet验证宿主机的2181端口,若结果如下图所示,则表示Zookeeper容器启动成功:

验证Zookeeper端口

5. 常用命令

在修改配置文件之后,需要重启Zookeeper服务才能生效,可以通过以下命令启动、停止和重启容器,也能达到同样的效果:

# 启动容器
docker start zookeeper
# 停止容器
docker stop zookeeper
# 重启容器
docker restart zookeeper