docker compose 搭建并运行kafka服务 java在访问docker所在的主机映射出来的kafka端口时hostname会变成kafka在docker里的id
时间: 2024-01-04 21:27:25 浏览: 110
如果使用 Docker Compose 搭建并运行 Kafka 服务,而在 Java 应用程序中访问 Docker 所在主机上映射出来的 Kafka 端口时,hostname 会变成 Kafka 在 Docker 中的 ID,可能是因为 Java 应用程序无法正确解析 Docker Compose 中配置的 hostname 导致的。要解决这个问题,可以尝试以下两种方法:
1. 将 `KAFKA_ADVERTISED_HOST_NAME` 的值设置为 Docker 主机的 IP 地址
在 Docker Compose 配置文件中,将 `KAFKA_ADVERTISED_HOST_NAME` 的值设置为 Docker 主机的 IP 地址,而不是 Kafka 在 Docker 中的 ID。这样做可以确保 Java 应用程序能够正确解析 Kafka 主机名并连接到 Kafka Broker。
```
...
environment:
KAFKA_ADVERTISED_HOST_NAME: <DOCKER_HOST_IP>
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
...
```
2. 在 Java 应用程序中配置 Docker Compose 网络
另一种方法是在 Java 应用程序中配置 Docker Compose 网络,以便应用程序可以正确解析 Docker Compose 中配置的 hostname。在 Java 应用程序中,可以使用 `docker-compose.yml` 中定义的服务名称作为 hostname,例如 `kafka`。
```
Properties props = new Properties();
props.put("bootstrap.servers", "kafka:9092");
...
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
```
在这个例子中,Java 应用程序使用 `kafka` 作为 Kafka Broker 的 hostname,而不是 Docker 中的 ID。在启动 Java 应用程序之前,需要确保 Docker Compose 网络已经创建,并且 Java 应用程序能够正确连接到网络。
无论使用哪种方法,都需要确保 Java 应用程序能够正确解析 Kafka 主机名并连接到 Kafka Broker。
阅读全文