KANS) 도커 네트워크 종류
도커 네트워크 종류를 확인해보면 아래와 같다.
도커 네트워크 모드에는 bridge, host, none 세가지가 있고 네트워크 플러그인으로는 macvlan, ipvlan 등이 있다.
bridge
도커 실행 시 기본적으로 가상의 L2스위치인 bridge가 docker0이라는 이름으로 생성된다. 대역대 변경이 가능하지만 기본값은 172.17.0.0/16을 사용한다.
iptables에 의해 nat 동작하는 걸 볼 수 있고
docker0 bridge를 통해 컨테이너 외부로도 나가가는 것도 확인 가능하다.
host
호스트 환경의 네트워크 인터페이스를 사용한다. bridge mode와 다르게 컨테이너를 위한 iptables가 자동 생성되지 않고 호스트와 컨테이너가 주소, 포트가 연관된 인터페이스를 공유한다.
별도의 포트포워딩 없이 포트를 점유하게 되기 때문에 80포트를 사용하는 컨테이너를 올렸다면 다른 컨테이너나 호스트에서는 80포트를 사용 할 수 없다.
none
컨테이너 내부에 lo 인터페이스만 존재할 뿐 다른 네트워크를 사용하지 않아서 컨테이너 혹은 외부와 통신이 불가하다.
macvlan (bridge mode)
하나의 네트워크 인터페이스를 여러개의 가상 네트워크 인터페이스로 분리하여 잉용
dhcp 서버를 사용하여 고유한 mac주소가 필요한 경우 macvlan을 사용할 수 있다.
vlan을 사용하여 물리적 인터페이스에 하위인터페이스를 만드는 것처럼 보이지만 이와 같은 경우엔 하위 인터페이스 모두 동일한 맥주소를 갖게된다. macvlan의 경우 하위 인터페이스들이 각각 고유한 ip와 맥주소가 부여되고 언더레이 네트워크에 직접 노출된다.
mode에 따라서 자식 인터페이스와의 통신은 가능하시만, mode와 상관없이 부모-자식 인터페이스 간의 통신은 불가능하다. 컨테이너 -> 컨테이너: mode에 따라 가능 컨테이너 -> 호스트: 불가능
# 아이피 충돌 방지를 위해서 서브넷을 일부 미리 예약하여 생성
docker network create -d macvlan --subnet=192.168.50.0/24 --ip-range=192.168.50.192/27 -o macvlan_mode=bridge -o parent=enp0s8 my_macvlan
# 켜져있어야 자식이 부모통해 나갈 때 자식의 맥주소를 달고 나갈 수 있게 켜준다
ip link set enp0s8 promisc on
docker1 노드에 macvlan모드를 사용하는 컨테이너 생성 후 네트워크 확인
docker1 노드의 컨테이너 -> docker2
docker1 노드의 컨테이너 -> docker1 호스트
ipvlan (l2)
macvlan과 유사하지만 자식인터페이스마다 mac주소를 할당하지않고 부모 인터페이스의 mac주소를 공유하게된다. ip는 각각 할당받는다.
물리적 포트당 최대 mac주소 수를 제한하는 경우 ipvlan을 사용할 수 있다.
ipvlan 드라이버를 사용하여 네트워크 생성 후 이를 사용한 컨테이너 생성
docker1 노드의 컨테이너 -> docker2
참고