이 글은 인프런의 개발자를 위한 쉬운도커(데브위키) 강의를 수강하고 개인적으로 정리하는 글임을 알립니다.


네트워크 기본 개념

공인IP와 사설IP

공인 IP

  • 공인 IP는 전 세계 어디서나 고유하게 사용되며, 인터넷 상에서 서버나 장치가 통신할 때 사용된다. 일반적으로 ISP(인터넷 서비스 제공자)로부터 할당받는다.
  • 그림에서 공유기가 공인 IP를 사용하여 외부 서버와 통신한다.

 

사설 IP

  • 사설 IP는 특정 네트워크 안에서만 유효하며, 외부 인터넷에서는 사용되지 않는다. 가정이나 회사 내부에서 네트워크 장치 간 통신을 할 때 사용된다.
  • 사설 IP는 라우터나 공유기에 의해 내부 네트워크의 장치(스마트폰, 컴퓨터 등)에 할당된다.
  • 사설 IP 대역은 10.0.0.0~10.255.255.255, 172.16.0.0~172.31.255.255, 192.168.0.0~192.168.255.255가 있다. 이 대역의 IP는 외부 인터넷에서는 사용되지 않는다.

 

공유기는 내부 네트워크의 장치들에게 사설 IP를 할당하고, 공인 IP를 사용하여 외부와 통신하는 역할을 한다.

이를 통해 여러 장치가 하나의 공인 IP로 외부와 연결될 수 있다. 이 과정에서 NAT(Network Address Translation)라는 기술이 사용된다.

 

공인망과 사설망

공인망 (Public Network)

  • 공인 IP: 공인망에서는 공인 IP가 사용된다. 이 IP 주소는 전 세계적으로 고유하며, 외부 인터넷에서 접근 가능하다.
  • 이 다이어그램에서는 외부 서버가 공인 IP를 사용하여 외부 네트워크와 통신하고 있다. 일반적으로 웹 서버나 API 서버 등이 공인 IP를 통해 외부와 연결된다.

 

사설망 (Private Network)

  • 사설 IP: 사설망에서는 사설 IP가 사용된다. 이 IP 주소는 특정 네트워크 내에서만 유효하며, 외부 인터넷에서는 직접 접근할 수 없다.
  • 사설망에서는 라우터가 공인 IP를 사설 IP로 변환해주는 역할을 한다. 이를 통해 내부 네트워크 장치들이 공인 IP를 사용해 외부와 통신할 수 있게 된다.

 

라우터

  • 라우터는 공인망과 사설망을 연결하는 장치이다. 공인 IP를 통해 외부와 통신하며, 내부 네트워크 장치에 사설 IP를 할당해 준다.
  • 라우터는 NAT(Network Address Translation)을 사용하여 공인 IP로 들어오는 트래픽을 사설 IP를 가진 장치로 전달하고, 반대로 사설망에서 나가는 트래픽을 공인 IP로 변환하여 외부로 나간다.

 

사설망 통신

  • 사설망 내에서 각각의 장치들(서버들)은 사설 IP로 서로 통신할 수 있다. 이 통신은 외부 인터넷과는 독립적이며, 오로지 내부 네트워크에서만 이루어진다.
  • 각 서버는 192.168.0.x 대역의 IP 주소를 사용하며, 이 IP 주소는 사설망 내에서만 유효하다.

 

인터페이스와 포트


공인 IP는 외부 인터넷에서 네트워크 장치로 접근할 수 있는 고유한 주소이다. 여기서 124.111.46.91이 공인 IP로 설정되어 있으며, 외부 인터넷 사용자가 이 IP를 통해 내부 네트워크로 접근할 수 있다.

사설 IP는 내부 네트워크에서만 유효한 IP 주소이다. 예를 들어, 192.168.0.4, 192.168.0.5, 192.168.0.7, 192.168.0.8 등의 IP가 내부 네트워크에서 각 서버에 할당되어 있다.
이 사설 IP는 외부에서는 접근할 수 없으며, 라우터가 공인 IP와 사설 IP 간의 트래픽을 관리한다.

네트워크 인터페이스

각 서버는 네트워크 인터페이스를 통해 인터넷 또는 내부 네트워크에 연결된다. 여기서 192.168.0.4와 192.168.0.5가 서로 다른 네트워크 인터페이스를 통해 연결되어 있다.

랜선을 통해 물리적으로 네트워크에 연결된 상태를 나타낸다.

  • 유선 연결: 컴퓨터의 랜포트에 랜선을 꽂아 네트워크에 연결하는 방식. 예를 들어, 컴퓨터와 공유기를 랜선으로 연결하면 그 랜선이 네트워크 인터페이스를 통해 데이터를 주고받는다.
  • 무선 연결: Wi-Fi를 통해 무선으로 네트워크에 연결할 때 사용하는 네트워크 인터페이스. 컴퓨터나 스마트폰의 무선 네트워크 카드가 Wi-Fi 신호를 잡아 네트워크와 통신한다.
  • 가상화된 네트워크 연결: 클라우드 서버나 가상 머신(VM)에서는 실제 물리적인 장치 대신 소프트웨어적으로 만들어진 가상 네트워크 인터페이스를 사용한다. 이를 통해 가상 머신도 네트워크와 연결될 수 있다.

 

네트워크 인터페이스가 하는 일

  • 데이터 송수신: 네트워크 인터페이스는 컴퓨터에서 나가는 데이터(예: 인터넷 요청)를 네트워크로 보내고, 외부에서 들어오는 데이터(예: 웹사이트 응답)를 받아들인다.
  • 주소 할당: 네트워크 인터페이스는 고유한 IP 주소를 가진다. 이를 통해 장치가 네트워크 상에서 서로 구분될 수 있다. 예를 들어, Wi-Fi를 사용할 때마다 장치가 IP 주소를 할당받고, 그 주소로 데이터를 주고받는다.

 

포트 (Port)

  • 포트는 네트워크에서 특정 서비스를 식별하기 위한 논리적인 번호이다. 예를 들어, 하나의 서버(예: 192.168.0.5)에서 여러 개의 서비스가 실행될 때, 각 서비스는 고유한 포트를 사용한다.

 

NAT와 포트포워딩

NAT

이 그림은 NAT(Network Address Translation)을 통해 공인 IP와 사설 IP 간의 통신을 설명하는 구조이다.

NAT는 내부 네트워크에서 사용하는 사설 IP 주소를 공인 IP 주소로 변환하여 외부와 통신할 수 있도록 하는 기술이다.

 

NAT 테이블

  • NAT 테이블은 공인 IP와 사설 IP 간의 매핑 정보를 저장하는 역할을 한다. 이 테이블에 따라 외부에서 들어오는 요청이 어떤 사설 IP와 연결될지 결정된다.
  • 124.111.46.91:10001 → 192.168.0.4:80: 공인 IP의 10001번 포트로 들어오는 트래픽은 192.168.0.4 서버의 80번 포트(HTTP)로 전달된다.
  • 124.111.46.91:10002 → 192.168.0.5:5432: 공인 IP의 10002번 포트로 들어오는 트래픽은 192.168.0.5 서버의 5432번 포트(데이터베이스)로 전달된다.

 

InBound와 OutBound

  • InBound 트래픽: 외부에서 내부 네트워크로 들어오는 데이터 흐름을 의미한다. 예를 들어, 외부 클라이언트가 공인 IP로 HTTP 요청을 보내는 것이 InBound 트래픽이다.
  • OutBound 트래픽: 내부 네트워크에서 외부로 나가는 데이터 흐름을 의미한다. 내부 서버에서 외부의 클라이언트나 서버로 데이터를 보내는 것이 OutBound 트래픽이다.

 

포트포워딩

포트 포워딩

  • 포트 포워딩은 외부에서 들어오는 특정 포트의 요청을 내부 서버의 특정 포트로 전달하는 역할을 한다.
  • 124.111.46.91:80 → 192.168.0.4:80: 외부 클라이언트가 공인 IP의 80번 포트(주로 HTTP 요청)에 접근하면 이 트래픽은 192.168.0.4 서버의 80번 포트로 전달된다.
  • 124.111.46.91:21 → 192.168.0.5:20021: 외부 클라이언트가 공인 IP의 21번 포트(주로 FTP 요청)에 접근하면 이 트래픽은 192.168.0.5 서버의 20021번 포트로 전달된다.

 

NAT(Network Address Translation)

  • 라우터는 NAT 기술을 사용해 공인 IP와 사설 IP 간의 매핑을 관리한다. 이 과정을 통해 외부에서 공인 IP로 들어오는 요청을 내부 네트워크의 서버로 전달할 수 있다.

 

NAT와 포트포워딩 차이점

NAT(Network Address Translation)와 포트 포워딩(Port Forwarding)은 네트워크에서 공인 IP와 사설 IP 간의 통신을 관리하는 두 가지 주요 기술이지만, 그 목적과 동작 방식에서 차이가 있다.

NAT (Network Address Translation)

  • 주요 역할: 공인 IP와 사설 IP 간의 주소 변환을 통해 내부 네트워크 장치들이 공인 IP 하나를 사용하여 외부 인터넷과 통신할 수 있도록 한다.
  • 동작 방식: NAT는 주로 내부 네트워크에서 여러 장치(사설 IP 주소)가 하나의 공인 IP 주소를 공유할 수 있도록 한다. 내부 장치들이 외부로 나갈 때 사설 IP 주소를 공인 IP 주소로 변환하고, 반대로 외부에서 들어오는 데이터는 공인 IP에서 사설 IP로 다시 변환된다.
  • 사용 사례: 가정이나 회사에서 여러 장치가 하나의 공인 IP로 인터넷에 접속하는 환경에서 NAT는 필수적이다.

 

포트 포워딩 (Port Forwarding)

  • 주요 역할: 공인 IP의 특정 포트로 들어오는 외부 요청을 내부 네트워크의 특정 장치(사설 IP)와 특정 포트로 전달하는 기술이다.
  • 동작 방식: 외부에서 들어오는 요청이 공인 IP의 특정 포트에 도착하면, 라우터나 방화벽이 이 요청을 내부의 특정 장치로 전달한다. 이때 공인 IP의 포트와 사설 IP의 포트를 각각 설정하여, 외부에서 내부 서버로의 접근을 가능하게 한다.
  • 사용 사례: 외부에서 내부 네트워크의 특정 서버에 접근하려는 경우, 포트 포워딩을 통해 접근을 허용한다.
항목 NAT 포트 포워딩
기능 공인 IP와 사설 IP 간의 주소 변환 공인 IP의 특정 포트를 사설 IP와 포트로 매핑
목적 내부 네트워크 장치들이 외부와 인터넷 통신을 할 수 있도록 지원 외부에서 특정 내부 서버로 접근할 수 있도록 설정
적용 대상 내부 네트워크 전체 (여러 장치) 특정 포트에 대한 요청 (특정 서비스나 서버)
통신 방향 주로 내부에서 외부로 나가는 트래픽 처리 주로 외부에서 내부로 들어오는 트래픽 처리
사용 사례 여러 장치가 하나의 공인 IP로 인터넷에 나가는 상황 웹 서버, FTP 서버 등에 외부에서 접근할 때, 특정 포트로의 연결 필요

 

 

도커 네트워크

가상 네트워크

Docker는 컨테이너 간의 통신을 관리하기 위해 가상 네트워크를 사용하며, 기본적으로 브리지 네트워크(bridge network)를 통해 각 컨테이너에 IP 주소를 할당하고 통신할 수 있도록 한다.

  • Docker는 가상 네트워크(브리지)를 통해 각 컨테이너에 고유한 IP를 할당하고, 컨테이너 간의 통신을 관리한다.
  • 브리지 네트워크를 통해 컨테이너 간에 직접적인 통신이 가능하며, 외부 네트워크와 통신할 때는 NAT를 사용해 공인 IP와 사설 IP를 변환한다.
  • Docker 네트워크를 사용하면, 각 컨테이너가 독립적인 네트워크 환경에서 동작하면서도 필요한 경우 외부 네트워크와 통신할 수 있다.

 

가상 네트워크 브리지 (docker0)

  • Docker는 기본적으로 가상 브리지 네트워크를 생성한다. 이 브리지 네트워크는 컨테이너들이 같은 네트워크 안에서 서로 통신할 수 있도록 해준다.
  • 그림에서는 docker0이라는 가상 네트워크 인터페이스가 생성되어 있으며, 이 브리지를 통해 각 컨테이너들이 서로 연결된다.

 

가상의 IP 할당

  • Docker는 각 컨테이너에 고유한 IP 주소를 할당한다. 이 IP 주소는 Docker가 생성한 브리지 네트워크 내에서만 유효하며, 기본적으로 172.17.0.x 대역을 사용한다.
  • 예시로 컨테이너1은 172.17.0.2, 컨테이너2는 172.17.0.3 등의 IP 주소를 할당받아 서로 독립적으로 동작하지만, 동일한 브리지 네트워크 안에 있기 때문에 서로 통신할 수 있다.

 

컨테이너 간 통신

  • 동일한 브리지 네트워크에 속해 있는 컨테이너들끼리는 할당된 IP 주소를 통해 직접 통신할 수 있다. 그림에서 컨테이너1은 컨테이너2와 같은 네트워크 내에 있기 때문에 172.17.0.x 대역을 통해 서로 데이터를 주고받을 수 있다.
  • 외부 네트워크(공인망이나 사설망)와의 통신이 필요하다면, Docker가 IP 마스커레이딩(NAT)을 통해 외부와 통신할 수 있도록 한다.

 

외부 네트워크와의 연결

  • 서버(실습용 PC)의 192.168.0.10 IP는 내부 네트워크에서 할당된 IP이며, 이 서버에 설치된 Docker 컨테이너들은 외부 네트워크로의 접속이 필요할 때 192.168.0.10 또는 공인 IP 124.111.46.91을 통해 외부와 통신하게 된다.
  • 이때 Docker의 NAT 기능이 활용되어, 컨테이너의 내부 IP와 외부 IP 간의 변환을 통해 외부와의 통신이 이루어진다.

 

주요 동작 과정

  • 가상의 네트워크 브리지 생성: Docker는 기본적으로 docker0이라는 브리지를 자동으로 생성하여, 각 컨테이너가 이 브리지 네트워크에 연결되도록 한다.
  • 컨테이너에 가상 IP 할당: 브리지 네트워크에 연결된 각 컨테이너는 172.17.0.x 대역의 IP 주소를 할당받는다. 이 IP 주소는 컨테이너 간 통신을 가능하게 한다.
  • 컨테이너 간의 통신 전달: 같은 브리지 네트워크에 속해 있는 컨테이너끼리는 IP 주소를 통해 서로 통신할 수 있다. 외부 네트워크와 통신할 경우 NAT를 통해 IP 주소를 변환하여 외부와 연결한다.

 

가상 네트워크와 가상 인터페이스

  • 기본적으로 각 브릿지 네트워크는 서로 격리되어 있다. 즉, 서로 다른 브릿지 네트워크에 속한 컨테이너들은 직접적으로 통신할 수 없다.
  • docker0 브릿지 네트워크는 Docker 컨테이너 간의 통신을 위한 가상 네트워크를 제공하며, 각 컨테이너는 가상 인터페이스(Veth)를 통해 연결된다.
  • Veth 인터페이스는 각 컨테이너에 고유한 IP를 할당하고, 이 인터페이스를 통해 트래픽을 주고받는다.
  • iptables는 Docker가 자동으로 설정하는 트래픽 관리 도구로, 컨테이너 간 통신이나 외부 네트워크로의 트래픽 흐름을 제어한다.
  • 물리적 인터페이스인 eth0는 외부 네트워크와 연결되며, Docker 컨테이너가 외부 네트워크와 통신할 때 사용된다.

 

브릿지 네트워크 (docker0)

  • docker0는 Docker가 기본적으로 생성하는 가상 브리지 네트워크이다. Docker는 이 네트워크를 통해 모든 컨테이너들이 서로 연결될 수 있도록 한다.
  • Docker는 기본적으로 docker0이라는 브릿지 네트워크를 생성하며, 모든 컨테이너는 이 기본 브릿지 네트워크에 속하게 된다. 하지만, 사용자가 새로운 브릿지 네트워크를 생성하여 특정 컨테이너들을 격리할 수 있다. 이러한 경우, 각각의 브릿지 네트워크는 독립적으로 작동하며, 그 안에 속한 컨테이너끼리만 통신이 가능하다.
  • IP 주소: docker0의 IP는 172.17.0.1로 설정되어 있으며, 이는 가상 네트워크 안에서 컨테이너들과 통신할 때 사용된다.

 

 

가상 인터페이스 (Veth 인터페이스)

  • Veth(Virtual Ethernet)는 각 컨테이너와 호스트 머신 간에 가상 네트워크 인터페이스를 제공하는 장치이다. 그림에서 각 컨테이너는 Veth 인터페이스를 통해 호스트 머신의 docker0와 연결된다.
  • 예를 들어, 컨테이너1은 Veth1(172.17.0.2), 컨테이너2는 Veth2(172.17.0.3)로 연결된다. 각 컨테이너가 브리지 네트워크를 통해 독립적으로 통신할 수 있도록 Veth 인터페이스가 만들어진다.
  • Veth 인터페이스는 페어로 구성되며, 한 쪽은 컨테이너 내부에, 다른 쪽은 호스트 머신에 존재한다.

 

물리 인터페이스 (eth0)

  • eth0는 실제 물리적 네트워크 인터페이스로, 호스트 머신(서버)이 외부 네트워크와 연결되기 위해 사용하는 인터페이스이다.
  • 호스트 머신의 IP는 192.168.0.10으로 설정되어 있으며, 이 IP를 통해 물리적으로 외부 네트워크와 통신한다.

 

iptables

  • iptables는 Linux 시스템에서 네트워크 트래픽을 관리하고 제어하는 방화벽 역할을 하는 도구이다. Docker는 iptables 규칙을 자동으로 생성하여, 컨테이너 간의 통신과 외부 네트워크와의 트래픽 흐름을 제어한다.
  • Docker가 생성하는 규칙은 Veth 인터페이스를 통해 흐르는 트래픽을 제어하며, 이를 통해 네트워크 보안을 유지하거나 특정 통신을 차단할 수 있다.

 

트래픽 흐름 및 제어

  • 각 컨테이너는 가상 인터페이스를 통해 docker0 브릿지에 연결되고, 외부 네트워크와 연결되려면 물리적 인터페이스인 eth0를 통해 통신한다.
  • 컨테이너1 (172.17.0.2)과 같은 컨테이너는 Veth1을 통해 네트워크에 연결되고, 다른 컨테이너나 외부와 통신할 때 iptables 규칙을 따르게 된다.

 

 

 

가상 네트워크와 DNS

  • 기본 브리지 네트워크에서는 DNS 기능이 제공되지 않으며, 컨테이너들은 IP 주소로만 통신할 수 있다.
  • 커스텀 브리지 네트워크(second-bridge)에서는 Docker DNS를 통해 도메인 이름으로 통신이 가능하다. 이로 인해 컨테이너 간 통신이 더 쉽고 직관적으로 이루어진다.
  • Docker DNS는 도메인 이름을 IP 주소로 변환해주며, 이를 통해 컨테이너 간에 IP 주소 대신 도메인 이름으로 쉽게 접근할 수 있다.

 

브리지 네트워크

  • 브리지 네트워크(Bridge)는 Docker에서 기본적으로 제공하는 네트워크로, 각 컨테이너가 가상 네트워크에 연결되어 동일한 네트워크 내에서 통신할 수 있게 한다.
  • 그림에서 기본 브리지 네트워크는 DNS 기능이 제공되지 않는다. 즉, 기본 브리지 네트워크에 있는 컨테이너는 IP 주소로만 서로 통신할 수 있으며, 도메인 이름을 사용한 통신이 불가능하다.

 

second-bridge 네트워크

  • second-bridge는 사용자가 정의한 커스텀 브리지 네트워크이다. 이 네트워크에서는 Docker DNS를 사용하여 컨테이너들이 도메인 이름을 통해 통신할 수 있다.
  • 그림에서는 containerA와 containerB가 이 커스텀 브리지 네트워크에 연결되어 있으며, 각각의 컨테이너에 IP 주소가 할당되어 있다. containerA는 10.0.0.2, containerB는 10.0.0.3의 IP 주소를 가진다.

 

Docker DNS

  • Docker는 기본적으로 커스텀 네트워크에서는 내장된 DNS 서비스를 제공한다. 이를 통해 컨테이너들은 서로를 IP 주소 대신 도메인 이름(Domain Name)으로 접근할 수 있다.
  • 예를 들어, containerA는 containerB의 IP 주소(10.0.0.3)를 직접 사용할 필요 없이, 도메인 이름 containerB를 사용해 통신할 수 있다.
  • Docker DNS의 IP는 127.0.0.11로 설정되어 있으며, 이 주소를 통해 도메인 이름을 IP 주소로 변환해준다.

 

도메인 이름을 통한 통신

  • 커스텀 브리지 네트워크 내에서 containerA는 containerB의 도메인 이름을 통해 쉽게 통신할 수 있다.
  • 예를 들어, containerA가 containerB로 데이터를 전송하려면 containerB라는 도메인 이름을 사용하면 Docker DNS가 이 도메인 이름을 10.0.0.3으로 변환해 준다.