Docker Deepdive #3 - 도커 네트워크
INFRA DEEPDIVE 시리즈 목차
- Infra Deepdive #0 - 스터디를 시작하며
- Docker Deepdive #1 - 컨테이너 표준: OCI와 CRI
- Docker Deepdive #2 - 컨테이너 이미지 레이어
- Docker Deepdive #3 - 도커 네트워크
- Kubernetes Deepdive #1 - 쿠버네티스 컴포넌트 분석 (미작성)
- Kubernetes Deepdive #2 - 쿠버네티스 네트워크 (미작성)
- Kubernetes Deepdive #3 - 쿠버네티스 오퍼레이터 (미작성)
가상머신과 컨테이너의 네트워크 구조의 본질적 차이
가상머신의 네트워크 레이어 구조
가상 머신은 User 영역 내에 가상의 Kernel 영역을 생성하고, 물리 커널 영역을 하드웨어 영역으로 인식한다. 가상 머신은 가상 네트워크 어댑터를 통해 외부와 통신하기에 가상 머신 별로 서로 다른 MAC 번호(이더넷 카드 번호)를 부여한다. VMnet0은 가상 머신들 간의 통신을 이어주고, 물리 이더넷 카드와 연결하는 브릿지 역할을 한다. 가상 Kernel 영역의 오버헤드가 크다는 이유로, 도커가 등장하게 되었다.
도커의 네트워크 레이어 구조
도커는 각 컨테이너들이 유저 영역에서 어플리케이션으로 동작하고, 커널 영역을 공유한다. 유저 영역 안에서 가상의 커널이 한 번 더 동작하는 비효율적인 구조를 개선하는 효과가 있다.
도커가 지원하는 컨테이너 네트워크 드라이버
도커는 다양한 네트워크 관리 방법을 제공하고 있고, 선택하는 모드에 따라 가상 네트워크 구성 방식이 달라진다.
기본값: docker0
도커를 설치하고 ifconfig 등의 명령어를 통해 호스트의 네트워크 인터페이스를 열어보면 docker0라는 Virtual Interface가 생성된 것을 확인할 수 있다. docker0는 도커의 디폴트 브릿지로, 컨테이너를 아무 옵션 없이 생성하면 docker0에 포함된다.
같은 브릿지 네트워크 내에 존재하는 컨테이너들은 같은 CIDR 대역의 IP를 할당 받기 때문에 단일 네트워크 내에서 통신하는 것과 동일하게 동작이 가능하다.
veth란?
컨테이너를 실행하면, 호스트에 veth가 바인딩되는 것을 볼 수 있다. veth(virtual ethernet) 인터페이스는 가상의 네트워크 인터페이스다. veth 인터페이스는 쌍으로 연결된다. 도커는 컨테이너를 실행하면 자동으로 컨테이너에 veth를 바인딩한다.
네트워크 드라이브의 종류
- 브릿지(Bridge) - 기본 네트워크 드라이버
- 호스트(Host) - 컨테이너와 Docker 호스트 간의 네트워크 격리를 제거함
- 논(None) - 컨테이너를 호스트 및 다른 컨테이너로부터 완전히 격리
- 오버레이(Overlay) - 여러 호스트가 존재할 때, 여러 호스트의 컨테이너 간의 네트워크를 연결
브릿지 네트워크 드라이버
- 브릿지 네트워크는 일종의 도커 내부에 가상의 사설 네트워크를 하나 만드는 개념
- 기본 값으로 docker0이라는 이름의 브릿지 네트워크를 사용
- 브릿지 네트워크는 동일한 도커 데몬 호스트 환경에서만 적용 가능 (단일 머신에서만 동작한다는 의미)
docker network create -d brdige mybridge
도커 네트워크 브릿지 생성
docker run -d --net mybridge --name db redis
docker run -d --net mybridge -e DB=db -p 8000:5000 --name web chrch/web
도커 컨테이너를 생성할 때 위에서 생성한 네트워크 브릿지를 설정
사용자 정의 브릿지와 기본 브릿지(docker0)의 차이점
- 기본 브릿지 네트워크 상의 컨테이너들은 IP주소를 통해서만 통신이 가능하다.
- 사용자 정의 브릿지 네트워크상에서는 컨테이너의 이름만으로 인식할 수 있다. (DNS Resolution 기능이 적용된다는 의미)
- 기본 브릿지는 모든 컨테이너가 연결될 수 있다. 이는 격리 관점에서 좋지 않을 수 있다. 사용자 정의 브릿지를 사용하면 격리 수준을 높일 수 있다.
오버레이 네트워크 드라이버
- overlay 네트워크 드라이버는 다중 호스트 범위의 드라이버 (머신 여러대에서 동작한다는 의미)
- 여러 머신에서 동작하는만큼, 단일 도커에서 사용하는 모드는 아님
- 도커스웜과 쿠버네티스가 기본적으로 이 네트워크 모드로 동작함
MACVLAN 드라이버
- 각 컨테이너들을 외부IP를 사용해 외부 네트워크와 직결시킴
- 브릿지가 없는 형태
- 서브 인터페이스라는 개념을 도입함
- eth0에 여러 개의 하위 인터페이스를 만들어 동시에 여러 개의 맥 주소를 갖도록 함
- 서브 인터페이스에 여러개의 컨테이너들을 연결시켜 VLAN을 구성함
- MACVLAN은 부모 인터페이스와 서브 인터페이스로 나뉨
- 부모 인터페이스: eth0
- 서브 인터페이스: mac0, mac1, mac2
참고자료
- 도커(Docker) 딥 다이브 #1
- 컨테이너와 Docker(3) 도커네트워크
- Understanding Docker Networking Drviers and their use cases
- https://code-machina.github.io/2019/08/09/Docker
- https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=alice_k106&logNo=220984112963
- https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=alice_k106&logNo=220984112963
- 만자의 개발일지