Docker部署Kafka消息队列
为什么选择Docker部署Kafka消息队列
Kafka是常用的消息队列中间件,但原生安装需要配置Java环境和ZooKeeper,对新手不太友好。
使用Docker可以把Kafka和ZooKeeper打包进容器,一条命令就能启动,环境和依赖都不用自己操心。
本文会用最新镜像演示完整部署流程,让你在十分钟内跑通消息收发。
准备条件:一台安装了Docker的服务器
操作前请确保服务器上已安装Docker。
如果没有安装,可以参考以下命令快速安装(CentOS/Ubuntu通用):
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
安装完成后执行 sudo docker version,看到版本号就说明正常。
如果你使用宝塔面板,可以在“软件商店”搜索Docker直接安装,省去命令行。
拉取镜像并启动容器
Kafka从2.8版本开始可以脱离ZooKeeper运行(KRaft模式),但主流生产环境仍然依赖ZooKeeper。
这里采用经典方案:同时启动ZooKeeper和Kafka容器。
首先拉取镜像:
docker pull bitnami/zookeeper:latest
docker pull bitnami/kafka:latest
使用 docker network 创建一个专用网络,方便容器间通信:
docker network create kafka-network
启动ZooKeeper容器(注意暴露端口2181):
docker run -d --name zookeeper --network kafka-network -p 2181:2181 bitnami/zookeeper:latest
启动Kafka容器,这里需要设置环境变量让Kafka知道ZooKeeper的地址,并开启外部访问:
docker run -d --name kafka --network kafka-network -p 9092:9092 \
-e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181 \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://你的服务器IP:9092 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
bitnami/kafka:latest
注意将 你的服务器IP 替换为实际公网IP或内网IP。
如果只在本地测试,可以使用 localhost,但其他机器无法连接。
检查容器是否正常运行:
docker ps | grep kafka
出现kafka容器且状态为Up就对了。
创建主题并验证消息收发
Kafka需要先创建主题(topic)才能收发消息。
进入Kafka容器执行命令:
docker exec -it kafka bash
在容器内创建主题:
kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
如果出现“Created topic test-topic”,说明成功。
可以用以下命令查看主题列表确认:
kafka-topics.sh --list --bootstrap-server localhost:9092
接下来开启两个终端窗口测试消息。
终端1:启动消费者
进入容器后执行:
kafka-console-consumer.sh --topic test-topic --bootstrap-server localhost:9092 --from-beginning
终端2:启动生产者
进入容器后执行:
kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092
在生产者窗口输入任意文本并回车,查看消费者窗口是否立刻收到。
如果能收到,说明Kafka消息队列已正常工作。
常见报错与避坑说明
- 端口冲突:如果本机已经运行了其他服务占用2181或9092,启动容器会失败。解决办法是修改宿主机映射端口,例如
-p 2182:2181和-p 9093:9092,然后配置文件里对应修改。 - 外部客户端无法连接:检查
ADVERTISED_LISTENERS是否填写了正确的IP。如果填了localhost,外部客户端会尝试连接容器内部的localhost,导致失败。建议直接用服务器公网IP或内网IP。 - Kafka版本与ZooKeeper版本不兼容:建议使用同一镜像源(如这里都选bitnami),避免版本冲突。
- 容器重启后数据丢失:如果容器被删除,Kafka中的消息也会丢失。生产环境应挂载数据卷持久化,比如加参数
-v /data/kafka:/bitnami/kafka。
如果你在启动时遇到“Kafka连接ZooKeeper超时”,多数是因为网络配置不对。
确认两个容器都在同一个 kafka-network 中,并且Kafka的 ZOOKEEPER_CONNECT 写的是容器名 zookeeper:2181。
结束语
以上就是在Docker环境部署Kafka消息队列的完整步骤。
建议先按上面的流程走一遍,确认能正常收发后再根据实际场景微调配置。
遇到问题优先检查网络连通性和IP地址设置。
希望这篇教程能帮你快速上手Docker部署Kafka。