์ธํ”„๋ผ

[Docker] Kafka์— ์ธ์ฆ ์„ค์ •์ด ์ ์šฉ๋œ ๋„์ปค ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ณ  ๋„์ปคํ—ˆ๋ธŒ์— ํ‘ธ์‹œํ•˜๊ธฐ

THE NICOLE 2025. 1. 24. 11:24

 

์นดํ”„์นด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค,

์‚ฌ์šฉ์ž ์ธ์ฆ ์„ค์ •์„ ๋งค๋ฒˆ ํ•ด์ฃผ๋‹ˆ ๋ฒˆ๊ฑฐ๋กœ์› ๋‹ค. ์• ์ดˆ์— ์‚ฌ์šฉ์ž ์ธ์ฆ ์„ค์ •์ด ๋“ค์–ด๊ฐ„ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉด ์–ด๋–จ๊นŒ? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ํšŒ์‚ฌ ๋™๋ฃŒ๋“ค๋„ ํŽธํ•˜๊ฒŒ ํ•œ๋ฒˆ์— ์ด๋ฏธ์ง€ ํ’€๋ฐ›์•„์„œ ์“ธ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ํ•œ๋ฒˆ ํ•ด๋ณด์ž. gogo

1) Dockerfile ์ƒ์„ฑ

์ด๋ฏธ์ง€ ๋ช… - iabacus/kafka-plain-image:1.0.0

# Base image
FROM bitnami/kafka:latest

# Kafka configuration through environment variables
ENV KAFKA_CFG_BROKER_ID=100
ENV KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
ENV KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,SASL_PLAINTEXT://0.0.0.0:9093
ENV KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.2.52:9092,SASL_PLAINTEXT://192.168.2.52:9093
ENV KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,SASL_PLAINTEXT:SASL_PLAINTEXT
ENV KAFKA_CFG_SASL_ENABLED_MECHANISMS=PLAIN
ENV KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=PLAIN
ENV KAFKA_CFG_INTER_BROKER_LISTENER_NAME=SASL_PLAINTEXT
ENV KAFKA_CLIENT_USERS=admin
ENV KAFKA_CLIENT_PASSWORDS=admin-secret
ENV KAFKA_CLIENT_LISTENER_NAME=SASL_PLAINTEXT

# JAAS configuration
RUN echo "KafkaServer {" > /opt/bitnami/kafka/config/jaas.conf && \\
    echo "   org.apache.kafka.common.security.plain.PlainLoginModule required" >> /opt/bitnami/kafka/config/jaas.conf && \\
    echo "   username=\\"admin\\" password=\\"admin-secret" >> /opt/bitnami/kafka/config/jaas.conf && \\
    echo "   user_admin=\\"admin-secret\\" user_user1=\\"user1-secret\\";" >> /opt/bitnami/kafka/config/jaas.conf && \\
    echo "};" >> /opt/bitnami/kafka/config/jaas.conf && \\
    echo "KafkaClient {" >> /opt/bitnami/kafka/config/jaas.conf && \\
    echo "   org.apache.kafka.common.security.plain.PlainLoginModule required" >> /opt/bitnami/kafka/config/jaas.conf && \\
    echo "   username=\\"admin\\" password=\\"admin-secret\\";" >> /opt/bitnami/kafka/config/jaas.conf && \\
    echo "};" >> /opt/bitnami/kafka/config/jaas.conf

# Configure Kafka options to use JAAS configuration
ENV KAFKA_OPTS="-Djava.security.auth.login.config=/opt/bitnami/kafka/config/jaas.conf"

# Expose ports
EXPOSE 9092 9093

# Set default command
CMD ["sh", "-c", "/opt/bitnami/scripts/kafka/run.sh"]

 

๋งŒ๋“  ๋„์ปคํŒŒ์ผ์„ ๋นŒ๋“œ

docker build -t iabacus/kafka-plain-image:1.0.0 .

 

๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰

docker run --name kafka1 -p 9092:9092 -p 9093:9093 --network kafka-net iabacus/kafka-plain-image:1.0.0 

 

2) docker-compose.yml

์‹คํ–‰ ์‹œ์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋™์  ๋ณ€๊ฒฝํ•ด์„œ ์‹คํ–‰ํ•˜๋„๋ก ๋„์ปค ์ปดํฌ์ฆˆ ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๋‹ค. 

services:
  kafka:
    image: iabacus/kafka-plain-image:1.0.0
    container_name: kafka-plain
    ports:
      - "9092:9092"
      - "9093:9093"
    environment:
      KAFKA_CFG_BROKER_ID: 5
      KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://192.168.2.55:9092,SASL_PLAINTEXT://192.168.2.55:9093
    networks:
      - kafka-net
    depends_on:
      - zookeeper

  zookeeper:
    image: bitnami/zookeeper:latest
    container_name: zookeeper-plain
    ports:
      - "2181:2181"
    environment:
      ALLOW_ANONYMOUS_LOGIN: "yes"
    networks:
      - kafka-net

networks:
  kafka-net:
docker compose up

 

3) ์นดํ”„์นด ์ปจํ…Œ์ด๋„ˆ์— ํ† ํ”ฝ ์ƒ˜ํ”Œ ํ•˜๋‚˜ ์ƒ์„ฑ

์ด์ œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ž. ์ƒ์„ฑํ•œ ์ปจํ…Œ์ด๋„ˆ์— ํ† ํ”ฝ์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์ค€๋‹ค. 

docker exec -it kafka-plain bash
kafka-topics.sh --create \\
  --topic test-topic \\
  --bootstrap-server 192.168.2.52:9092 \\
  --replication-factor 1 

์ƒ์„ฑํ•œ ํ† ํ”ฝ ํ™•์ธ !

kafka-topics.sh --list --bootstrap-server 192.168.2.52:9092

 

4) ์™ธ๋ถ€์—์„œ ์ ‘์† ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ

๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ์ ‘๊ทผํ•ด๋ณด๊ธฐ

client-test.properties

kafka1์˜ binํด๋” ์•ˆ์— ์ž‘์„ฑ

sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret";
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN

 

์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ๋‚ด๊ฐ€ ๋งŒ๋“  ์นดํ”„์นด์˜ ํ† ํ”ฝ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋Š”์ง€ (์ ‘๊ทผ์ด ๋˜๋Š”์ง€) ํ™•์ธ

kafka-topics.sh --list \\
  --bootstrap-server 192.168.2.52:9093 \\
  --command-config /opt/bitnami/kafka/bin/client-test.properties

์ž˜ ๊ฐ€์ ธ์˜ค๋Š”๊ฑฐ ํ™•์ธํ•˜๊ณ 

5) ๋„์ปค ํ—ˆ๋ธŒ์— ํ‘ธ์‹œ

์ง„์งœ ๋‚ด๊ฐ€ ๋งŒ๋“  ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ์ž˜ ๋˜๋Š”์ง€ ํ™•์ธ์ด ๋˜์—ˆ์œผ๋‹ˆ ์›๊ฒฉ ๋„์ปคํ—ˆ๋ธŒ์— ํ‘ธ์‹œ๋ฅผ ํ•ด๋ณด์ž. 

๋ฆฌ๋ˆ…์Šค ์ฐฝ์— ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ๋„์ปค ํ—ˆ๋ธŒ ๋กœ๊ทธ์ธ

docker login
iabacus # ๋„์ปคํ—ˆ๋ธŒ ์œ ์ €์ด๋ฆ„
adasdfasdfasdfasdf # ๋น„๋ฐ€๋ฒˆํ˜ธ

 

ํ‘ธ์‹œ!!!!

docker push iabacus/kafka-plain-image:1.0.0

 

 

๋„์ปค ํ—ˆ๋ธŒ ์„ค๋ช…์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ˆ๋‚ดํ–ˆ๋‹ค. ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก.

# **docker-compose.xml (sample)**
```
services:
  kafka:
    image: iabacus/kafka-plain-image:1.0.0
    container_name: kafka-plain
    ports:
      - "9092:9092"
      - "9093:9093"
    environment:
      KAFKA_CFG_BROKER_ID: 5
      KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://[kafak_server_IP]:9092,SASL_PLAINTEXT://[kafak_server_IP]:9093
    networks:
      - kafka-net
    depends_on:
      - zookeeper

  zookeeper:
    image: bitnami/zookeeper:latest
    container_name: zookeeper-plain
    ports:
      - "2181:2181"
    environment:
      ALLOW_ANONYMOUS_LOGIN: "yes"
    networks:
      - kafka-net

networks:
  kafka-net:
```

- `[kafak_server_IP]`,`KAFKA_CFG_BROKER_ID`, `KAFKA_CFG_ZOOKEEPER_CONNECT` ๋“ฑ์„ ์ˆ˜์ •ํ•˜์—ฌ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š” !



## ํ† ํ”ฝ ์ƒ์„ฑ (sample)
kafka-topics.sh --create \
  --topic test-topic \
  --bootstrap-server `[kafak_server_IP]`:9092 \
  --replication-factor 1 


## ์ƒ์„ฑ๋œ ํ† ํ”ฝ ํ™•์ธ (sample)
kafka-topics.sh --list --bootstrap-server `[kafak_server_IP]`:9092



# **์™ธ๋ถ€์—์„œ ์ ‘์† ํ…Œ์ŠคํŠธ**
## client-test.properties (sample)
์™ธ๋ถ€์—์„œ ํ•ด๋‹น Kafka ์ปจํ…Œ์ด๋„ˆ๋กœ ์ ‘์† ์‹œ ์•„๋ž˜์˜ properties ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉํ•˜์„ธ์š”.
```bash
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret";
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
```

### ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด
```bash
kafka-topics.sh --list \
  --bootstrap-server `[kafak_server_IP]`:9093 \
  --command-config client-test.properties
```

 

 

์‹ค์ œ๋กœ ๋‚ด๊ฐ€ ๋งŒ๋“  ์นดํ”„์นด ์ธ์ฆ์ด ์ ์šฉ๋œ ์ด๋ฏธ์ง€๊ฐ€ ์ž˜ ์˜ฌ๋ผ๊ฐ”๋‹ค. 

 

๊ฐ™์€ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์ค‘์ธ ๋™๋ฃŒ์—๊ฒŒ ๋„์ปค์ปดํฌ์ฆˆํŒŒ์ผ ์ƒ์„ฑํ•ด์„œ docker compose up ํ•ด๋ณด๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ ์ž˜ ๋ฐ›์•„์กŒ๊ณ , ์ž˜ ์‚ฌ์šฉ์ด ๋œ๋‹ค! gooooood~~~~~~~~~~~~

 

ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด๋†“์œผ๋ฉด ๋‘๊ณ ๋‘๊ณ  ๋‚˜๋„ ์“ฐ๊ณ  ๋„ˆ๋„ ์“ฐ๋Š” ๋„์ปค ์ด๋ฏธ์ง€ ๋„ˆ๋ฌด ์ข‹๋‹ค! 

์ปค์Šคํ…€์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ์žฌ๋ฐŒ๊ณ  ํŽธํ•˜๋‹ค. ์ž์ฃผ ์• ์šฉํ•ด์•ผ๊ฒ ๋‹ค ^^