Spring boot Spring引导容器在另一个容器中找不到kafka代理
我有一个简单的springboot应用程序运行在docker容器中,配置如下Spring boot Spring引导容器在另一个容器中找不到kafka代理,spring-boot,apache-kafka,docker-compose,spring-kafka,Spring Boot,Apache Kafka,Docker Compose,Spring Kafka,我有一个简单的springboot应用程序运行在docker容器中,配置如下 @Configuration public class ProducerConfiguration { private static final String KAFKA_BROKER = "kafka:9092"; @Bean public ProducerFactory<String, String> producerFactory() { return ne
@Configuration
public class ProducerConfiguration {
private static final String KAFKA_BROKER = "kafka:9092";
@Bean
public ProducerFactory<String, String> producerFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigurations());
}
@Bean
public Map<String, Object> producerConfigurations() {
Map<String, Object> configurations = new HashMap<>();
configurations.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_BROKER);
configurations.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
configurations.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
return configurations;
}
@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}
}
问题是:
当我在本地运行springboot应用程序并尝试将消息发送到topic时,它工作正常。但是,当我使用docker build-t my/app
将springboot应用程序docker化,然后docker run--publish=8080:8080 my/app
然后尝试发送关于topic的消息时,我得到以下错误
无法建立与节点-1(kafka/127.0.0.1:9092)的连接。代理可能不可用。
我试过各种各样的关于卡夫卡的建议,但它仍然不起作用。
谢谢你在这方面的帮助
编辑:我的dockerfile是
FROM maven:3.5.2-jdk-8-alpine AS MAVEN_BUILD
COPY pom.xml /build/
COPY src /build/src/
WORKDIR /build/
RUN mvn package
FROM openjdk:8-jre-alpine
WORKDIR /app
COPY --from=MAVEN_BUILD /build/target/app-0.0.1-SNAPSHOT.jar /app/
ENTRYPOINT ["java", "-jar", "app-0.0.1-SNAPSHOT.jar"]
根据评论,有几件事可以在与卡夫卡相同的网络中运行spring boot 了解卡夫卡的网络
docker inspect --format='{{json .NetworkSettings.Networks}}' <kafka_container_id>
response: {"<this_is_network_name>": ...}
我注意到您更新了撰写文件,网络应该是:
networks:
default:
external:
name: my-pre-existing-network
version: '2.1'
services:
app:
restart: always
build:
context: ./
container_name: app
ports:
- 8080:8080
depends_on:
- kafka
- zookeeper
kafka:
image: wurstmeister/kafka
container_name: 'kafka'
environment:
JVM_OPTS: -Xmx1g -Xms1g -XX:MaxPermSize=1024m
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ADVERTISED_PORT: 9092
KAFKA_CREATE_TOPICS: test_topic:1:1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
KAFKA_LISTENERS: INSIDE://kafka:9093,OUTSIDE://0.0.0.0:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://localhost:9092
depends_on:
- zookeeper
ports:
- 9092:9092
- 9093:9093
zookeeper:
container_name: 'zookeeper'
image: wurstmeister/zookeeper
但不需要将它们分配到现有网络,因为它们都包含在同一个组合中,因此默认情况下,它们都将被分配到同一个网络,例如:
networks:
default:
external:
name: my-pre-existing-network
version: '2.1'
services:
app:
restart: always
build:
context: ./
container_name: app
ports:
- 8080:8080
depends_on:
- kafka
- zookeeper
kafka:
image: wurstmeister/kafka
container_name: 'kafka'
environment:
JVM_OPTS: -Xmx1g -Xms1g -XX:MaxPermSize=1024m
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ADVERTISED_PORT: 9092
KAFKA_CREATE_TOPICS: test_topic:1:1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
KAFKA_LISTENERS: INSIDE://kafka:9093,OUTSIDE://0.0.0.0:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://localhost:9092
depends_on:
- zookeeper
ports:
- 9092:9092
- 9093:9093
zookeeper:
container_name: 'zookeeper'
image: wurstmeister/zookeeper
Dockerfile还应该公开8080(假设您想访问spring boot应用程序)根据评论,有一些东西可以在与Kafka相同的网络中运行spring boot 了解卡夫卡的网络
docker inspect --format='{{json .NetworkSettings.Networks}}' <kafka_container_id>
response: {"<this_is_network_name>": ...}
我注意到您更新了撰写文件,网络应该是:
networks:
default:
external:
name: my-pre-existing-network
version: '2.1'
services:
app:
restart: always
build:
context: ./
container_name: app
ports:
- 8080:8080
depends_on:
- kafka
- zookeeper
kafka:
image: wurstmeister/kafka
container_name: 'kafka'
environment:
JVM_OPTS: -Xmx1g -Xms1g -XX:MaxPermSize=1024m
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ADVERTISED_PORT: 9092
KAFKA_CREATE_TOPICS: test_topic:1:1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
KAFKA_LISTENERS: INSIDE://kafka:9093,OUTSIDE://0.0.0.0:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://localhost:9092
depends_on:
- zookeeper
ports:
- 9092:9092
- 9093:9093
zookeeper:
container_name: 'zookeeper'
image: wurstmeister/zookeeper
但不需要将它们分配到现有网络,因为它们都包含在同一个组合中,因此默认情况下,它们都将被分配到同一个网络,例如:
networks:
default:
external:
name: my-pre-existing-network
version: '2.1'
services:
app:
restart: always
build:
context: ./
container_name: app
ports:
- 8080:8080
depends_on:
- kafka
- zookeeper
kafka:
image: wurstmeister/kafka
container_name: 'kafka'
environment:
JVM_OPTS: -Xmx1g -Xms1g -XX:MaxPermSize=1024m
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ADVERTISED_PORT: 9092
KAFKA_CREATE_TOPICS: test_topic:1:1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
KAFKA_LISTENERS: INSIDE://kafka:9093,OUTSIDE://0.0.0.0:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://localhost:9092
depends_on:
- zookeeper
ports:
- 9092:9092
- 9093:9093
zookeeper:
container_name: 'zookeeper'
image: wurstmeister/zookeeper
Dockerfile还应该公开8080(假设您想启动spring boot应用程序)当您在容器中运行应用程序时,它位于Kafka所在的网络之外,您需要在相同的网络中运行它
docker run--network
运行应用程序时,或者将应用程序放在compose文件中,它将被分配相同的网络感谢@Thomas_uuu的回复。我试图更新我的docker compose,但它不起作用。我是新手,所以我需要更多的帮助。我已使用最新的docker compose和dockerfile更新了我的问题。当您在容器中运行应用程序时,它位于Kafka所在的网络之外,您需要在运行应用程序时在相同的网络中运行它。docker run--network
,或者将应用程序放在compose文件中,并且它将被分配到相同的网络。谢谢@Thomas_uuuu的回复。我试图更新我的docker compose,但它不起作用。我是新手,所以我需要更多的帮助。我已经用最新的docker compose和dockerfile更新了我的问题。非常感谢!这真的救了我很多。我按照建议更新了docker文件,还更新了配置类中的代理,类似于下面的private static final String KAFKA_broker=“KAFKA:9093”代码>非常感谢!这真的救了我很多。我按照建议更新了docker文件,还更新了配置类中的代理,类似于下面的private static final String KAFKA_broker=“KAFKA:9093”代码>