如何实现Docker容器内外均可访问Kafka且Debezium Connect正常连接?
问题描述
我正尝试将Debezium与Kafka Connect配合使用,按照官方教程操作后,容器内部连接一切正常,但无法从Docker容器外部访问Kafka。
我使用以下命令启动容器:
docker run -it --rm --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 debezium/zookeeper:2.0.0.Beta1 docker run -it --rm --name kafka -p 9092:9092 --link zookeeper:zookeeper debezium/kafka:2.0.0.Beta1 docker run -it --rm --name connect -p 8083:8083 -e GROUP_ID=1 -e CONFIG_STORAGE_TOPIC=my_connect_configs -e OFFSET_STORAGE_TOPIC=my_connect_offsets --link kafka:kafka debezium/connect:2.0.0.Beta1
我曾尝试将KAFKA_ADVERTISED_LISTENERS设置为PLAINTEXT://127.0.0.1:9092,此时可以从容器外部连接Kafka,但connect容器无法再连接kafka容器。请问如何同时实现这两种连接?
解决方案
要同时支持容器内部和外部访问Kafka,需要配置多组监听地址,让Kafka分别对外、对内暴露不同的连接端点:
- 修改Kafka启动命令,添加多监听相关环境变量:
docker run -it --rm --name kafka \ -p 9092:9092 \ -p 29092:29092 \ --link zookeeper:zookeeper \ -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:29092 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092 \ -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT \ -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \ debezium/kafka:2.0.0.Beta1
- Connect容器保持原命令即可:
因为已经通过--link kafka:kafka配置了容器内部主机名解析,Connect会自动使用kafka:9092这个内部地址连接Kafka,无需额外修改:
docker run -it --rm --name connect -p 8083:8083 -e GROUP_ID=1 -e CONFIG_STORAGE_TOPIC=my_connect_configs -e OFFSET_STORAGE_TOPIC=my_connect_offsets --link kafka:kafka debezium/connect:2.0.0.Beta1
关键配置说明
KAFKA_LISTENERS:指定Kafka监听的所有端口,0.0.0.0表示监听所有网卡KAFKA_ADVERTISED_LISTENERS:对外公告的连接地址,其中:PLAINTEXT://kafka:9092:供容器内部服务(比如Connect)使用,借助Docker的link机制解析主机名PLAINTEXT_HOST://localhost:29092:供容器外部客户端使用,通过localhost:29092连接
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP:映射各监听地址的安全协议,这里统一使用明文协议KAFKA_INTER_BROKER_LISTENER_NAME:指定Kafka集群内部Broker之间通信使用的监听地址
- 外部客户端连接方式:
外部工具(如kafka-console-consumer.sh)连接时,使用localhost:29092作为Kafka地址即可。
内容的提问来源于stack exchange,提问作者omidh
相关产品推荐
相关产品推荐

