1、问题描述
在虚拟机CentOS-7上搭建的Docker Kafka ,docker内部可以创建Topic、可以生产者数据、可以消费数据,而在宿主机开发程序无法消费Docker Kafka的数据。
1.1、运行情况
[docker@localhost ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c894cb467f23 wurstmeister/kafka "start-kafka.sh" 19 minutes ago Up 19 minutes 0.0.0.0:9092->9092/tcp, :::9092->9092/tcp kafka
ca4c190038ea zookeeper "/docker-entrypoint.…" 58 minutes ago Up 58 minutes 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, :::2181->2181/tcp, 8080/tcp zookeeper
1.2、生产数据
[docker@localhost ~]$ docker exec -it kafka kafka-console-producer.sh --broker-list 192.168.33.231:9092 --topic test
>123
>345
>2024-06-07
1.3、消费数据
[docker@localhost ~]$ docker exec -it kafka kafka-console-consumer.sh --bootstrap-server 192.168.33.231:9092 --topic test --from-beginning
123
345
2024-06-07
2、问题分析
2.1、docker 配置
docker run -d --name kafka --publish 9092:9092 \
--link zookeeper \
--env KAFKA_ADVERTISED_HOST_NAME=192.168.33.231 \
--env KAFKA_ZOOKEEPER_CONNECT=192.168.33.231:2181 \
--env KAFKA_ADVERTISED_PORT=9092 \
--env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.33.231:9092 \
--env KAFKA_LISTENERS=PLAINTEXT://:9092 \
--env KAFKA_LOG_DIRS=/kafka/kafka-logs-1 \
-v /bigdata/kafka_data/data:/kafka/kafka-logs-1 \
wurstmeister/kafka
2.2.端口查看
[docker@localhost ~]$ lsof -i:9092
[docker@localhost ~]$
[docker@localhost ~]$
[docker@localhost ~]$
[docker@localhost ~]$
[docker@localhost ~]$
[docker@localhost ~]$
[docker@localhost ~]$ netstat -tunlp | grep 9092
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:9092 0.0.0.0:* LISTEN -
tcp6 0 0 :::9092 :::* LISTEN -
2.3、原因分析
1)配置原因
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://139.226.179.239:9092
把kafka的地址端口注册给zookeeper,若远程访问要改成外网IP,千万注意是外网IP,很多文章只说是宿主机IP, 演示例子上写的是内网IP,很容易被误导
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
配置kafka的监听端口
2)虚拟机防火墙
- 查看防火墙是否开启
systemctl status firewalld
- 开启防火墙
firewall-cmd --list-ports
- 重启防火墙
firewall-cmd --reload
- 启动防火墙后,默认没有开启任何端口,需要手动开启端口
firewall-cmd --zone=public --add-port=9092/tcp --permanent
参数:--zone (作用域)
--add-port=9092/tcp (添加端口,格式:端口/通讯协议)
--permanent (永久生效,没有此参数重启后失效)
3、解决方法
3.1、关闭虚拟机防火墙
systemctl stop firewalld.service
3.2、添加宿主机到Docker的路由
以管理员身份运行CMD,添加如下路由
route add -p 172.17.0.2 mask 255.255.0.0 192.168.33.231
3.3、打开虚拟机NET网卡配置
添加宿主机和虚拟机网卡 端口转发如图:
4、结论:
本机-宿主机程序直接发送数据
Docker kafka 数据: