
아래 설명은 위 이미지와 같은 NAT 설정이 있고, docker run -d --name webserver 8080:80 nginx 로 실행한 컨테이너가 있을때 통신의 흐름을 정리한 내용입니다.
VirtualBox 위에 Ubuntu VM(docker라는 이름), 그 내부에서 Docker 데몬이 동작하는 상황을 가정하고,
VirtualBox NAT 네트워크
10.100.0.0/24 10.100.0.105 할당, 게이트웨이(가상 라우터) 10.100.0.1(또는 내부에서 별도 할당) 127.0.0.1 105 10.100.0.105 22 (SSH)Ubuntu VM 내부
10.100.0.105 (NAT 네트워크 상에서) 172.17.0.1이 됨. 172.17.0.0/16 대역에서 IP를 할당받음. 예: 172.17.0.2, 172.17.0.3 등Docker 컨테이너
docker run -d --name webserver -p 8080:80 nginx 0.0.0.0:8080 → 컨테이너(172.17.0.x:80)” 형태로 포트 매핑이 이루어짐. 172.17.0.1(docker0 브리지)아래는 “호스트에서 ssh를 통해 127.0.0.1:105로 접속할 때, 실제로 VM 내부 10.100.0.105:22로 연결되는 경로”를 단계별로 나타낸 것입니다.
┌─────────────────────────────┐
│ ① 호스트 PC │
│ (예: Windows, IP 다양) │
│ │
│ ssh 127.0.0.1 -p 105 │
└──────────────┬──────────────┘
│
│ (포트 포워딩 규칙: 127.0.0.1:105 → 10.100.0.105:22)
▼
┌─────────────────────────────┐
│ ② VirtualBox NAT 엔진 │
│ - NAT 네트워크: 10.100.0.0/24
│ - 'localhost' 라는 NAT 이름
└──────────────┬──────────────┘
│
│ (포트 포워딩 수행)
▼
┌─────────────────────────────┐
│ ③ Ubuntu VM (docker) │
│ - IP: 10.100.0.105 │
│ - SSH 데몬 : 22번 포트 │
│ - 여기서 Docker도 동작 중 │
└──────────────────────────────┘
ssh 127.0.0.1 -p 105 명령 실행 -p 8080:80 예시docker run -d --name webserver -p 8080:80 nginx 명령을 VM에서 실행했다고 가정합니다. curl http://localhost:8080 을 하면 Docker가 알아서 컨테이너(172.17.0.x:80)로 패킷을 라우팅해줍니다.┌───────────────────────┐
│ Ubuntu VM │
│ - IP: 10.100.0.105 │
│ - Port 8080 ↔ ├──> (docker0 브리지)
│ Container:80 │
└───────────────────────┘
172.17.0.1. 172.17.0.2 webserver는 172.17.0.2:80에서 Nginx가 동작 중이고, Docker가 iptables/NAT 규칙을 이용해 VM의 8080 → 172.17.0.2:80 으로 트래픽을 포워딩합니다.( VM 내부 )
┌─────────────────────────────────┐
│ docker0 (가상 브리지) │
│ IP: 172.17.0.1 (게이트웨이) │
│ │ │
│ └─────────────────────┬┘
│ ▼
│ Container IP: 172.17.0.2:80 (Nginx)
│
└─────────────────────────────────┘
8080 ↔ 컨테이너 80”만 있지, 호스트 → VM:8080 포트 포워딩은 설정하지 않았다고 가정합니다. 127.0.0.1:8080으로 접근하려면, 추가로 VirtualBox NAT의 포워딩 규칙을 만들어야 합니다. 예: http://127.0.0.1:8080으로 접속할 때, VM의 8080에 도달하고, 그 후에 Docker가 컨테이너 80으로 전달해 줄 수 있습니다.컨테이너가 외부 인터넷이나 호스트에 접속할 때는 다음 흐름으로 진행됩니다.
172.17.0.2 → 게이트웨이 172.17.0.1(docker0)로 패킷 전송 정리하면, 컨테이너 → (172.17.0.1) → VM(10.100.0.105) → (VirtualBox NAT) → 호스트/외부 순으로 라우팅이 일어납니다.
호스트
127.0.0.1:8080 (가정) VirtualBox NAT
Ubuntu VM(docker)
10.100.0.105:8080 10.100.0.105:8080 → 172.17.0.2:80 (컨테이너 IP) 로 NAT/포워딩컨테이너(webserver)
172.17.0.2:80 ┌─────────────┐ ┌─────────────────────────────────┐
│ (1) Host │ │ (2) VirtualBox NAT │
│127.0.0.1:8080│ │ 10.100.0.0/24 -> VM:8080 │
└────┬────────┘ └──────────────┬──────────────────┘
│ │
│ (포트포워딩) │
▼ ▼
┌────┴─────────────────────────────────┐
│ (3) Ubuntu VM (10.100.0.105) │
│ Docker -p 8080:80 -> │
│ docker0 : 172.17.0.1 (게이트웨이) │
└────┬─────────────────────────────────┘
│ (iptables / NAT)
▼
┌────┴────────────────────────────┐
│ (4) Container (172.17.0.2:80)│
│ webserver(Nginx) │
└─────────────────────────────────┘
NAT 네트워크 10.100.0.0/24
10.100.0.xxx IP를 할당, 외부(호스트)와 NAT 통해 통신호스트 IP/포트 127.0.0.1:105 (또는 8080 등)
게스트 IP/포트 10.100.0.105:22
:105 → VM의 :22로 매핑Docker bridge 게이트웨이 172.17.0.1
docker0)의 IP 172.17.0.0/16 대역의 IP를 할당받고, 게이트웨이로 172.17.0.1을 사용Container IP 172.17.0.x:80 (예: 172.17.0.2:80)
webserver 컨테이너가 실제로 할당받은 IP와 포트(내부 웹 서버) -p 8080:80 옵션으로 VM의 8080과 연결127.0.0.1:포트” 형태로 접속하면, VirtualBox가 포트 포워딩 규칙에 따라 VM(10.100.0.105)의 특정 포트로 패킷을 전달합니다. 결국, IP/포트가 여러 겹으로 계층화되어 있지만, 각각의 포트 포워딩(또는 NAT) 규칙에 맞춰 요청이 전달되며, 가상화와 컨테이너 네트워킹이 함께 동작하는 것입니다.