docker image apache/kafka 를 실행하는방법 및 메세지 발행구독 샘플

Docker에서 apache/kafka 이미지를 실행하는 방법은 다음과 같습니다. 기본 실행 명령부터 네트워크 및 환경 변수 설정까지 단계별로 정리합니다.

기본 실행 명령

Apache Kafka를 실행하려면 먼저 ZooKeeper가 필요합니다. 공식적으로 Kafka 서버와 ZooKeeper를 따로 컨테이너로 실행하거나, 단일 컨테이너에서 모두 실행하는 방법이 있습니다.

1. ZooKeeper 컨테이너 실행

bash
docker run -d --name zookeeper \
-p 2181:2181 \
-e ALLOW_ANONYMOUS_LOGIN=yes \
bitnami/zookeeper:latest
  • ZooKeeper 서비스용 컨테이너를 시작합니다.

2. Kafka 컨테이너 실행

bash
docker run -d --name kafka \
-p 9092:9092 \
--link zookeeper:zookeeper \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
apache/kafka:latest
  • ZooKeeper 컨테이너와 연결하며 Kafka 이미지를 실행합니다.

도커 네트워크 사용 예시

별도 네트워크를 만들어 Kafka와 ZooKeeper 컨테이너를 연결할 수도 있습니다.

bash

docker network create kafka-net

docker run -d –name zookeeper –network kafka-net \
-e ALLOW_ANONYMOUS_LOGIN=yes \
bitnami/zookeeper:latest

docker run -d –name kafka –network kafka-net \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-p 9092:9092 \
apache/kafka:latest

  • 이렇게 하면 컨테이너 간 네트워크 통신이 가능해집니다.

주요 환경 변수

  • KAFKA_ZOOKEEPER_CONNECT: ZooKeeper 연결 정보

  • KAFKA_ADVERTISED_LISTENERS: 외부 접근용 리스너 정보

  • KAFKA_LISTENERS: 컨테이너 내부 바인딩 정보

컨테이너 실행 검증

실행 후, 아래 명령어로 컨테이너 상태를 확인하세요.

bash
docker ps
  • kafka, zookeeper 컨테이너가 정상 실행 중임을 확인할 수 있습니다.


위의 순서를 따라 하면 Docker 환경에서 apache/kafka 이미지를 쉽고 안전하게 실행할 수 있습니다.

docker image apache/kafka 를 실행하는방법 및 메세지 발행구독 샘플

Kafka에 메시지를 발행하는 Java 코드 예시입니다. Apache Kafka의 Producer API를 사용하여 간단하게 메시지를 전송하는 방법을 보여줍니다.

Kafka 메시지 발행 Java 예제

java
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.RecordMetadata;
import java.util.Properties;

public class SimpleKafkaProducer {
public static void main(String[] args) {
String bootstrapServers = “localhost:9092”; // Kafka 브로커 주소
String topic = “test-topic”; // 발행할 토픽 이름

Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, “org.apache.kafka.common.serialization.StringSerializer”);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, “org.apache.kafka.common.serialization.StringSerializer”);

KafkaProducer<String, String> producer = new KafkaProducer<>(props);

String key = “sampleKey”;
String value = “Hello, Kafka!”;

ProducerRecord<String, String> record = new ProducerRecord<>(topic, key, value);

try {
RecordMetadata metadata = producer.send(record).get(); // 동기식 전송
System.out.println(“Message sent to topic: “ + metadata.topic() +
” partition: “ + metadata.partition() +
” offset: “ + metadata.offset());
} catch (Exception e) {
e.printStackTrace();
} finally {
producer.close();
}
}
}

  • 위 코드는 Kafka 브로커가 localhost:9092에 실행 중이며, test-topic 토픽으로 메시지를 발행합니다.

  • Kafka Java 클라이언트 라이브러리(org.apache.kafka:kafka-clients)가 필요합니다.


간단한 Producer 예제이므로, 필요에 따라 토픽명, 브로커 주소, 인증/보안 설정 등을 환경에 맞게 수정해서 활용하면 됩니다.Kafka에 메시지를 발행할 때는 Java(Producer API)를 활용하여 아래와 같은 기본 코드를 작성할 수 있습니다.

Kafka 메시지 발행 Java 샘플

java
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.ProducerConfig;
import java.util.Properties;
public class KafkaProducerExample {
public static void main(String[] args) {
Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, “localhost:9092”); // 브로커 주소
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, “org.apache.kafka.common.serialization.StringSerializer”);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, “org.apache.kafka.common.serialization.StringSerializer”);

KafkaProducer<String, String> producer = new KafkaProducer<>(props);

String topic = “test-topic”;
String key = “sample-key”;
String value = “Hello, Kafka World!”;

ProducerRecord<String, String> record = new ProducerRecord<>(topic, key, value);

producer.send(record); // 메시지 발행
producer.close(); // 자원 해제
}
}

  • 위 코드는 가장 기본적인 Kafka 메시지 발행 구조입니다.

  • Kafka 브로커가 localhost:9092에 떠 있어야 정상 동작합니다.

  • kafka-clients 라이브러리가 필요합니다. Gradle/Maven에서 org.apache.kafka:kafka-clients를 추가하세요.

필요에 따라 환경설정, 에러 핸들링, 비동기 처리 등을 추가해서 사용할 수 있습니다.