주뇽's 저장소
Docker 네트워크로 FastAPI와 Kafka 컨테이너 연동하기: 주의할 점과 해결 방법 본문
Docker 네트워크로 FastAPI와 Kafka 컨테이너 연동하기: 주의할 점과 해결 방법
뎁쭌 2024. 9. 13. 16:20 수정 공개 삭제
Docker를 사용해 서로 다른 두 개의 컨테이너, FastAPI와 Kafka를 연결하고자 할 때, 네트워크 설정이 매우 중요하다. FastAPI 컨테이너에서 Kafka와 원활하게 통신하려면 같은 Docker 네트워크 안에서 실행되어야 하며, 네트워크 설정을 올바르게 구성하지 않으면 통신 오류가 발생할 수 있다. 이 글에서는 Docker 네트워크를 이용해 두 개의 컨테이너를 연동하는 방법과 주의할 점에 대해 설명한다.
문제점: Docker 컨테이너 간 통신 오류 발생 😓
FastAPI 컨테이너와 Kafka 컨테이너를 각각 실행하고 나서 FastAPI에서 Kafka로 메시지를 보내려고 하면, localhost:9092
로 연결이 실패하는 오류가 발생할 수 있다. Docker 컨테이너에서는 localhost
가 각 컨테이너 내부의 주소를 의미하므로, FastAPI 컨테이너에서 localhost:9092
를 호출하면 FastAPI 컨테이너 내부를 가리켜 Kafka와 통신할 수 없다.
이 문제를 해결하기 위해서는 두 컨테이너가 같은 Docker 네트워크에서 실행되도록 설정하고, Kafka 컨테이너의 이름을 사용해 통신할 수 있도록 해야 한다.
해결책: Docker 네트워크 설정 🛠️
Docker 네트워크 생성하기
먼저 FastAPI와 Kafka가 통신할 수 있는 Docker 네트워크를 생성한다. 네트워크는 두 컨테이너 간의 통신을 가능하게 하는 가상의 네트워크 공간을 제공하며, 네트워크 안에서는 각 컨테이너의 이름을 호스트처럼 사용할 수 있다.docker network create your_network
Kafka 컨테이너 실행 시 네트워크 연결
Kafka를 실행할 때 생성한 네트워크에 연결하도록 설정한다. Docker Compose를 사용하는 경우docker-compose.yml
파일에 네트워크 설정을 추가할 수 있다.version: '3' services: zookeeper: image: confluentinc/cp-zookeeper:latest ports: - "2181:2181" networks: - your_network kafka: image: confluentinc/cp-kafka:latest ports: - "9092:9092" environment: KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 networks: - your_network networks: your_network: driver: bridge
Kafka와 Zookeeper를 동일한 네트워크
your_network
에 연결하여 Kafka가 이 네트워크 안에서 통신할 수 있도록 설정한다.FastAPI 컨테이너 실행 시 네트워크 연결
FastAPI를 실행할 때도your_network
네트워크에 연결한다. 다음 명령어로 FastAPI 컨테이너를 실행한다.docker run -d --name fastapi-app --network your_network -p 8000:8000 fastapi-app
FastAPI에서 Kafka로 연결 설정
이제 FastAPI 애플리케이션에서 Kafka로 메시지를 보낼 때,localhost
대신 Kafka 컨테이너 이름을 사용한다. Kafka 컨테이너의 이름은docker-compose.yml
에서 설정한 이름(kafka
)이다. FastAPI 애플리케이션의 Kafka 설정 코드를 수정한다.conf = {'bootstrap.servers': 'kafka:9092'}
이처럼
bootstrap.servers
에 Kafka 컨테이너 이름을 사용하여 FastAPI가 Kafka와 통신할 수 있다.
주의할 점: Docker 네트워크 설정 시 고려사항 📚
컨테이너 이름 사용
각 컨테이너는 동일한 네트워크 안에서 고유한 이름으로 통신할 수 있다.localhost
는 컨테이너 내부를 가리키므로 네트워크 내에서 다른 컨테이너와 통신할 때는 반드시 해당 컨테이너의 이름을 사용해야 한다.포트 매핑
각 컨테이너에서 외부로 노출하는 포트와 네트워크 내에서 사용하는 포트를 구분해야 한다. 예를 들어, Kafka는9092
포트에서 통신하고, FastAPI는8000
포트를 외부로 노출한다. 두 컨테이너가 서로 다른 포트에서 통신하도록 설정해야 한다.환경 변수 설정
Kafka의KAFKA_ADVERTISED_LISTENERS
환경 변수에 컨테이너 이름과 포트를 설정해야 하며, 네트워크 내에서 통신할 수 있도록 컨테이너 이름을 명시해야 한다. 그렇지 않으면 Kafka가 올바른 포트를 노출하지 않게 되어 통신에 실패할 수 있다.
결론: Docker 네트워크를 통한 안정적인 컨테이너 연동 🏆
Docker 네트워크를 사용하면 서로 다른 컨테이너 간의 통신을 쉽게 설정할 수 있다. 이 과정에서 컨테이너 이름을 사용하고, 적절한 포트 매핑과 환경 변수 설정을 통해 FastAPI와 Kafka 간의 통신을 원활하게 만들 수 있다. 네트워크 설정이 올바르게 되어 있지 않으면 통신 오류가 발생할 수 있으므로, 컨테이너 이름과 네트워크 연결을 정확히 설정하는 것이 중요하다.
이를 통해 FastAPI와 Kafka 간의 안정적인 연동을 구축하고, 메시지 기반 애플리케이션에서 성능을 극대화할 수 있다.