가상 네트워크에 포트포워딩을
하는 이유와 방법이 무엇일까?
가상 네트워크의 NAT, 포트포워딩
--
가상 네트워크에서 포트포워딩을 하는 명령어 형식
docker run {-p 호스트OS포트:컨테이너포트} ...
-p | 포트포워딩을 지정해주는 옵션 |
"-p" 옵션으로 `:` 클론을 기준으로 두 개의 포트를 작성하여 포트포워딩을 지정해 준다.
왼쪽에 작성하는 포트 = 서버(PC)에서 사용할 호스트OS의 포트번호를 지정
오른쪽에 작성하는 포트 = 컨테이너가 사용하는 포트번호를 지정
기본적으로 같은 가상 네트워크 안에서 컨테이너를 실행하면 해당 컨테이너끼리는 통신이 가능하다.
다만
도커를 설치하고 사용 중인 서버(PC)의 호스트 OS나
가상 네트워크의 외부에서 가상 네트워크의 컨테이너로 접근하려면 포트포워딩을 사용해야 한다.
일반적으로 공인망에서 사설망으로 신호를 전달할 때
NAT 기술과 포트포워딩 기술을 사용한다.
위 그림처럼 가상 네트워크를 사용할 때에도
NAT 기술과 포트포워딩 기술을 사용할 수 있다.
그래서 Nginx 컨테이너와 postgres 컨테이너는
외부에 있는 사설망(192.168.0.20, 192.168.0.30)으로 네트워크 신호를 전달할 수 있다.
NAT는
가상 네트워크가 알아서 설정해 주기 때문에 직접 무언가를 지정하지 않아도 내부에 있는 컨테이너는
외부에 있는 사설망(192.168.0.10)을 통해서 다른 서버로도 접근할 수 있게 된다.
위 그림처럼
반대로 외부 서버에서 컨테이너로 접근하려면 어느 브릿지이며 어느 컨테이너로 접근하는지 모르기 때문에 접근이 불가능하다.
실제로 도커가 실행 중인 192.168.0.10 IP로 먼저 접근을 해야 하며
이때 포트포워딩을 사용해서 192.168.0.10 IP의 특정 포트로 접근했을 때
원하는 컨테이너로 전달하도록 포트포워딩을 등록해야 접근이 가능해진다.
각 컨테이너를 실행할 때 포트포워딩을 해서 실행을 시키면
192.168.0.10:8001로 접근하면 "Nginx" 컨테이너로
192.168.0.10:5432로 접근하면 "postgres" 컨테이너로 전달하게 된다.
이렇게 포트포워딩을 사용하게 되면
컨테이너 간의 통신뿐만 아니라 컨테이너가 소속된 호스트OS의 네트워크(사설망)에서도 컨테이너로 접근이 가능해진다.
포트포워딩을 할 때
호스트 OS의 포트 번호는 아무거나 지정해도 상관은 없지만
이미 포트포워딩으로 지정된 포트는 중복해서 사용할 수 없다.
즉, 위 그림에서 8001번과 5432번은 이미 포트포워딩으로 지정되어서 해당 포트는 더 이상 지정할 수 없다.
--
도커 DNS
--
도커에는 컨테이너들이 기본적으로 사용할 수 있는 DNS 서버를 제공한다.
기본 네트워크인 "bridge"네트워크에는 도커 DNS 기능이 없다.
도커 DNS 서버에는 IP 주소와 도메인이 저장되어 있는데
해당 도메인은 자동으로 컨테이너명으로 저장된다.
이 도커 DNS 서버가 있기 때문에 컨테이너들은 IP 주소가 아니라 컨테이너명으로도 서로 통신이 가능한 것이다.
- containerA에서 containerB로 요청
- DNS에서 containerB 도메인의 IP 주소를 찾음
- 찾은 IP 주소로 요청을 전달
도커 DNS 서버는 외부의 일반 DNS 서버와도 연동이 되어 있기 때문에
컨테이너는 외부 도메인인 "네이버", "구글" 같은 것도 사용이 가능하다.
DNS에 저장된 도메인의 IP 주소가 변경되어도
IP 주소가 변경이 되면 해당 DNS에서도 변경된 IP 주소로 수정되기 때문에
마음 편하게 컨테이너명으로 통신을 하면 된다.
--
참고 및 출처
'Docker' 카테고리의 다른 글
도커 볼륨, 마운트, 바인드 마운트 (+명령어) (0) | 2024.06.28 |
---|---|
Docker의 가상 네트워크 (+명령어) (0) | 2024.06.27 |
Vue.js, Spring Boot, PostgreSQL 컨테이너 구성 및 연결하여 애플리케이션 구현하기 (+실습) (0) | 2024.06.25 |
클라우드 네이티브 애플리케이션 (0) | 2024.06.24 |
멀티 스테이지 빌드 (Multi-Stage build) 란? (+실습) (0) | 2024.06.22 |