컨테이너 네트워크

11266 단어 도커도커

컨테이너 네트워크

--net 옵션으로 container를 입력하면 다른 컨테이너의 네트워크 네임스페이스 환경을 공유할 수 있다.
공유되는 속성은 냅부 IP, 네트워크 인터페이스의 MAX 주소 등이다.

container:[다른 컨테이너의ID]

네트워크 네임스페이스 환경을 공유하는 두개의 컨테이너 생성

root@red-virtual-machine:~# docker run -i -t -d --name network_container_1 ubuntu:14.04
591833e10a821927d576d4644a803e48391dcaaf2939e912cf1339874a135ed1
root@red-virtual-machine:~# docker run -i -t -d --name network_container_2 \
--net container:network_container_1 ubuntu:14.04
7df1114bf4ad0b7a537d4ebab2e79bba7fe9e05bb062b26d29a6e888c0d1738f

network_container_1을 먼저 만들고 network_container_2가 공유하도록 만들었다.

생성된 컨테이너의 네트워크 구성 확인

root@red-virtual-machine:~# docker exec network_container_1 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:3142 (3.1 KB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@red-virtual-machine:~# docker exec network_container_2 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:3142 (3.1 KB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          
네트워크 구성이 서로 같다.          

호스트의 네트워크 구성을 확인 하면 하나의 네트워크 구성이 생성 되었다.

root@red-virtual-machine:~# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:6bff:fefe:f54e  prefixlen 64  scopeid 0x20<link>
        ether 02:42:6b:fe:f5:4e  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 39  bytes 5336 (5.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.159.128  netmask 255.255.255.0  broadcast 192.168.159.255
        inet6 fe80::91dd:c79d:4366:c741  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:67:67:2d  txqueuelen 1000  (Ethernet)
        RX packets 39427  bytes 53319756 (53.3 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6834  bytes 566743 (566.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 587  bytes 52957 (52.9 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 587  bytes 52957 (52.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethe9a33e9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::44bc:71ff:feb3:d609  prefixlen 64  scopeid 0x20<link>
        ether 46:bc:71:b3:d6:09  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 31  bytes 3673 (3.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

-d 옵션을 사용하면 컨테이너에 접속하지 않기 떄문에 테스트 용으로 컨테이너를 만드는데 유용하다.

브리지 네트워크와 --net-alias

브리지 타입의 네트워크와 run 명령어의 --net-alias 옵션을 함께 쓰면 특정 호스틑 이름으로 컨테이너 여러 개에 접근할 수 있다.

브리지 생성 하여 브리지에 연결하는 3개의 컨테이너 생성
컨테이너의 네트워크 alias를 설정한다.

root@red-virtual-machine:~# docker network create --driver bridge mybridge
b5c444e1e0ccbd75ca208438ad8d80a3603b3229fa7b180ceb54be64a8adb962

root@red-virtual-machine:~# docker run -i -t -d --name network_alias_cont1 --net mybridge \
--net-alias alick106 ubuntu:14.04

root@red-virtual-machine:~# docker run -i -t -d --name network_alias_cont2 --net mybridge \
--net-alias alick106 ubuntu:14.04

root@red-virtual-machine:~# docker run -i -t -d --name network_alias_cont3 --net mybridge \
--net-alias alick106 ubuntu:14.04

각 컨테이너의 ipspec

root@red-virtual-machine:~# docker inspect network_alias_cont1  | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.2",
root@red-virtual-machine:~# docker inspect network_alias_cont2  | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.3",
root@red-virtual-machine:~# docker inspect network_alias_cont3  | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.4",

ip 주소가 같은 네트워크 대역으로 설정되며 순차적으로 ip를 할당 받았다.

네트워크 alias에 ping 호출

root@red-virtual-machine:~# docker run -i -t --name network_alias_ping --net mybridge ubuntu:14.04
ping을 날리기 위한 컨테이너 생성 

root@c57fad6c09f8:/# ping -c 1 alick106
PING alick106 (172.19.0.2) 56(84) bytes of data.
64 bytes from network_alias_cont1.mybridge (172.19.0.2): icmp_seq=1 ttl=64 time=0.103 ms
--- alick106 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.103/0.103/0.103/0.000 ms

root@c57fad6c09f8:/# ping -c 1 alick106
PING alick106 (172.19.0.4) 56(84) bytes of data.
64 bytes from network_alias_cont3.mybridge (172.19.0.4): icmp_seq=1 ttl=64 time=0.120 ms
--- alick106 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.120/0.120/0.120/0.000 ms

root@c57fad6c09f8:/# ping -c 1 alick106
PING alick106 (172.19.0.3) 56(84) bytes of data.
64 bytes from network_alias_cont2.mybridge (172.19.0.3): icmp_seq=1 ttl=64 time=0.128 ms
--- alick106 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.128/0.128/0.128/0.000 ms

응답 오는 IP가 매번 다르다.

컨테이너 3개의 IP로 각각 ping이 전송된 것을 확인할 수 있다.
라운드 로빈 방식으로 매번 IP가 달라진다.
이러한 현상이 발생하는 이유는 도커 엔진에 내장된 DNS가 alick106라는 호스트 이름을
--net-alias 옵션으로 alick106을 설정한 컨테이너로 변환(resolve)하기 때문이다.

도커의 DNS는 호스트 이름을 유동적인 컨테이너를 찾을 때 주로 사용된다.

컨테이너가 껏다 켜져서 새로운 IP가 할당 받더라도 문제 없이 특정 컨테이너를 지정 가능

가장 대표적인 예가 --link 옵션인데 이는 컨테이너의 IP가 변경돼도 별명으로 컨테이너를 차을 수 있게 DNS에 의해 자동으로 관리 된다. 단 이경우는 디폴트 브리지 네트워크의 컨테이너 DNS라는 점이 다르다.

--net-alias 옵션 또한 --link 옵션과 비슷한 원리로 작동한다.
도커는 기본 브리지 네트워크가 아닌 사용자가 정의한 브리지 네트워크에 사용되는 내장 DNS 서버를 가진다.(DNS의 IP는 127.0.0.11)

mybridge라는 이름의 네트워크에 속한 3개의 컨테이너는 run으로 생성할 때 --net-alias 옵션에 alick106이라는 값을 입력 하였고 이 컨테이너의 IP는 DNS 서버에 alick106이라는 호스트 이름으로 등록된다.

mybridge 네트워크에 속한 컨테이너에서 alick106이라는 호스트 이름으로 접근하면 DNS 서버는 라운드 로빈 방식을 이용해 컨테이너의 IP 리스트를 반환한다.
ping 명령어는 IP 리스트에서 첫 번째 IP를 사용하므로 매번 다른 IP로 ping을 전송한다.

> dig alick106
alick106 600 IN A 172.18.0.5
alick106 600 IN A 172.18.0.3
alick106 600 IN A 172.18.0.4

MacVALN 네트워크

MacVLAN은 호스트의 네트워크 인터페이스 카드를 가상화해 물리 네트워크 환경을 컨테이너에게 동일하게 제공한다.
MacVLAN을 사용하면 컨테이너는 물리 네트워크상에서 가상의 MAC 주소를 가지며, 해당 네트워크에 연결된 다른 장치와의 통신이 가능해진다.
MacVLAN에 연결된 컨테이너는 기본적으로 할당되는 IP 대역인 172.17.X.X 대신 네트워크 장비의 IP를 할당받기 떄문이다.

MacVLAN 네트워크를 사용하는 컨테이너는 기본적으로 호스트와 통신이 불가능하다.

컨테이너 A는 서버 2와는 통신할 수 있지만, 서버 1과는 통신할 수 없다.

MacVLAN을 사용하려면 적어도 1개의 네트워크 장비와 서버가 필요하다.

공유기의 네트워크 정보 : 192.168.0.0/24
서버 1 (node01) : 192.168.0.50
서버 2 (node02) : 192.168.0.51

MacVLAN 생성

root@node01:~ # docker network create -d macvlan --subnet --subnet=192.168.0./24\
--ip-range=192.168.0.64/28 --gateway=192.168.0.1\
-o macvlan_mode=bridge -o parent=eht0 my_macvlan

root@node02:~ # docker network create -d macvlan --subnet --subnet=192.168.0./24\
--ip-range=192.168.0.128/28 --gateway=192.168.0.1\
-o macvlan_mode=bridge -o parent=eht0 my_macvlan


-d(--dirver) : 네트워크 드라이버로 macvlan을 사용, 
--subnet : 컨테이너가 사용할 네트워크 정보를 입력, 여기서는 네트워크 장비의 IP 대역 기본 설정을 그대로 따른다.

--ip-range : MacVLAN을 생성하는 호스트에서 사용할 컨테이너의 IP 범위를 입력, 
node01과 node02의 IP 범위가 겹쳐 동일한 IP의 컨테이너가 각각 생성된다면 
컨테이너 네트워크가 정상적으로 동작하지 않을 수 있으므로 반드시 겹치지 않게 설정해야 한다.

--gateway : 네트워크에 설정된 게이트웨이를 입력. 여기서는 네트워크 장비의 기본 설정을 그대로 따른다.

-o : 네트워크의 추가적인 옵션을 설정. 
위 예시에서는 macvaln_mode=bridge 값을 통해 MAcVLAN을 bridge 모드로, 
parent=eth0 값을 통해 MacVLAN으로 생성될 컨테이너 네트워크 인터페이이스의 
부모(parent) 인터페이스를 eth0으로 지정한다.
eth0은 공유기에 랜선으로 연결되어 192.168.0/24 대역의 IP를 할당받은 네트워크 인터페이스다.

MacVLAN 네트워크를 사용하는 컨테이너 생성

root@node01:~ # docker run -it --name c1 --hostname c1 --network my_macvlan ubuntu:14.04
root@node02:~ # docker run -it --name c2 --hostname c2 --network my_macvlan ubuntu:14.04

생성된 2 컨테이너끼리 통신(ping)이 가능하다

좋은 웹페이지 즐겨찾기