[Docker] Docker에서 Kafka 실행하기 에서 Docker container에 Kafka를 실행했습니다.
그리고 [Docker] Spring boot 환경에서 Docker로 ELK 사용하기 에서 Docker container에 ELK를 실행했습니다.
이번에는 다른 Docker container에서 실행되는 Kafka와 Logstash가 네트워크가 연결되게 설정을 변경하고 Spring boot와 Kafka가 연결되게 설정을 하겠습니다.
1. Kafka compose.yml 파일 수정
version: "3.5"
networks:
shared_network:
name: my_network
driver: bridge
volumes:
kafka_data:
driver: local
services:
kafka:
image: 'bitnami/kafka:3.6.1'
ports:
- '9092:9092'
- '9094:9094'
environment:
- KAFKA_CFG_NODE_ID=0
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://127.0.0.1:9094
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
volumes:
- "kafka_data:/bitnami/kafka"
networks:
- shared_network
docker-compose.yml 파일에서 networks를 정의하고, 이 네트워크를 모든 관련 서비스가 사용할 수 있도록 설정합니다. 이때, name 속성을 사용해 네트워크에 고유한 이름을 지정합니다. name 속성을 사용할 수 있는 docker compose 파일 버전은 최소 3.5입니다.
Docker 외부에서 Kafka에 접근하려면, ADVERTISED_LISTENERS 환경 변수에서 Docker 호스트의 실제 IP 주소나 호스트 이름을 사용해야 합니다. 예를 들어, Docker가 실행 중인 호스트가 localhost라면, EXTERNAL 리스너를 127.0.0.1 IP 주소를 사용하여 구성해야 합니다.
2. ELK compose.yml 파일 수정
version: "3.5"
networks:
shared_network:
name: my_network
services:
# Elastic search 설정
elasticsearch:
container_name: elasticsearch
image: elasticsearch:7.10.1
ports:
- 9200:9200
- 9300:9300
volumes:
- ./elasticsearch:/usr/share/elasticsearch/data
# Elastic search 계정정보
environment:
discovery.type: single-node
xpack.monitoring.enabled: false
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
ELASTIC_USERNAME: "elastic"
ELASTIC_PASSWORD: "elastic123!@#"
networks:
- shared_network
# Logstash 설정
logstash:
container_name: logstash
image: docker.elastic.co/logstash/logstash:7.10.1
environment:
- XPACK_MONITORING_ENABLED=false
ports:
- 5001:5001
- 9600:9600
volumes:
- ./logstash/config/pipelines.yml:/usr/share/logstash/config/pipelines.yml
- ./logstash/pipeline/pipeline1.conf:/usr/share/logstash/pipeline/pipeline1.conf
- ./logstash/pipeline/pipeline2.conf:/usr/share/logstash/pipeline/pipeline2.conf
depends_on:
- elasticsearch
networks:
- shared_network
# Kibana 설정
kibana:
container_name: kibana
image: kibana:7.10.1
ports:
- 5601:5601
depends_on:
- elasticsearch
volumes:
- ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
networks:
- shared_network
다른 compose.yml 파일에서 정의한 networks 참조합니다. 이렇게 하면 첫번째 compose.yml에서 생성한 네트워크를 사용할 수 있습니다.
3. Logstash pipelin2.conf 파일 수정
input {
kafka {
bootstrap_servers => "kafka:9092"
topics => "test"
consumer_threads => 1
codec => "json"
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
user => "elastic"
password => "elastic123!@#"
index => "kafka-event-%{+YYYY.MM.dd}"
}
}
localhost:9092 대신에 kafka:9092를 사용해야 Kafka 서비스에 올바르게 연결할 수 있습니다. 이렇게 하면 Logstash 컨테이너가 Docker 네트워크 내의 Kafka 서비스를 올바르게 찾을 수 있습니다.
4. Spring boot application.yml 파일 수정
kafka:
bootstrap-servers: "127.0.0.1:9094"
Spring Boot 애플리케이션에서 Kafka에 연결할 때는 EXTERNAL 리스너에 설정된 주소를 사용해야 합니다. application.yml 파일에서 Kafka 서버의 주소를 Docker 호스트의 IP 주소로 변경합니다.
여기까지 마치면 서로 다른 Docker Container와 App간의 연결이 완료됩니다.
참고자료
https://breezymind.com/silicon-mac-kafka-cluster-docker-compose/
https://hub.docker.com/r/bitnami/kafka
'개발 > Docker' 카테고리의 다른 글
[Docker] container별 메모리 사용량 확인 방법 (0) | 2024.02.28 |
---|---|
[Docker] [Kafka] cluster 구성하는 방법 (0) | 2024.02.23 |
[Docker] Docker에서 Kafka 실행하기 (0) | 2024.02.13 |
[Docker] Dockerfile와 docker compose 파일의 차이 (1) | 2024.02.13 |
[Docker] elasticsearch exited with code 137 에러 해결 (0) | 2024.01.23 |