💡 개요
오늘은 Docker 컨테이너에서 사용하는 포트가 2개인 경우에 대해 정리해보자.
🛠️ Docker 포트
아래 코드는 내가 사용 중인 Kafka 컨테이너 배포에 사용되는 코드이다.
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
kafka1:
image: wurstmeister/kafka
container_name: kafka1
ports:
- "9092:9092"
- "29092:29092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:29092
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock
depends_on:
- zookeeper
kafka2:
image: wurstmeister/kafka
container_name: kafka2
ports:
- "9093:9093"
- "29093:29093"
environment:
KAFKA_BROKER_ID: 2
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9093,PLAINTEXT_HOST://localhost:29093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9093,PLAINTEXT_HOST://0.0.0.0:29093
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock
depends_on:
- zookeeper
현재 난 Kafka와 연동할 Spring 서버는 로컬에서, Kafka는 Docker에서 실행하는 상황이다.
그런데 kafka1, kafka2 컨테이너의 포트 설정을 보면 각각 총 2개의 포트를 사용한다.
- kafka1 : 9092, 29092
- kafka2 : 9093, 29093
이렇게 사용하는 이유는 9092, 9093 포트만 사용하면 Spring과 연동이 안되기 때문이다.
내가 보기엔 호스트 상의 컨테이너 명 차이 문제인 듯하다.
- Docker 컨테이너끼리는 컨테이너(zookeeper, kafka1, kafka2) 명으로 통신 가능
- 하지만 로컬에서 동작중인 Spring 서버는 해당 컨테이너명으로 접근하지 못함
뭐 이 문제 말고 복합적인 이유가 있긴 한데, 그거 말고 오늘은 포트에만 집중하자.
위와 같이 2개의 포트로 분리한 이유는 내부 통신, 외부 통신을 구분하기 위해서이다.
⚙️ 컨테이너 내부 통신용
Kafka 브로커끼리, 또는 Kafka와 Zookeeper는 같은 Docker 네트워크 안에 있으므로 컨테이너 이름을 통해 접근할 수 있다.
- 예: kafka1:9092, kafka2:9093
이 포트들은 내부 클라이언트 또는 브로커 간 통신에서 사용된다.
⚙️ 로컬 머신(Spring 애플리케이션) ↔ Kafka 컨테이너 통신용
Spring 서버는 로컬에서 동작 중이니까, kafka1 같은 컨테이너 이름으로 접근할 수 없다.
대신 호스트의 IP와 포트로 접근해야 한다.
- 예: localhost:29092, localhost:29093
그래서 Kafka는 외부 접근을 위한 추가 포트를 열어줘야 한다.
오호라.. 이렇게 내부 포트, 외부 포트를 나누는 것도 가능하구먼 그래..
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.04.22 - 프로세스 생명 주기 (0) | 2025.04.22 |
---|---|
[개발 일기] 2025.04.21 - Docker 익명 볼륨 (0) | 2025.04.21 |
[개발 일기] 2025.04.19 - 테이블의 기본키로 VARCHAR? (0) | 2025.04.19 |
[개발 일기] 2025.04.18 - DB 복합키 (0) | 2025.04.18 |
[개발 일기] 2025.04.17 - Cookie 요소 (0) | 2025.04.17 |