개요
SSAFY 시절부터 docker-compose를 작성할 때, 저 ports가 뭘 의미하는지 항상 궁금했다.
검색해서 찾아보면 대부분 “호스트 포트:컨테이너 포트” 이런식으로 외웠다.
그런데 이런 식으로 단순하게 외우니까 저 포트를 볼 때마다 늘 까먹어서 제대로 공부해봤다.
호스트 포트와 도커 컨테이너 포트
위의 그림으로 확실하게 설명 가능하다.
사용자가 호스트의 특정 포트로 요청을 보내면, 해당 포트와 바인딩되어 있는 컨테이너를 찾은 뒤 해당 컨테이너에 요청을 전달하는 것이다.
위의 이미지는 도커 컨테이너를 실행시킨 뒤, 내부 네트워크를 확인한 로그이다. 노란색 네모를 보면 각각의 컨테이너가 서로 다른 IP를 사용중인 것을 알 수 있다.
호스트 포트는 내가 사용중인 로컬의 포트번호를 의미한다. 그렇기 때문에 겹치는 포트가 있으면 안된다.
위의 이미지처럼 eureka-service와 test-service1을 같은 호스트 포트로 설정한 뒤, 컨테이너를 실행하면 포트 번호가 이미 사용중이라는 에러가 발생한다.
하지만 도커 컨테이너 포트는 겹쳐도 상관없다. 왜냐하면 각각의 컨테이너는 서로 다른 IP를 사용하기 때문이다.
이렇게 test-service1 컨테이너와 test-service2 컨테이너의 컨테이너 포트를 같은 8080포트로 설정한 뒤 컨테이너를 실행하면 정상적으로 동작한다.
쉽게 이해하자면 test-service1 컨테이너의 Spring 서버는 192.168.70.1:8080 에서 실행된 것이고, test-service2 컨테이너의 Spring 서버는 192.168.70.2:8080 에서 실행된 것이다.
도커 컨테이너 네트워크 특징
- 각각의 컨테이너는 독립적인 IP를 사용하기 때문에 다른 컨테이너와 포트번호가 겹처도 상관없다.
- 그런데 또 굳이 겹치게 할 필요는 없을듯하다..
- 도커 컨테이너의 네트워크 기본값은 bridge 방식이기 때문에 기본적으로 하나의 호스트 내부에 있는 컨테이너는 서로 통신이 가능하다.
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.01.06 - OSI 7계층 (물리 계층) (0) | 2025.01.06 |
---|---|
[개발 일기] 2025.01.05 - 자바 객체 락 (synchronized) (0) | 2025.01.05 |
[개발 일기] 2025.01.04 - Event, Publisher, Listener (0) | 2025.01.04 |
[개발 일기] 2025.01.03 - Redis의 만료기한 (0) | 2025.01.03 |
[개발 일기] 2025.01.02 - @Transactional (readOnly = true) (0) | 2025.01.02 |