문제 상황

로컬에서 Spring Server을 실행시키고 Docker로 Kafka 컨테이너를 띄웠을 때는 localhost가 잘 작동했으나,

Spring Server도 같이 Docker Container로 띄웠을 때 카프카와 연결이 되지 않았다.

docker network를 하나로 묶어주면 localhost가 문제없이 동작할 수 있을 줄 알았으나, container끼리 통신은 불가능했다.

kafka server.properties 의 lisnter 설정에 ubuntu IP 주소나 컨테이너 주소를 설정해줘도 실패했다.

listeners=PLAINTEXT://:9092

# Hostname and port the broker will advertise to producers and consumers. If not set,
# it uses the value for "listeners" if configured.  Otherwise, it will use the value
# returned from java.net.InetAddress.getCanonicalHostName().
advertised.listeners=PLAINTEXT://3.34.21.84:9092

borker의 주소 역시 도커의 컨테이너 IP로 설정해주어도 연결이 되지 않았다.

public static final String KAFKA_BROKER = "docker container IP Address:9092";

발생 원인

Docker Swarm을 사용하기에 이와같은 문제점을 해결해야한다.

Kubernetes 는 pod간 통신에 네트워크 설정이 상대적으로 더 간편하고 Kubernetes에서 kafka를 설치할 수 있게 지원하기 때문에 수동으로 설정하는 kafka 환경을 더 쉽고 편리하게 구축, 관리할 수 있다.

하지만 Kubernetes는 대규모 서비스에 적합하다. kubernetes 를 사용하기 위해서는 각각의 pod를 제어하는 master instance의 최소 사양이 CPU 2, Ram 2GB 이다.

현재 프로젝트에서 오버스펙이라는 생각이 들어 Docker Swarm 으로 진행하되 Container끼리의 통신 문제를 해결하고자 한다.

Docker는 Container와의 통신에서 localhost를 사용할 수 없다.

Docker 컨테이너는 기본적으로 도커 네트워크 bridge에 속하기 때문에 도커 컨테이너에서 localhost의 의미는 자기 자신의 컨테이너 IP를 가르키게 된다.

Docker Network 구조

해결 시도