이 글은 인프런의 개발자를 위한 쉬운도커(데브위키) 강의를 수강하고 개인적으로 정리하는 글임을 알립니다.
네트워크 기본 개념
공인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으로 변환해 준다.
'Cloud > Docker' 카테고리의 다른 글
[Docker + SpringBoot] Docker와 SpringBoot의 타임존 동기화 (1) | 2024.10.09 |
---|---|
[Docker] Stateless 와 Volume (1) | 2024.09.12 |
[Docker] 이미지와 컨테이너 레이어 (0) | 2024.09.09 |
[Docker] SpringBoot + MySQL 컨테이너화 (1) | 2024.09.08 |
[Docker] 이미지 레지스트리 (3) | 2024.09.07 |