MacVLan은 브릿지가 없습니다. 대신 서브 인터페이스라는 개념이 등장해서 사용합니다.
물리적인 NIC eth0은 존재하며 eh0
에서 여러 하위 인터페이스를 만듬으로써 여러개의 mac 주소를 가질 수 있도록 합니다.
그렇게 되면 생성된 하위 인터페이스들에 여러개의 컨테이너들이 연결되면서 VLAN을 구성할 수 있습니다.
- macvlan은 부모 인터페이스(parent)와 서브 인터페이스(slave)로 나눈다.
- 부모 인터페이스는 가상화될 주체, 즉 실제 물리적인 NIC인 eth0이 됩니다.
- 거기서 생성된 서브 인터페이스들은 mac0, mac1, mac2가 됩니다.
- macvlan으로 생성된 인터페이스는 mac0@eth0과 같이 표현합니다.
(mac0은 서브 인터페이스, eth0이 부모 인터페이스)
MacVlan을 사용하기 위해서는 Promiscuous mode
를 활성화 해야 합니다.
- LINUX에서는 하나의 NIC에 하나의 MAC 주소를 학습하도록 구성되어있습니다.
- MacVlan을 사용할 경우 서브 인터페이스 하단의 MAC을 다중으로 ARP TABLE에서 확인 가능
nasa1515@nasa:~$ ip a | grep wlp3s0 3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 inet 192.168.100.9/24 brd 192.168.100.255 scope global dynamic noprefixroute wlp3s0 nasa1515@nasa:~$ sudo ip link set wlp3s0 promisc on
nasa1515@nasa:~$ ip a | grep wlp3s0 3: wlp3s0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 inet 192.168.100.9/24 brd 192.168.100.255 scope global dynamic noprefixroute wlp3s0
부모 인터페이스 카드를 지정하여 새로운 MacVlan 네트워크를 생성합니다.
nasa1515@nasa:~$ docker network create -d macvlan --subnet=192.168.57.0/24 --gateway=192.168.57.1 --ip-range=192.168.57.0/24 -o parent=wlp3s0 macvlan1 14ae59d5fa0446094d77fe0233270d0c68643636181991f5f9c6333b0d2792df nasa1515@nasa:~$ nasa1515@nasa:~$ docker network ls NETWORK ID NAME DRIVER SCOPE c4031fa4ad4b bridge bridge local 29d9e0411d39 host host local 14ae59d5fa04 macvlan1 macvlan local ddad85781d7f nasanet bridge local 054fbf919b85 none null local
wlp3s0
을 사용해 macvlan1
을 생성한 것을 확인 할 수 있습니다.
macvlan1
을 사용하는 컨테이너 생성nasa1515@nasa:~$ docker run -itd --name mac-nasa --network macvlan1 centos:latest b63a1b3bc91faea7893991e1ed4407e23fd179d82ec8456925bd22740da21833 -------------------------------------------------------------------------------- nasa1515@nasa:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b63a1b3bc91f centos:latest "/bin/bash" 21 seconds ago Up 20 seconds mac-nasa
mac-nasa
컨테이너의 네트워크 확인nasa1515@nasa:~$ docker exec mac-nasa ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 41: eth0@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:c0:a8:39:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.57.2/24 brd 192.168.57.255 scope global eth0 valid_lft forever preferred_lft forever
mac-nasa2
라는 컨테이너를 동일하게 생성하였음nasa1515@nasa:~$ docker run -itd --name mac-nasa2 --network macvlan1 centos:latest 528f559bfdca2a7fb5ea47a259cfba69f7efdc9368e94f4ebe86ac7302b77168 nasa1515@nasa:~$ nasa1515@nasa:~$ docker exec mac-nasa2 ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 42: eth0@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:c0:a8:39:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.57.3/24 brd 192.168.57.255 scope global eth0 valid_lft forever preferred_lft forever
mac-nasa
<-> mac-nasa2
의 통신이 정상적임을 확인합니다.nasa1515@nasa:~$ docker exec mac-nasa ping -c5 192.168.57.3 PING 192.168.57.3 (192.168.57.3) 56(84) bytes of data. 64 bytes from 192.168.57.3: icmp_seq=1 ttl=64 time=0.051 ms 64 bytes from 192.168.57.3: icmp_seq=2 ttl=64 time=0.096 ms 64 bytes from 192.168.57.3: icmp_seq=3 ttl=64 time=0.089 ms 64 bytes from 192.168.57.3: icmp_seq=4 ttl=64 time=0.085 ms 64 bytes from 192.168.57.3: icmp_seq=5 ttl=64 time=0.086 ms --- 192.168.57.3 ping statistijs --- 5 packets transmitted, 5 received, 0% packet loss, time 38ms rtt min/avg/max/mdev = 0.051/0.081/0.096/0.017 ms
bridge
를 사용합니다.동일 host 상에 배포된 container는 사실 Private IP 를 이용해 통신이 가능합니다.
nasa1515@nasa:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aa342876ff52 centos:latest "/bin/bash" 25 seconds ago Up 23 seconds nasa2 32d0528aa4e4 centos:latest "/bin/bash" 27 seconds ago Up 26 seconds nasa1 nasa1515@nasa:~$ nasa1515@nasa:~$ docker inspect nasa2 | grep -i IPA "SecondaryIPAddresses": null, "IPAddress": "172.17.0.3", "IPAMConfig": null, "IPAddress": "172.17.0.3", nasa1515@nasa:~$ docker inspect nasa1 | grep -i IPA "SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAMConfig": null, "IPAddress": "172.17.0.2",
각각
172.17.0.2
,172.17.0.3
Private IP를 가지고 있습니다
nasa1515@nasa:~$ docker exec nasa1 ping -c3 172.17.0.3 PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data. 64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.134 ms 64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.105 ms 64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.089 ms --- 172.17.0.3 ping statistijs --- 3 packets transmitted, 3 received, 0% packet loss, time 43ms rtt min/avg/max/mdev = 0.089/0.109/0.134/0.020 ms
위의 실습 같이 컨테이너는 이미 서로간의 통신이 가능한데 굳이 LINK를 써야 하는 이유는 무엇일까요?
이는 컨테이너 사이의 IP 기반 연동의 문제점 때문입니다
Container 의 IP 는 유동적인 성격을 띄고 있기 때문에 언제든 변할 수 있습니다.
Container 는 일종의Process
이므로, 언제든 생성/소멸 될 수 있기에 만약 컨테이너가 중지 되었다가 시작하면, Process가 다시 새롭게 생성되는 것과 같습니다
즉, 이때 컨테이너에게 부여되는Private IP
는 변할 수 있습니다는 것입니다. 그래서 컨테이너의 연동을 위한 방법으로 IP 기반의 연동은 권고되지 않습니다. 따라서 연동으로 권고 되고 있는 방법이 바로 LINK 기능인 것입니다.