接上一篇 bitnami/kafka 镜像踩坑!
很多同学搭完 Kafka,启动 Flink 容器死活连不上😭
核心坑:容器之间不能写localhost!!
Flink 和 Kafka 放在同一个 docker 自定义网络,直接用服务名通信!
💡原理:
同一个 docker network 里面,容器可以互相通过容器名 / 服务名 DNS 解析
Flink 访问 Kafka bootstrap 地址写kafka:9092,不是localhost:9092!
✅步骤:
1️⃣ 创建自定义 docker 网络(只需要创建一次)
docker network create flink-kafka-net2️⃣ 启动 bitnami/kafka 的时候,加入这个网络,重点配置环境变量(关键!advertised.listeners)
docker run -d \ --name kafka \ --network flink-kafka-net \ -p 9092:9092 \ -e KAFKA_BROKER_ID=1 \ -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092 \ -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \ bitnami/kafka:3.6.1zookeeper 也要加到 flink-kafka-net 这个网络里!
3️⃣ 启动 Flink(jobmanager/taskmanager)同样加入flink-kafka-net
# jobmanager示例 docker run -d --name flink-jm \ --network flink-kafka-net \ -p 8081:8081 \ flink:1.18 jobmanager4️⃣ Flink 代码 / Flink SQL 消费配置(重点!)
bootstrap.servers =kafka:9092
CREATE TABLE kafka_source ( msg STRING ) WITH ( 'connector' = 'kafka', 'topic' = 'test-topic', 'properties.bootstrap.servers' = 'kafka:9092', 'properties.group.id' = 'flink-group', 'scan.startup.mode' = 'earliest-offset', 'format' = 'csv' );❌高频报错避雷:
Broker may not be available👉90% 就是 advertised.listeners 配错,返回localhost,Flink 容器内部解析不到!- 忘记把 zookeeper、kafka、flink 全部加入同一个网络
- 代码写localhost:9092(localhost是容器自己,不是宿主机的 kafka)
✨小提示:
- 宿主机自己消费 kafka 可以用localhost:9092
- 容器和容器之间通信,统一用容器名:端口
- 搭配之前那篇 bitnami 镜像国内拉取方案,一套流程直接跑通!