![[Docker] Docker 네트워크의 이해 : Port Forwarding, MacVlan, 컨테이너 통신](/static/a6077092f212ca1295ebbc3864bc6b25/c7304/portforwarding.png)
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.3Private 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 기능인 것입니다.