도커(Docker) : 포트 포워딩 설정(포트 맵핑)하기

반응형

 

도커(Docker) : 포트 포워딩 설정(포트 맵핑)하기

본 글에서는 도커 컨테이너 내부에서 동작하는 서버로 컨테이너 외부에서 접속할 수 있도록 포트 포워딩(Port forwarding) 설정 또는 포트 맵핑(Port mapping)하는 방법을 소개한다.

 

NAT가 적용되는 도커 컨테이너

도커 컨테이너를 실행하면 기본적으로 NAT(Network Address Translation) 환경이 적용된다. 

도커 컨테이너가 실행되는 호스트 시스템에 NAT 기능이 구동되며, 도커 컨테이너는 네트워킹을 위해 NAT 내부 망 IP 주소를 할당받게 된다.

 

다음 화면은 도커 컨테이너에서 네트워크 인터페이스의 정보를 확인한 화면이다.

root@5f26874d8117:/workspace# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:28 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2121 (2.1 KB)  TX bytes:265 (265.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@5f26874d8117:/workspace#
root@5f26874d8117:/workspace# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 eth0
root@5f26874d8117:/workspace#

 

eth0 네트워크 인터페이스에 NAT 내부망 IP 주소인 172.17.0.2가 할당되어 있는 것을 확인할 수 있다.

디폴트 게이트웨이의 IP 주소는 172.17.0.1로써, 이는 도커 컨테이너가 동작 중인 호스트 시스템을 의미한다. 도커 컨테이너 내부에서는 해당 디폴트 게이트웨이를 통해 컨테이너 외부와의 통신이 가능하다.

 

 

포트 포워딩(포트 맵핑) 기법

이처럼 도커 컨테이너는 네트워크 구성 상 NAT 내부망에서 동작하고 공인 IP 주소가 아닌 사설 IP 주소를 사용하므로, 기본적으로는 컨테이너 외부(예: 인터넷망)에서 내부로의 접속이 불가능하다.

 

이러한 한계를 극복하기 위해 NAT 환경에서 포트 포워딩(포트 맵핑)이라는 기법이 널리 사용되고 있다.

이는 NAT 가 동작하는 라우터/게이트웨이의 특정 포트 번호로 유입되는 트래픽을 NAT 내부에서 동작하는 시스템의 특정 포트로 전달해 주는 기법이다.

 

예를 들어, NAT 망 내부에서 TCP 20,000 포트로 접속되는 서버 프로그램이 동작하고 있을 경우, NAT 라우터/게이트웨이는 자신의 TCP 20,000 포트로 전달되는 모든 트래픽을 NAT 망 내부의 특정 IP를 갖는 시스템의 TCP 20,000 포트로 무조건 전달하게 설정될 수 있다.

 

도커 시스템 관점에서 NAT 구성을 살펴보면, 도커를 구동하는 호스트 시스템이 NAT 라우터/게이트웨이가 되며, 도커 컨테이너는 NAT 망 내부의 시스템이 된다.

 

 

도커 컨테이너 포트 포워딩 설정 (포트 맵핑)

도커 컨테이너 실행 시에 다음과 같이 "-p" 옵션을 추가하여 실행함으로써 포트 포워딩을 설정할 수 있다.

docker run -p <host port number>:<container port number>/<protocol> [IMAGE NAME] [OTHER OPTIONS...]

 

각 파라미터의 의미는 다음과 같다.

  • host port number : 호스트 시스템에서 사용되는 포트 번호
  • container port number : 컨테이너 내에서 사용되는 포트 번호
  • protocol : 프로토콜 유형 - udp, tcp, stcp 등

 

예를 들어 -p 8080:80/tcp 옵션을 적용하면, 호스트 시스템의 8080번 TCP 포트로 유입되는 트래픽은 모두 도커 컨테이너의 80번 TCP 포트로 전달된다.

 

protocol 파라미터 생략 시 tcp 로 기본 적용되며, 다수의 포트 맵핑이 필요할 경우에는 다수의 "-p" 옵션을 동시에 적용할 수 있다.

 

관련하여 보다 자세한 내용은 아래 공식 도커 문서 사이트의 Operations for standalone containers on overlay networks 부분에서 확인할 수 있다.

 

 

Use overlay networks

The overlay network driver creates a distributed network among multiple Docker daemon hosts. This network sits on top of (overlays) the host-specific networks, allowing containers connected to it (including swarm...

docs.docker.com


파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

 

댓글

Designed by JB FACTORY