네트워크 구성(가상 브리지/가상 NIC)
Linux는 Docker를 설치하면 서버의 물리 NIC(Network Interface Card)가 docker()라는 가상 브리지 네트워크로 연결된다. 이 docker()는 Docker를 실행시킨 후에 default로 만들어진다.
Docker 컨테이너가 실행되면 컨테이너에 172.17.0.0/16이라는 서브넷 마스크를 가진 프라이빗 IP 주소가 eth0으로
자동으로 할당된다.
이 가상 NIC는 OSI 계층의 Layer 2인 가상 네트워크 인터페이스로, 페어인 NIC와 터널링 통신을 한다.
가상 NIC(vethxxx)는 컨테이너에서는 eth0으로 인식된다.
Docker 컨테이너와 외부 네트워크가 통신을 할 때는 가상 브리지 docker()와 호스트 OS의 물리 NIC에서 패킷을 전송하는 장치가 필요하다. Docker에서는 NAPT 기능을 사용하여 연결한다.
NAPT(Network Address Port Translation)란 하나의 IP 주소를 여러 컴퓨터가 공유하는 기술로, IP 주소와 포트 번호를
변환하는 기능이다.
프라이빗 IP주소와 글로벌 IP주소를 투과적으로 상호 변환하는 기술로, TCP/IP의 포트 번호 까지 동적으로 변환하기 때문에 하나의 글로벌 IP 주소로 여러 대의 머신이 동시에 연결할 수 있다.
Docker에서는 NAPT로 Linux의 iptables를 사용한다.
Docker에서는 컨테이너 시작 시에 컨테이너 안에서 사용하고 있는 포트를 가상 브리지인 docker()에 개방한다.
예를 들어 컨테이너 시작 시에 컨테이너 안의 웹 서버가 사용하는 80번 포트를 호스트 OS의 8080번 포트로 전송하도록 설정한다. 그러면 외부 네트워크에서 호스트 OS의 8080번 포트에 액세스하면 컨테이너 안의 80번 포트로 연결된다.
*NAT와 NAPT(IP 마스커레이드)의 차이
NAT(Network Address Translation)
프라이빗 IP 주소가 할당된 클라이언트가 인터넷상에 있는 서버에 액세스 할 때 NAT 라우터는 클라이언트의 프라이빗 IP 주소를 NAT가 갖고 있는 글로벌 IP 주소로 변환하여 요청을 송신한다. 응답은 NAT 라우터가 송신처를 클라이언트의 프라이빗 IP주소로 변환하여 송신한다.
이러한 주소 변환에 의해 프라이빗 네트워크상의 컴퓨터와 인터넷상의 서버 간의 통신이 설립된다. 그런데 NAT의 경우 글로벌 IP 주소와 프라이빗 IP 주소를 1:1로 변환하기 때문에 동시에 여러 클라이언트가 액세스할 수 없다.
NAPT(Network Address Port Translation)
NAPT는 프라이빗 IP 주소와 함께 포트 번호도 같이 변환하는 기술이다. 프라이빗 IP 주소를 글로벌 IP 주소로 변환할 때 프라이빗 IP 주소별로 서로 다른 포트 번호로 변환한다.
예를 들어 클라이언트 A가 보낸 요처은 포트 번호 1500으로 하고, 클라이언트 B가 보내온 요청은 포트 번호 1600으로 한다. 인터넷상의 서버로부터 NAPT의 글로벌 IP 주소의 서로 다른 포트 번호 앞으로 응답이 돌아온다.
즉, NAPT는 포트 번호를 바탕으로 프라이빗 IP 주소로 변환할 수 있다.
이로써 하나의 글로벌 IP 주소와 여러 개의 프라이빗 IP 주소를 변환할 수 있다.
또한 Linux에서 NAPT를 구축하는 것을 IP 마스커레이드(IP mascarade)라고 부른다.
마스커레이드(mascarade)란 영어로 가면무도회를 의미한다. 많은 가면을 쓴 IP 패킷이 포트 번호에 가면을 붙여 변환되는 모습을 나타낸 것이다.
참고
'About > Docker' 카테고리의 다른 글
[Docker] 이미지 목록 표시 (docker image ls) (0) | 2021.03.15 |
---|---|
[Docker] Docker의 작동 구조 (4) (이미지 데이터 관리) (0) | 2020.12.27 |
[Docker] Docker의 작동 구조 (2) (cgroups) (0) | 2020.12.27 |
[Docker] Docker의 작동 구조 (1) (namespace) (2) | 2020.12.13 |
[Docker] Docker 컴포넌트 (1) | 2020.12.13 |