Spring boot Spring引导容器在另一个容器中找不到kafka代理

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

我有一个简单的springboot应用程序运行在docker容器中,配置如下

@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”