一、环境描述
1. 宿主机
- CPU:双核
- 内存:4 GB
- 硬盘:120 GB
- IP地址:192.168.190.128
- 操作系统:CentOS 7.4 x86_64 Minimal
2. Docker
- 版本:1.12.6
- 安装方式:参考《如何通过yum安装Docker和Docker-Compose》
3. 基础镜像
- 操作系统:CentOS 6.9 x86_64
- 制作方式:参考《如何创建CentOS系统的Docker基础镜像》
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中查看镜像信息,若如下图所示,则表示镜像创建成功:
四、上传镜像
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容器启动成功:
5. 常用命令
在修改配置文件之后,需要重启Zookeeper服务才能生效,可以通过以下命令启动、停止和重启容器,也能达到同样的效果:
# 启动容器
docker start zookeeper
# 停止容器
docker stop zookeeper
# 重启容器
docker restart zookeeper