주뇽's 저장소

Docker 네트워크로 FastAPI와 Kafka 컨테이너 연동하기: 주의할 점과 해결 방법 본문

웹개발

Docker 네트워크로 FastAPI와 Kafka 컨테이너 연동하기: 주의할 점과 해결 방법

뎁쭌 2024. 9. 13. 22:24
728x90
반응형

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 네트워크 설정 🛠️

  1. Docker 네트워크 생성하기
    먼저 FastAPI와 Kafka가 통신할 수 있는 Docker 네트워크를 생성한다. 네트워크는 두 컨테이너 간의 통신을 가능하게 하는 가상의 네트워크 공간을 제공하며, 네트워크 안에서는 각 컨테이너의 이름을 호스트처럼 사용할 수 있다.

    docker network create your_network
  2. 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가 이 네트워크 안에서 통신할 수 있도록 설정한다.

  3. FastAPI 컨테이너 실행 시 네트워크 연결
    FastAPI를 실행할 때도 your_network 네트워크에 연결한다. 다음 명령어로 FastAPI 컨테이너를 실행한다.

    docker run -d --name fastapi-app --network your_network -p 8000:8000 fastapi-app
  4. FastAPI에서 Kafka로 연결 설정
    이제 FastAPI 애플리케이션에서 Kafka로 메시지를 보낼 때, localhost 대신 Kafka 컨테이너 이름을 사용한다. Kafka 컨테이너의 이름은 docker-compose.yml에서 설정한 이름(kafka)이다. FastAPI 애플리케이션의 Kafka 설정 코드를 수정한다.

    conf = {'bootstrap.servers': 'kafka:9092'}

    이처럼 bootstrap.servers에 Kafka 컨테이너 이름을 사용하여 FastAPI가 Kafka와 통신할 수 있다.

주의할 점: Docker 네트워크 설정 시 고려사항 📚

  1. 컨테이너 이름 사용
    각 컨테이너는 동일한 네트워크 안에서 고유한 이름으로 통신할 수 있다. localhost는 컨테이너 내부를 가리키므로 네트워크 내에서 다른 컨테이너와 통신할 때는 반드시 해당 컨테이너의 이름을 사용해야 한다.

  2. 포트 매핑
    각 컨테이너에서 외부로 노출하는 포트와 네트워크 내에서 사용하는 포트를 구분해야 한다. 예를 들어, Kafka는 9092 포트에서 통신하고, FastAPI는 8000 포트를 외부로 노출한다. 두 컨테이너가 서로 다른 포트에서 통신하도록 설정해야 한다.

  3. 환경 변수 설정
    Kafka의 KAFKA_ADVERTISED_LISTENERS 환경 변수에 컨테이너 이름과 포트를 설정해야 하며, 네트워크 내에서 통신할 수 있도록 컨테이너 이름을 명시해야 한다. 그렇지 않으면 Kafka가 올바른 포트를 노출하지 않게 되어 통신에 실패할 수 있다.

결론: Docker 네트워크를 통한 안정적인 컨테이너 연동 🏆

Docker 네트워크를 사용하면 서로 다른 컨테이너 간의 통신을 쉽게 설정할 수 있다. 이 과정에서 컨테이너 이름을 사용하고, 적절한 포트 매핑과 환경 변수 설정을 통해 FastAPI와 Kafka 간의 통신을 원활하게 만들 수 있다. 네트워크 설정이 올바르게 되어 있지 않으면 통신 오류가 발생할 수 있으므로, 컨테이너 이름과 네트워크 연결을 정확히 설정하는 것이 중요하다.

이를 통해 FastAPI와 Kafka 간의 안정적인 연동을 구축하고, 메시지 기반 애플리케이션에서 성능을 극대화할 수 있다.