컨테이너 네트워크
컨테이너 네트워크
--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)이 가능하다
Author And Source
이 문제에 관하여(컨테이너 네트워크), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mohadang/컨테이너-네트워크저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)