使用docker安装kafka,zookeeper

本文介绍如何使用Docker构建Kafka和Zookeeper环境,包括编写Dockerfile、配置环境变量、安装必要软件包、下载JDK和Kafka软件、设置启动脚本等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 简单了解一下kafka

kafka  高性能跨语言的分布式发布/订阅消息系统,数据持久化,全分布式,同时支持在线和离线处理

kafka 设计目标
-高吞吐率 在廉价的商用机器上单机可支持每秒100万条消息的读写
-消息持久化 所有消息均被持久化到磁盘,无消息丢失,支持消息重放
- 完全分布式 Producer,Broker,Consumer均支持水平扩展
-同时适应在线流处理和离线批处理

 

1.编写zookeeper Dockerfile

FROM centos:6.6

RUN yum -y install vim lsof wget tar bzip2 unzip vim-enhanced passwd sudo yum-utils hostname net-tools rsync man git make automake cmake patch logrotate python-devel libpng-devel libjpeg-devel pwgen python-pip

RUN mkdir /opt/java &&\
	wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "https://download.oracle.com/otn-pub/java/jdk/8u192-b12/750e1c8617c5452694857ad95c3ee230/jdk-8u192-linux-x64.tar.gz" -P /opt/java

RUN tar zxvf /opt/java/jdk-8u192-linux-x64.tar.gz -C /opt/java &&\
	JAVA_HOME=/opt/java/jdk1.8.0_192 &&\
	sed -i "/^PATH/i export JAVA_HOME=$JAVA_HOME" /root/.bash_profile &&\
	sed -i "s%^PATH.*$%&:$JAVA_HOME/bin%g" /root/.bash_profile &&\
	source /root/.bash_profile

ENV ZOOKEEPER_VERSION "3.4.13"

RUN mkdir /opt/zookeeper &&\
	wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-$ZOOKEEPER_VERSION/zookeeper-$ZOOKEEPER_VERSION.tar.gz -P /opt/zookeeper

RUN tar zxvf /opt/zookeeper/zookeeper*.tar.gz -C /opt/zookeeper

RUN echo "source /root/.bash_profile" > /opt/zookeeper/start.sh &&\
	echo "cp /opt/zookeeper/zookeeper-"$ZOOKEEPER_VERSION"/conf/zoo_sample.cfg /opt/zookeeper/zookeeper-"$ZOOKEEPER_VERSION"/conf/zoo.cfg" >> /opt/zookeeper/start.sh &&\
	echo "/opt/zookeeper/zookeeper-$"ZOOKEEPER_VERSION"/bin/zkServer.sh start-foreground" >> /opt/zookeeper/start.sh

EXPOSE 2181

ENTRYPOINT ["sh", "/opt/zookeeper/start.sh"]
#简单介绍一下此Dockerfile 中涉及的命令
FROM 依赖基本镜像
RUN 功能为运行指定的命令
ENV 功能为设置环境变量
语法有两种
1. ENV <key> <value>
2. ENV <key>=<value> ...
两者的区别就是第一种是一次设置一个,第二种是一次设置多个
EXPOSE
功能为暴漏容器运行时的监听端口给外部
但是EXPOSE并不会使容器访问主机的端口
如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数
ENTRYPOINT 功能是启动时的默认命令
语法如下:
1. ENTRYPOINT ["executable", "param1", "param2"]
2. ENTRYPOINT command param1 param2

 

执行
docker build -t -f zookeeper.Dockerfile .
-f :指定要使用的Dockerfile路径;
-t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
如果中途报错证明此dockerfile代码有异常

可通过
docker images | grep zwl
查看具体版本的images

执行
docker run -itd --name zookeeper -h zookeeper -p2181:2181 zwl/zookeeper:3.4.13 bash
-i以交互模式运行容器,通常与 -t 同时使用
-t为容器重新分配一个伪输入终端,通常与 -i 同时使用
-d 后台运行容器,并返回容器ID;
-itd 以后台形式运行容器,并给该容器分配交互终端
-h 给该容器分配名字
-p 映射地址

 

编写 kafka Dockerfile

 

使用docker 编译

FROM centos:6.6

ENV KAFKA_VERSION "1.0.2"

RUN yum -y install vim lsof wget tar bzip2 unzip vim-enhanced passwd sudo yum-utils hostname net-tools rsync man git make automake cmake patch logrotate python-devel libpng-devel libjpeg-devel pwgen python-pip

RUN mkdir /opt/java

COPY jdk-8u191-linux-x64.tar.gz /opt/java

RUN mkdir /opt/kafka &&\
	wget http://apache.fayea.com/kafka/$KAFKA_VERSION/kafka_2.11-$KAFKA_VERSION.tgz -P /opt/kafka

RUN tar zxvf /opt/java/jdk-8u191-linux-x64.tar.gz -C /opt/java &&\
	JAVA_HOME=/opt/java/jdk1.8.0_191 &&\
	sed -i "/^PATH/i export JAVA_HOME=$JAVA_HOME" /root/.bash_profile &&\
	sed -i "s%^PATH.*$%&:$JAVA_HOME/bin%g" /root/.bash_profile &&\
	source /root/.bash_profile

RUN tar zxvf /opt/kafka/kafka*.tgz -C /opt/kafka &&\
	sed -i 's/num.partitions.*$/num.partitions=3/g' /opt/kafka/kafka_2.11-$KAFKA_VERSION/config/server.properties

RUN echo "source /root/.bash_profile" > /opt/kafka/start.sh &&\
	echo "cd /opt/kafka/kafka_2.11-"$KAFKA_VERSION >> /opt/kafka/start.sh &&\
	echo "sed -i 's%zookeeper.connect=.*$%zookeeper.connect=zookeeper:2181%g'  /opt/kafka/kafka_2.11-"$KAFKA_VERSION"/config/server.properties" >> /opt/kafka/start.sh &&\
	echo "bin/kafka-server-start.sh config/server.properties" >> /opt/kafka/start.sh &&\
	chmod a+x /opt/kafka/start.sh

EXPOSE 9092

ENTRYPOINT ["sh", "/opt/kafka/start.sh"]


RUN echo "source /root/.bash_profile" > /opt/zookeeper/start.sh &&\
	echo "cp /opt/zookeeper/zookeeper-"$ZOOKEEPER_VERSION"/conf/zoo_sample.cfg /opt/zookeeper/zookeeper-"$ZOOKEEPER_VERSION"/conf/zoo.cfg" >> /opt/zookeeper/start.sh &&\
	echo "/opt/zookeeper/zookeeper-$"ZOOKEEPER_VERSION"/bin/zkServer.sh start-foreground" >> /opt/zookeeper/start.sh

EXPOSE 2181

ENTRYPOINT ["sh", "/opt/zookeeper/start.sh"]
特别注意因为下载jdk 需要临时的token下载比较麻烦 所有我将wget改成COPY
COPY 本地linux系统路径 docker的路径
如果使用COPY 请在编译dokerfile的路径保证 jdk-8u191-linux-x64.tar.gz此文件

docker 编写完毕后
执行
docker build -t zwl/kafka:1.0 -f kafka.Dockerfile

生成images后
执行
docker run -itd --name kafka -h kafka --link zookeeper zwl/kafka:1.0 bash

请注意--link zookeeper 与sed -i 's%zookeeper.connect=.*$%zookeeper.connect=zookeeper:2181%g'对应

docker ps | grep zwl

 

 

 

 

 

<think>好的,用户想通过Docker安装KafkaZooKeeper,需要最佳实践教程。首先,我得回忆一下相关步骤,确保流程正确。根据提供的引用,特别是引用2和引用3,安装过程大致分为拉取镜像、创建网络、部署ZooKeeper,然后部署Kafka。 首先,用户可能需要知道拉取哪个镜像。引用2提到wurstmeister/zookeeper和wurstmeister/kafka,而引用3也用了类似的镜像。所以应该推荐这两个镜像。需要注意版本问题,但用户没指定,所以默认用latest。 接下来是创建网络。引用2中的命令是docker network create --driver bridge zookeeper_network,这样容器可以在同一网络内通信,方便Kafka连接ZooKeeper。 然后部署ZooKeeper。引用3给出了启动命令,比如docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper。可能需要持久化数据,但用户示例中没有挂载目录,所以暂时不提及,或者作为可选步骤? 接下来部署Kafka。根据引用2和5,Kafka需要连接ZooKeeper,所以启动命令中的环境变量KAFKA_ZOOKEEPER_CONNECT很重要。比如docker run -d --name kafka -p 9092:9092 -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 ... wurstmeister/kafka。此外,还需要设置advertised.listeners,让外部客户端能访问,这可能涉及宿主机的IP,用户需要替换成自己的IP地址,比如在环境变量中设置KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://宿主机IP:9092。 测试部分,引用5提到了使用kafka-console-producer和consumer来发送和接收消息。需要进入Kafka容器执行这些命令,或者直接docker exec执行。用户可能需要知道如何测试安装是否成功,所以这部分应该包含。 持久化存储方面,引用4提到了创建目录,但用户示例中的安装没有使用挂载,所以可能需要说明如何添加数据卷,比如-v参数挂载到宿主机的目录,避免数据丢失。 高可用的话,可能需要部署ZooKeeper集群,但用户的问题可能只需要单机安装,所以作为可选步骤,或者后续问题提及。 最后,确保步骤清晰,命令正确,用户能一步步操作。同时,根据用户提供的引用,需要正确标注引用来源,比如在步骤中引用对应的引用编号。</think>### 如何通过 Docker 安装 KafkaZooKeeper? 以下是基于 Docker 安装 KafkaZooKeeper 的最佳实践步骤: --- #### **1. 拉取镜像** - **ZooKeeper 镜像**: ```bash docker pull zookeeper:latest # 或指定版本,如 zookeeper:3.9.1 [^3] ``` - **Kafka 镜像**: ```bash docker pull wurstmeister/kafka:latest # 推荐使用此社区镜像 [^2] ``` --- #### **2. 创建 Docker 网络** 为 KafkaZooKeeper 创建专用网络,确保容器间通信: ```bash docker network create --driver bridge kafka_zookeeper_network [^2] ``` --- #### **3. 部署 ZooKeeper** 启动 ZooKeeper 容器(单节点模式): ```bash docker run -d \ --name zookeeper \ --network kafka_zookeeper_network \ -p 2181:2181 \ -t zookeeper:latest [^3] ``` - **参数说明**: - `-p 2181:2181`:将 ZooKeeper 默认端口映射到宿主机。 - `--network`:加入专用网络,使 Kafka 能通过容器名访问 ZooKeeper。 --- #### **4. 部署 Kafka** 启动 Kafka 容器,并关联 ZooKeeper: ```bash docker run -d \ --name kafka \ --network kafka_zookeeper_network \ -p 9092:9092 \ -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://<宿主机IP>:9092 \ -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \ wurstmeister/kafka:latest [^5] ``` - **关键环境变量**: - `KAFKA_ZOOKEEPER_CONNECT`:指定 ZooKeeper 地址(通过容器名 `zookeeper` 访问)。 - `KAFKA_ADVERTISED_LISTENERS`:需替换 `<宿主机IP>` 为实际 IP,供外部客户端连接。 --- #### **5. 验证安装** 1. **进入 Kafka 容器**: ```bash docker exec -it kafka /bin/sh ``` 2. **创建测试 Topic**: ```bash kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1 ``` 3. **发送消息**: ```bash kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic ``` 4. **接收消息**: ```bash kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning ``` --- #### **6. 可选:持久化配置** - **ZooKeeper 数据目录挂载**: ```bash -v /宿主机目录/zookeeper/data:/data [^4] ``` - **Kafka 数据目录挂载**: ```bash -v /宿主机目录/kafka/data:/var/lib/kafka/data ``` --- #### **7. 高可用配置(可选)** - **ZooKeeper 集群**:部署多个 ZooKeeper 节点,通过 `server.x` 配置集群 。 - **Kafka 集群**:启动多个 Kafka 容器,设置相同网络并配置 `KAFKA_BROKER_ID` 和 `KAFKA_ZOOKEEPER_CONNECT`。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值