가상 네트워크는 무엇이고
어떻게 동작하는 것일까?
네트워크란?
--
2024.06.23 - [Terminology] - 네트워크란? (feat. IP, 네트워크 인터페이스, 포트, NAT, 포트포워딩, DNS)
--
가상 네트워크 구성
--
가상 네트워크는
서버 한 대 안에서 여러 네트워크를 구성하는 기술이다.
해당 가상 네트워크망 안에서 컨테이너들이 존재할 수 있고
해당 컨테이너들은 같은 가상 네트워크망 안에서 서로 통신할 수 있으며
내부의 컨테이너와 외부의 서버와도 통신이 가능하다.
위 그림은
사설망을 통해서 현재 사용 중인 PC에 IP(192.168.0.10)를 할당받고
해당 PC에 도커 가상화 기술을 사용하여 내부에 컨테이너 여러 대를 실행시킨 구조이다.
인터넷 선(랜선)이나 공유기와 같이 물리적인 장치 없이
한 대의 서버(PC)에서 논리적으로 정의되어 있는 네트워크이기 때문에 가상 네트워크라고 부른다.
도커를 설치하고 실행하게 되면
도커는 기본 가상 네트워크인 "bridge" 네트워크와 해당 네트워크에서 사용하는 가상 공유기 "docker0"를 생성한다.
즉, 별도로 네트워크를 생성하지 않아도 기본적으로 "bridge" 네트워크가 자동 생성되며
컨테이너를 실행할 때 해당 컨테이너를 실행시킬 네트워크를 지정하지 않으면 기본 "bridge" 네트워크에서 실행된다.
가상 네트워크에서 사용하는 가상의 공유기를 "브릿지"라고 부른다.
해당 브릿지(가상의 공유기)는 가상의 IP 주소를 할당받는데
일반적으로 172.17.0.1 IP 주소를 할당받는다.
여기서 가상의 IP는 실제로 존재하는 IP가 아닌
서버나 PC에서 논리적으로 정의되어 있는 가상의 IP이다.
브릿지 네트워크는 컨테이너들에게 IP를 할당해주고 컨테이너들 끼리 통신이 가능하도록 만들어준다.
- 도커에서 컨테이너를 실행하면
- 도커는 브릿지 네트워크의 IP 주소 범위 안에서 IP 주소 하나를 컨테이너에게 할당
- 여러 개의 컨테이너를 추가로 실행하면 각자의 컨테이너들은 같은 대역대에서 겹치지 않는 IP를 할당받는다.
가상 네트워크의 구조는 물리 네트워크의 구조와 동일하다.
물리 네트워크는
공인 IP에서 "PC", "TV", "스마트폰" 등 에게 사설 IP를 할당해 주는 것처럼
가상 네트워크는
브릿지에서 컨테이너들에게 가상 IP를 할당해 준다.
동일한 브릿지에서 생성된 네트워크(컨테이너)는 해당 브릿지를 통해서 서로 통신이 가능하다.
예시
컨테이너1 (172.17.0.2)에서 컨테이너3 (172.17.0.4)로 요청을 보내면
컨테이너1은 브릿지를 통해서 컨테이너3으로 요청이 전달된다.
172.17.0.2(컨테이너1) -> 172.17.0.1(브릿지) -> 172.17.0.4(컨테이너3)
이렇게 논리적으로 네트워크 환경을 구성하는 기술을 SDN (Software Defined Network)라고 부른다.
--
가상 네트워크에서 네트워크 신호가 전달되는 원리
--
- 일반적인 서버(PC)에 물리적인 네트워크 인터페이스에 인터넷 선(랜선)을 꽂아 연결한다.
네트워크 인터페이스에 랜선을 연결하면 해당 서버(PC)는 공인 IP 또는 사설 IP를 할당받는다. (192.168.0.10) - 서버(PC)에 도커를 설치하고 실행하면 도커는 호스트OS에 가상 네트워크 인터페이스(docker0)를 생성한다.
이때 브릿지(docker0)는 가상 IP를 할당 받는다. (172.17.0.1) - 해당 브릿지 네트워크에 컨테이너를 실행하면 해당 컨테이너 내부 OS와 해당 브릿지인 docker0이 생성된 동일한 가상 인터페이스에 가상 네트워크 인터페이스(Veth)가 생성된다.
이때 컨테이너는 범위 내의 가상 IP를 할당받는다. (172.17.0.2)
컨테이너 내부에 생성된 가상 네트워크 인터페이스(Veth)와 호스트 OS에 생성된 가상 네트워크 인터페이스(Veth)는 연결되어 있다.
Veth 뒤에 숫자는 랜덤 하게 고유한 번호가 할당된다.
결국 위 그림처럼
호스트 OS에는 실제로 존재하는 물리 네트워크 인터페이스 1개와
소프트웨어로 만들어진 가상의 네트워크 인터페이스 5개가 생성되게 된다.
컨테이너1에서 컨테이너2로 요청을 보내면?
1번 컨테이너 172.17.0.2 IP는 2번 컨테이너인 172.17.0.3 IP를 도착지로 지정하여 요청을 보내게 된다.
물리적인 네트워크에서는 도착지의 IP에 맞게 네트워크를 통해서 전달하는 것을 네트워크 장비들이 알아서 해준다.
다만 가상 네트워크는 별도의 물리적인 장비가 없기 때문에 소프트웨어적으로 전달을 해줘야 한다.
이때 가상의 네트워크 인터페이스 간에 네트워크 패킷을 전달하는 규칙은
호스트 OS의 커널 소프트웨어인 "iptables"에 정의되어 있다.
iptables는
리눅스 내부의 네트워크 트래픽을 관리 및 제어하고 라우팅 규칙을 정의하는 소프트웨어다.
(내부에서 발생하는 네트워크 트래픽은 iptables에서 정의된 규칙대로 동작한다.)
iptables에는 특정 IP로 네트워크를 보냈을 때 어떠한 인터페이스로 전달할지에 대한 규칙이 정의되어 있다.
그래서 도커는
컨테이너가 생성 및 삭제될 때마다 호스트 OS의 iptables의 규칙도 알맞게 수정한다.
즉, 별도의 설정 없이 같은 브릿지에서 생성된 컨테이너들끼리는 서로 통신할 수 있는 환경이 구성되어 있다.
도커는 가상 네트워크 내부에서 여러 개의 브릿지 네트워크를 관리할 수 있다.
같은 브릿지 네트워크안에 속해있는 컨테이너들 끼리는 통신이 가능하기 때문에
브릿지 네트워크 단위로 분리하여 관리하면 특정 컨테이너들 끼리 통신이 되지 않도록 구성할 수 있다.
(다른 브릿지 네트워크에 있는 컨테이너들끼리는 통신 불가능)
--
가상 네트워크 기본 명령어로 통신 테스트
--
목표
가상 네트워크에서 기본으로 생성되는 "bridge" 브릿지 네트워크 외에 다른 브릿지 네트워크를 추가하여
서로 내부의 컨테이너 간에 통신이 되는지 테스트하기
기본적으로 존재하는 "bridge" 브릿지 네트워크는
172.17.0.1 ~ 172.17.255.255 범위의 IP를 사용한다.
1. 도커의 네트워크 리스트 조회하기
네트워크 리스트를 조회하는 명령어
docker network ls
DRIVER 속성은
해당 네트워크의 종류를 의미한다.
- Bridge 네트워크 -
도커 브릿지를 활용해서 컨테이너간에 통신함
NAT 및 포트포워딩 기술을 활용하여 외부 통신도 지원
- Host 네트워크 -
호스트의 네트워크를 공유
모든 컨테이너는 호스트 머신과 동일한 IP를 사용
포트 중복 불가능
- Overlay 네트워크 -
호스트 머신이 다수일 때 네트워크 관리용
쿠버네티스에서 사용
- Macvlan 네트워크 -
컨테이너에 MAC 주소를 할당하여 물리 네트워크 인터페이스에 직접 연결
조회한 네트워크들을 보면
브릿지 네트워크는 이전에 생성했던 "leafy-network"를 제외하고는 기본으로 제공하는 "bridge" 브릿지 네트워크만 존재하는 것을 확인할 수 있다.
2. 기본 브릿지 네트워크 "bridge"의 상세 정보를 조회하기
네트워크의 상세정보를 조회하는 명령어 형식
docker network inspect {네트워크명}
"bridge" 네트워크 상세 정보 조회하는 명령어
docker network inspect bridge
네트워크명, IP, 생성일 등 상세 정보를 확인할 수 있다.
이 중에서 중요한 것은 "Subnet"과 "Gateway"이다.
Subnet | 해당 네트워크에서 생성되는 컨테이너들이 할당 받을 수 있는 IP의 범위 "/16"이 바로 IP의 범위를 의미하며 16은 172.17.0.0 ~ 172.17.255.255 범위를 의미한다. |
Gateway | 해당 브릿지 네트워크의 IP 주소 |
3. "second-bridge"라는 브릿지 네트워크를 생성하고 해당 브릿지 네트워크의 IP 범위도 지정해기
네트워크 생성하는 명령어 형식
docker network create {네트워크명}
특정 IP 주소와 IP 주소 범위를 지정한 "second-bridge" 브릿지 네트워크 생성하는 명령어
docker network create --driver bridge --subnet 10.0.0.0/24 --gateway 10.0.0.1 second-bridge
옵션 설명
--driver | 해당 네트워크의 종류를 지정 |
--subnet | 해당 네트워크에서 사용하는 컨테이너들이 할당 받을 수 있는 IP 범위 지정 |
-- gateway | 해당 네트워크의 IP 주소 지정 |
10.0.0.0/24는 10.0.0.0 ~ 10.0.0.255 범위를 의미한다.
4. "second-bridge" 브릿지 네트워크 상세 정보 확인하기
"second"-bridge" 네트워크 상세 정보 조회 명령어
docker network inspect second-bridge
5. 각 브릿지 네트워크에 컨테이너 생성하기
"birdge" 네트워크에 "ubuntuA", "ubuntuB" 컨테이너를, "second-birdge" 네트워크에는 "uubntuC" 컨테이너를 생성 명령어
docker run -d --name ubuntuA anijy/test
docker run -d --name ubuntuB anijy/test
docker run -d --network second-bridge --name ubuntuB anijy/test
기본 브릿지 네트워크인 "birdge"에 컨테이너를 생성할 때에는 네트워크명을 생략해도 된다.
여기서 "ubuntuB" 컨테이너에서 "ubuntuC" 컨테이너에 요청이 불가능하다. (반대도 불가능)
오직 같은 브릿지 네트워크인 ubuntuA와 ubuntuB만이 서로 요청 응답이 가능하다.
6. 네트워크 삭제하기
네트워크를 삭제하기 위해서는
해당 네트워크와 연결된 컨테이너가 없어야 한다.
즉, 해당 네트워크에서 연결된 컨테이너가 실행 중이거나 중지 상태이라면 네트워크 삭제가 불가능하다.
컨테이너 삭제하는 명령어
docker rm -f ubuntuA ubuntuB ubuntuC
네트워크 삭제하는 명령어 형식
docker network rm {네트워크명}
"second-bridge" 브릿지 네트워크 삭제하는 명령어
docker network rm second-bridge
--
참고 및 출처
'Docker' 카테고리의 다른 글
이미지 레이어 관리하기 (0) | 2024.06.29 |
---|---|
도커 볼륨, 마운트, 바인드 마운트 (+명령어) (0) | 2024.06.28 |
docker 가상 네트워크 포트포워딩과 도커 DNS (+명령어) (0) | 2024.06.26 |
Vue.js, Spring Boot, PostgreSQL 컨테이너 구성 및 연결하여 애플리케이션 구현하기 (+실습) (0) | 2024.06.25 |
클라우드 네이티브 애플리케이션 (0) | 2024.06.24 |