-
Docker (5) - 도커 네트워크Infra/Docker 2024. 1. 25. 15:46
1. 네트워크 기본
- 네트워크는 기계와 기계사이를 물리적 케이블로 연결
- 집과 도로의 관계 집과 집사이를 도로를 통해 연결하듯 기계들이 인터넷 선으로 연결
- 네트워크는 ip주소로 장치의 주소를 관리한다. (공인 ip와 사설 ip로 나뉜다)
- 하나의 공인ip는 다시 내부의 사설 ip로 나뉜다. 이와 같이 ip주소를 나누기 위해선
네트워크 장비가 필요하다. (라우터,공유기 등)
- 공유기기를 보면, WAN포트가 공인 ip가 들어오는 곳이고, 나머지 LAN은 사설 ip를 구성하는 포트이다.
- 각 장비는 네트워크 인터페이스를 가지고 있다. 네트워크 인터페이스는 인터넷에 연결하기 위해 컴퓨터에 장착하는 부품 중 하나이다. (NIC,LAN카드)
- 네트워크 인터페이스는 ip를 가질 수 있다. 네트워크 인터페이스가 ip를 할당받고 연결되기 위해선 유선 LAN선 혹은 무선 WIFI와 같이 네트워크 워크 장비와 연결되어 있어야한다.
2. 포트포워딩과 NAT
- 네트워크 통신은 아웃바운드와 인바운드로 나눌 수 있다.
- 아웃바운드는 내 서버(내가 클라이언트임)에서 출발한 요청으로, 요청을 보내고 다시 응답을 받는 흐름이다.
- 인바운드는 다른 서버 혹은 클라이언트에서 출발한 흐름으로, 외부에서 요청이 들어오면 응답을 보내야한다.
2.1 NAT
- 보통 아웃바운드에서 발생한다.
- NAT테이블은 사설 ip를 공인 ip로 변환하는 기술을 의미하며, 공인포트번호를 통해 사설 ip를 구분한다.
예시)
-> 사설망 내의 특정 기기가 외부로 요청을 보낸다 (사설 ip 10.0.0.1) -> 사설 ip로는 외부 네트워크와 통신할 수 없다.
-> 공인 ip로 변환해야한다. (150.150.0.1)
-> 이때 1개의 공인 ip에는 여러 사설 ip가 연결되어 있음으로, 이를 구분할 포트번호를 붙인다 (70001)
-> 10.0.0.1:6000 -> 150.150.0.1:70001로 변환되어 외부로 요청이 나감
-> 다시 150.150.0.1:70001로 응답이 오고 NAT를 통해 사설 ip로 변환된다.
- NAT에서 공인 포트 번호는 랜덤하게 관리한다. (필요시 고정포트를 사용해라)
2.2 포트포워딩
- 포트포워딩은 인바운드 상황에서 자주 발생한다.
- 외부에서 공인 ip로 보낸 요청을 사설 ip와 포트로 연결해주는 것이다.
- NAT는 특별히 설정해주지 않아도 가능하지만, 포트포워딩은 어떤 사설 ip의 포트를 개방할 것인지 직접 설정해야한다.
3. DNS
- DNS서버는 ip주소를 도메인명으로 바꿔주는 역할을 수행한다.
- 외부 DNS서버와 사설 DNS서버로 나눌 수 있다.
- 외부 DNS서버는 공공 전화번호부, 사설 DNS서버는 회사 내 사설 연랑막이라고 생각해보자
- 즉, 사설 DNS는 특정 사설 네트워크 내부에서만 사용하는 도메인 명을 엮어둔 테이블이다.
- 외부 DNS서버는 온라인 상에서 서로 연동되고 업데이트된다.
- 사설 DNS 서버는 내부의 등록된 정보만 받아서 사용하도록 할 수도 있고, 외부 DNS서버와 연동할 수도 있다.
4. 도커 네트워크
- 사설 ip내에 다시 사설 네트워크를 구성하는 방식으로
- 도커를 실행하면 도커는 가상의 네트워크인 브릿지 네트워크와 가상의 도커 공유기 (도커제로)를 만들어낸다.
- 가상의 네트워크 도커제로를 도커에선 브릿지라고 부른다.
- 브릿지는 가상의 ip주소 하나 할당 받는다. (게이트 웨이는 172.17.0.1번)
- 브릿지는 컨테이너에 사설 ip를 부여한다.
- 이와 같이 가상의 논리적 네트워크 구성을 SDN이라한다.
-> 컨테이너간 통신 : 브릿지를 통해 LAN에서 통신과 유사하다
외부 네트워크로 나가는 것이 아니라, 사설 네트워크 안 통신이다.
특별한 제약사항이 크게 없다.
-> 외부 네트워크 간 통신 : 공인ip <-> NAT/포트포워딩 <-> 사설ip <-> NAT/포트포워딩 <-> 도커네트워크 필요
* 도커는 여러 브릿지 네트워크를 만들 수 있다. (하나의 브릿지가 하나의 사설 네트워크라고 생각하면 좋다)
- 물리적 인터페이스에 LAN 연결하 듯 pc에 도커를 설치 실행하면 -> 도커는 가상의 네트워크 인터페이스 생성
- 가상의 네트워크 인터페이스는 host os 위에서 생성됨 (도커제로와 같은 브릿지에 먼저 생김)
- 이제 컨테이너를 실행할 때 마다 Veth라는 접두어의 가상 네트워크 인터페이스 만들어진다.
- 이제 host os에서 veth의 인터페이스로 신호를 보내면, 해당 인터페이스와 연결된 컨테이너로 신호가 들어간다.
- 이런 과정에서 내부적으로 iptables가 사용됨
>iptables: host os의 소프트웨어이다. 가상 네트워크간 통신을 어케해야하는 적혀있는 테이블
Docker가 컨테이너 추가시마다 iptables 규칙을 수정하여 Veth인터페이스의 트래픽 제어한다.
* 같은 브릿지 네트워크 내에서는 별도의 설정 없이 통신 가능하다
4.1 도커 네트워크 생성
- 도커 생성시 기본 브릿지 네트워크 하나 있다.
docker network create --driver birdge --subnet 10.0.0.0/24 --gatway 10.0.0.1 second-bridge
- 위와 같은 명령어로 네트워크를 생성할 수 있다. (seconde-bridge라는 이름의 네트워크)
- 이때 subnet은 /24는 앞에 8비트씩 3개는 네트워크 주소를 가리키는 숫자고, 나머지 8비트 한개가 네트워크에
엔드포인트(컴퓨터 수) 갯수라는걸 표현한 식이다.
- 컨테이너는 일단 같은 브릿지 혹은 host 사이에서 응답 및 요청이 자유롭고, 브릿지가 다른 컨테이너간 통신은
그리 자유롭지 않다! (아마 host를 한번 거쳐서 통신해야할 듯!)
- HOST OS:GUEST OS간 포트포워딩은 아래와 같다
docker run -p HosOS의 포트: 컨테이너의 포트 //hostOS로의 네트워크 접근을 컨테이너로 포트포워딩
* 포트 포워딩시 주의점은 컨테이너 내부 어플리케이션이 사용하지 않는 포트 지정시 애플리케이션이 작동하지 않는다.
ex) 톰캣서버 8080으로 사용하기로하고, 배포파일 만든 후에 컨테이너 포트포워딩을 8001로 설정하면 작동 안한다.
4.2 도커 네트워크의DNS
- 기본 bridge 외에 네트워크를 새로운 네트워크를 조성해야 내부 DNS를 사용할 수 있다.
- 도메인 명은 컨테이너 이름으로 자동 저장된다. 따라서 같은 네트워크 간 컨테이너 사이에 통신은 기본적으로
컨테이너 이름으로 통신 가능하다. (외부 DNS와도 이미 연동되어 있다)
5. 도커 네트워크 드라이버 종류
1. 브릿지 네트워크 : 도커 브릿지를 활용해 컨테이너간 통신. NAT 및 포트포워딩 기술을 활용해 외부 통신 지원
2. 호스트 네트워크 : 호스트의 네트워크를 공유, 모든 컨테이너는 호스트 머신과 동일한 IP 사용, 포트 중복 불가능
3. 오버레이 네트워크: 쿠버네티스에서 사용, 호스트 머신이 다수일 때 네트워크 관리 기술
4. Macvaln 네트워크: 컨테이너에 MAC주소를 할당하여 물리 네트워크 인터페이스에 직접 연결
참고자료:
'Infra > Docker' 카테고리의 다른 글
Docker (6) - 도커 볼륨 (0) 2024.01.25 Docker (3) - 이미지 빌드 (0) 2024.01.24 Docker(4) - 레지스트리 (0) 2024.01.24 Docker (2) - 이미지와 컨테이너 (0) 2024.01.24 Docker (1) - 가상화 기술 (0) 2024.01.24